技術交流QQ群:1027579432,歡迎你的加入!
歡迎關注我的微信公眾號:CurryCoder的程序人生
1.登錄mysql數據庫: mysql -u root -p 輸入密碼
2.登出mysql數據庫: \q
3.關系型數據庫管理系統(RDBMS)來存儲和管理的大數據量。所謂的關系型數據庫,是建立在關系模型基礎上的數據庫,借助于集合代數等數學概念和方法來處理數據庫中的數據。
-
4.RDBMS 即關系數據庫管理系統(Relational Database Management System)的特點:
- 數據以表格的形式出現
- 每行是各種記錄名稱
- 每列是記錄名稱所對應的數據域
- 許多的行和列組成一張表單
- 若干的表單組成database
-
5.相關基本概念
- 數據庫: 數據庫是一些關聯表的集合
- 數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格
- 列: 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據
- 行:一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據
- 冗余:存儲兩倍數據,冗余降低了性能,但提高了數據的安全性
- 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據
- 外鍵:外鍵用于關聯兩個表
- 復合鍵:復合鍵(組合鍵)將多個列作為一個索引鍵,一般用于復合索引
- 索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。,類似于書籍的目錄
- 參照完整性: 參照的完整性要求關系中不允許引用不存在的實體。與實體完整性是關系模型必須滿足的完整性約束條件,目的是保證數據的一致性。
-
6.MySQL 為關系型數據庫(Relational Database Management System), 這種所謂的"關系型"可以理解為"表格"的概念, 一個關系型數據庫由一個或數個表格組成, 如圖所示的一個表格:
數據表.png- 表頭(header): 每一列的名稱;
- 列(col): 具有相同數據類型的數據的集合;
- 行(row): 每一行用來描述某條記錄的具體信息;
- 值(value): 行的具體信息, 每個值必須與該列的數據類型相同;
- 鍵(key): 鍵的值在當前列中具有唯一性。
7.啟動mysql數據庫:
net start mysql
- 8.列出 MySQL 數據庫管理系統的數據庫列表:
show databases;
- 9.選擇要操作的mysql數據庫,使用該指令后所有的mysql命令都只針對該數據庫:
user 數據庫名;
- 10.列出已經選中的某個mysql數據庫中的所有的數據表:
show tables;
- 11.顯示數據表的屬性,屬性類型,主鍵信息 ,是否為 NULL,默認值等其他信息:
show columns from 數據表名;
- 12.顯示數據表的詳細索引信息,包括PRIMARY KEY(主鍵):
show index from 數據表名;
- 13.輸出Mysql數據庫管理系統的性能及統計信息:
show table status from 數據庫名; // 顯示某個數據庫中的所有表的信息
show table status from 數據庫名 like 'runob%'; // 表名以runob開頭的表的信息
show table status from 數據庫名 like 'runob%'\G; // 加上\G,查詢結果按列打印
- 14.創建數據庫:
create database 數據庫名;
- 15.刪除數據庫:
drop database 數據庫名;
16.MySQL中的數據類型
-
MySQL支持多種類型,大致可以分為三類:數值、日期/時間和字符串(字符)類型。
-
數值類型
-
MySQL支持所有標準SQL數值數據類型,這些類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。BIT數據類型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
基本整數類型.png
-
-
日期和時間類型
-
表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。每個時間類型有一個有效值范圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。TIMESTAMP類型有專有的自動更新特性,將在后面描述。
日期時間類型.png
-
-
字符串類型
- 字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。該節描述了這些類型如何工作以及如何在查詢中使用這些類型。CHAR 和 VARCHAR 類型類似,但它們保存和檢索的方式不同。它們的最大長度和是否尾部空格被保留等方面也不同。在存儲或檢索過程中不進行大小寫轉換。
- BINARY 和 VARBINARY 類似于 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串。也就是說,它們包含字節字符串而不是字符字符串。這說明它們沒有字符集,并且排序和比較基于列值字節的數值值。
- BLOB 是一個二進制大對象,可以容納可變數量的數據。有 4 種 BLOB 類型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它們區別在于可容納存儲范圍不同。
-
有 4 種 TEXT 類型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。對應的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據實際情況選擇。
字符串類型.png
-
17.創建數據表
-
創建MySQL數據表需要下面的信息:
- 表名
- 表字段名
- 定義每個表字段
-
創建表的語法如下:
create table [if not exists] 表名( 字段名稱 數據類型, ... 字段名稱 數據類型 )[表選項] 表選項包括:字符集設定charset/character set、校對集設定collate具體字符集、engine具體存儲引擎 create table demo_table( demo_id int not null auto_increment, demo_title varchar(100) not null, demo_author varchar(40) not null, demo_date date, primary key(demo_id) // 注意此處不要加,sho )engine=InnoDB default charset=utf8;
18.刪除數據表
-
語法格式: drop table 數據表名;
drop table demo_table;
19.刪除表內數據
-
語法格式: delete from 表名 where 刪除條件;
// 刪除學生表內姓名是張三的記錄 delete from student where name="張三";
20.清除表內數據,但是表的結構不變,用truncate
-
語法格式: truncate table 表名;
truncate table student; // 刪除student表中的數據,但是保留數據表的結構
當不再需要某個表的時候,用drop
當仍然要保留該表時,但要刪除所有記錄時,用truncate
當要刪除部分記錄時,用delete
21.插入數據
-
語法格式如下:
insert into 表名 (字段1,字段2, 字段3,...字段n) values ("學習python", "菜鳥教程", now()); // 實例 insert into demo_table (demo_id, demo_title, demo_auto, date) values (1, "player1", "庫里", "1989-3-14");
-
當所有列都要添加數據時,可以使用下面的語法:
insert into 數據表名 values (0, "playe2", "哈登", "1991-3-7-2");
-
同時插入多條數據時,使用下面的方法:
insert into 數據表名 (字段1, 字段2, ..., 字段n) values (1, "player1", "庫里", "1989-3-14") (2, "playe2", "哈登", "1991-3-7-2")
-
讀取數據表:
select from demo_table;
- 22.查詢數據
- 語法格式:
select 字段名1, 字段名2, ...,字段名n from 數據表名 [where clause] [limit n] [offset m];
- select *:返回所有記錄
- limit n:返回n條記錄
- offset m:跳過m條記錄,默認m=0,單獨使用不起作用
- limit n,m:相當于limit m offset n:從第n條記錄開始,返回m條記錄
- MySQL中的簡單查詢語句總結:
select * from 表名; /* 查詢表所有數據 */ select 字段名 from 表名; /* 查詢表字段數據 */ select * from 表名 where 字段名 = "字段所對應的值"; /* 查詢表字段下條件數據 */ select * from 表名 where 字段名 like "需要匹配的字符%需要匹配的字符"; /* 模糊查詢表下數據 */ select * from 表名 where id between "1" and "5"; /* 查詢表下字段范圍數據 */ select * from 表名 where name in ("字段1所對應的值", "字段2所對應的值"); /* 查詢表字段下固定條件數據 */ select distinct 字段名 from 表名; /* 查詢去重值 */ select * from 表名 where 字段1 = "字段1所對應的值" and 字段2 > "字段2所對應的值"; /*查詢表下范圍條件數據*/ select * from 表名 where 字段1 = "字段1所對應的值" or 字段1 = "字段1所對應的值" ; /* 查詢表下條件不同值 */ select * from 表名 order by 字段名; /* 查詢表下條件不同值 */ select * from 表名 order by 字段名 desc; /* 查詢表下值排序結果 */ select * from 表名 limit 2; /* 查詢表下范圍數據 */ select 字段名 as zzz from 表名; /*別名查詢表下數據*/
- 關聯查詢語法:
select 字段 from 表1 left join 表2 on 條件(一般是表1和表2之間的關聯條件); // 左關聯:left join on 左邊的表為主表 select 字段 from 表1 right join 表2 on 條件(一般是表1和表2之間的關聯條件); // 右關聯:right join on 右邊的表為主表
- 23.where子句
- 有條件地從表中選取數據,可將where子句添加到select語句中,語法格式如下:
select 字段1, 字段2, ..., 字段N from 表1, 表2, ... [where 條件1 [and [or]] 條件2 .....
操作符.png- 查詢語句中你可以使用一個或者多個表,表之間使用逗號分割,并使用where語句來設定查詢條件
- 可以在where子句中指定任何條件
- 可以使用and或者or指定一個或多個條件
- where子句也可以運用于sql的detele或者update命令
- where子句類似于程序語言中的if條件,根據MySQL表中的字段值來讀取指定的數據
-
在MySQL數據表中讀取指定的數據,where子句是非常有用的,使用主鍵來作為where子句的條件查詢是非常快速的,如果給定的條件在表中沒有任何匹配的記錄,那么查詢不會返回任何數據
where條件查詢.png - MySQL的where子句的字符串比較是不區分大小寫的。 你可以使用binary關鍵字來設定where子句的字符串比較是區分大小寫的!
select * from demo_table where binary demo_author = "Curry"; select * from demo_table where binary demo_author = "curry";
- 24.update查詢
- 需要修改或更新MySQL中的數據,可以使用update命令來操作,語法格式如下:
update 表名 set 字段1 = 新的值, 字段2 = 新的值 [where 從句];
update查詢語句.png - update語句作用:
- 可以同時更新一個或多個字段
- 可以在where子句中指定任何條件
- 可以在一個單獨表中同時更新數據
- update替換某個字段中的某個字符,語句如下:
update 表名 set 字段1 = replace(字段1, "舊的字符串", "新的字符串") [where 從句];
update替換某個字段中的某個字符.png - 25.delete語句
- 使用delete from命令來刪除MySQL數據表中的記錄,語法如下:
delete from 表名 [where 從句];
- 說明:
- 如果沒有指定where從句,mysql表中的所有記錄都會被刪除
- 可以在where從句中指定任何條件
- 可以在單個表中一次性刪除記錄
- delete、truncate、drop三者的區:
- delete和truncate僅僅是刪除表中的數據,表的結構還是會保留;drop是連表的數據和表結構一起刪除。
- delete是DML語句,操作完后如果不想提交事務還可以回滾;truncate和drop是DDL語句,操作完成后馬上生效,不能回滾。
-
執行速度上,drop>truncate>delete
刪除前.png
刪除后.png
- 26.like子句
- 經過上面的那些SQL語句可以知道,使用select來讀取數據,同時可以在select語句中使用where從句來獲取指定的記錄。where從句中可以使用等號=來設定獲取數據的條件,如"demo_autho"="庫里"。但是有時候需要獲取demo_date字段中含有"19"字符的所有記錄,這時候需要在where從句中使用SQL語句中的like子句。SQL like子句中使用%來表示任意字符,類似于UNIX或正則表達式中的*,如果沒有使用%,like子句與=的效果是一樣的。
- like子句的語法如下:
select * from 表名 where 需要匹配的字段 like "要匹配的字符%要匹配的字符";
- like匹配/模糊匹配,會與%和_結合使用:
- '%a' // 以a結尾的數據
- 'a%' // 以a開頭的數據
- '%a%' // 含有a的數據
- '_a_' // 三位且中間字母是a的
- '_a' // 兩位且結尾字母是a的
-
'a_' // 兩位且開頭字母是a的
like子句.png
- 27.union操作符----用于連接兩個以上的select語句的結果組合到一個結果集合中。多個select語句會刪除重復的數據。
- union語句:用于將不同表中相同列中查詢的數據展示出來;(不包括重復數據)
- union all語句:用于將不同表中相同列中查詢的數據展示出來;(包括重復數據)
- 使用形式如下:
select 字段1 from 表名 union select 字段1 from 表名 order by 字段1; select 字段1 from 表名 union all select 字段1 from 表名 order by 字段1;
- 28.order語句
- 需要對讀取的數據進行排序,可以使用MySQL的order by子句來設定你想按哪個字段哪種方式來進行排序,再返回搜索結果。
- 語法格式:
select 字段1, 字段2, ..., 字段n from 表1, 表2, ... order by 字段1, 字段2, ..., 字段n ASC(默認)/DESC;
- 29.group by子句
- group by語句根據一個或多個列對結果集進行分組,在分組的列上可以使用count,sum,avg等函數。
- 語法格式:
select 字段名, function(字段名) from 表名 where 字段名 operator 字段對應的值 group by 字段名;
-
千萬注意字段名被``來包裹,不是''這個單引號!!!
創建表.png
插入數據.png
查表.png
group by.png -
with rollup可以實現分組統計數據基礎上再進行相同的統計(sum avg count)
with rollup.png - 30.join語句的使用
- 使用MySQL中的join語句在兩個或多個表中查詢數據,可以在select update delete語句中使用MySQL的join來聯合多表查詢,join按照功能可以分三大類:
- inner join(內連接/等值連接):獲取兩個表中字段匹配關系的記錄
- left join(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄
-
right jon(右連接):獲取右表所有記錄,即使左表沒有對應匹配的記錄
創建表1.png
創建表2.png
插入數據1.png
插入數據2.png
查詢表1.png
查詢表2.png
-
使用inner join來連接上面的兩張表,讀取runoob_tbl中所有的runoob_author字段在tcount_tbl表之后對應的runoob_count字段值:
inner join表示.png
inner join.png -
left join會讀取左表中的全部數據,即使右邊表中無對應的數據,下面的實例中runoob_tbl是左表,tcount_tbl是右表
left jon表示.png
left join.png -
right join會讀取右表中的全部數據,即使左邊表中無對應的數據,下面的實例中runoob_tbl是左表,tcount_tbl是右表
right join表示.png
right join.png - 31.NULL值的處理
- MySQL使用select命令及where子句來讀取數據表中的數據,但是當提供的查詢條件字段為NULL時,該命令可能就無法正常工作。為了處理這種情況,MySQL提供了三大運算符:
- IS NULL:當列的值是NULL,此運算符返回true
- IS NOT NULL:當列的值不為NULL, 運算符返回true
-
<=>:比較操作符(不同于=運算符),當比較的的兩個值為NULL時返回true
創建表.png
插入數據.png
查詢數據.png
-
= 和 != 運算符是不起作用的
不起作用.png -
查找數據表中runoob_test_tbl列是否為NULL,必須使用is null和is not null
is null.png
is not null.png - 32.MySQL中的正則表達式
-
前面我們使用MySQL中的like ...%語句進行模糊匹配,MySQL中同樣支持正則表達式的匹配,MySQL中使用regexp操作符來進行正則表達式匹配,下面是正則模式可應用于regexp操作符中。
reg exp操作符.png - 實例1:查找name字段中以'st'為開頭的所有數據
select name from 表名 where name regexp '^st';
- 實例2:查找name字段中以'ok'為結尾的所有數據
select name from 表名 where name regexp 'ok$';
- 實例3:查找name字段中包含'mar'字符串的所有數據
select name from 表名 where name regexp 'mar';
- 實例4:查找name字段中以元音字符開頭或以'ok'字符串結尾的所有數據
select name from 表名 where name regexp '^[aeiou]|ok$';
- 33.MySQL中的事務
- MySQL事務主要用于處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你既需要刪除人員的基本資料,又要刪除和該人員相關的信息,如信箱,文章等等。這樣,這些數據庫操作語句就構成一個事務!
- 在MySQL中只有使用了Innodb數據庫引擎的數據庫或表才支持事務
- 事務處理可以用來維護數據庫的完整性,保證成批的SQL語句要么全部執行,要么全部不執行。
- 事務用來管理 insert,update,delete語句
- 一般來說,事務是必須滿足4個條件(ACID): 原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
- 原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
- 一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
- 隔離性:數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
- 持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
- 注意:在MySQL命令行的默認設置下,事務都是自動提交的,即執行SQL語句后就會馬上執行COMMIT操作。因此要顯式地開啟一個事務務須使用命令BEGIN或START TRANSACTION,或者執行命令SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。
- 事務控制語句:
- BEGIN 或 START TRANSACTION 顯式地開啟一個事務;
- COMMIT也可以使用COMMIT WORK,二者是等價的。COMMIT會提交事務,并使已對數據庫進行的所有修改成為永久性的;
- ROLLBACK也可以使用ROLLBACK WORK,二者是等價的。回滾會結束用戶的事務,并撤銷正在進行的所有未提交的修改;
- SAVEPOINT identifier,SAVEPOINT允許在事務中創建一個保存點,一個事務中可以有多個SAVEPOINT;
- RELEASE SAVEPOINT identifier刪除一個事務的保存點,當沒有指定的保存點時,執行該語句會拋出一個異常;
- ROLLBACK TO identifier 把事務回滾到標記點;
- SET TRANSACTION 用來設置事務的隔離級別。InnoDB 存儲引擎提供事務的隔離級別有READ U NCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
-
MySQL事務處理主要有兩種方法:
- 1.用BEGIN, ROLLBACK, COMMIT來實現
- BEGIN 開始一個事務
- ROLLBACK 事務回滾
- COMMIT 事務確認
- 2.直接用SET來改變MySQL的自動提交模式
- SET AUTOCOMMIT=0 禁止自動提交
- SET AUTOCOMMIT=1 開啟自動提交
- 1.用BEGIN, ROLLBACK, COMMIT來實現
-
事務實戰如下:
創建表.png
查詢表.png
開始事務.png
插入數據.png
提交事務.png
事務提交后—查詢表.png
回滾操作.png - 34.MySQL中的alter命令
-
當我們需要修改數據表名或者修改數據表字段時,就需要使用到MySQL alter命令。
創建表.png
查詢字段.png - 刪除、添加或修改表中字段
-
使用alter命令及drop子句來刪除上面的表的i字段,如果數據表中只剩余一個字段則無法使用drop來刪除字段:
刪除字段.png -
使用add子句來向表中增加字段,下面是添加字段i,并定義數據類型,執行下面命令后,i字段會自動添加到數據表字段的末尾。
添加字段.png -
指定新增字段的位置,可以使用MySQL提供的關鍵字first(設定位第一列),after 字段名(設定于某個字段之后)。
指定位置增加字段.png
指定位置增加字段1.png
-
- 修改字段類型和名稱:如果需要修改字段類型及名稱, 你可以在alter命令中使用modify或change子句
-
使用change子句, 語法有很大的不同。在change關鍵字之后,緊跟著的是你要修改的字段名,然后指定新字段名及類型。嘗試如下實例:
修改字段類型和名稱.png -
把字段c的類型從char(1)改為char(10),使用下面的命令:
改變字段類型.png
-
-
修改字段默認值
修改字段默認值.png
刪除默認值.png -
修改數據表的類型
修改數據表類型.png -
修改表名
修改表名字.png - 修改存儲引擎
alter table 表名 engine=myisam;
- 刪除外鍵約束
alter table 表名 drop foreign key 外鍵名;
- 35.MySQL中的索引
- MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
- 索引的分類:
- 單列索引:即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。
- 組合索引:即一個索引包含多個列。
- 創建索引時,你需要確保該索引是應用在SQL查詢語句的條件(一般作為WHERE子句的條件)。實際上,索引也是一張表,該表保存了主鍵與索引字段,并指向實體表的記錄。
- 索引的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。建立索引會占用磁盤空間的索引文件。
- 普通索引
- 創建索引
create index 索引名 on 表名 (列名);
- 添加索引(修改表結構)
alter table 表名 add index 索引名(列名);
- 刪除索引
drop index 索引名 on 表名;
- 顯示索引信息
show index from 表名;\G
- 創建索引
- 唯一索引
- 創建索引
create unique index 索引名 on 表名(列名);
- 添加索引
alter table 表名 add unique 索引名(列名);
- 創建索引