一.插入數據(增加)insert
1.插入數據(順序插入)
語法一: INSERT INTO 表名(字段1,字段2,字段3…字段n) VALUES(值1,值2,值3…值n); #指定字段來插入數據,插入的值要和你前面的字段相匹配 語法二: INSERT INTO 表名 VALUES (值1,值2,值3…值n); #不指定字段的話,就按照默認的幾個字段來插入數據
2.指定字段插入數據
語法: INSERT INTO 表名(字段1,字段2,字段3…) VALUES (值1,值2,值3…);
3.插入多條記錄
語法:#插入多條記錄用逗號來分隔 INSERT INTO 表名 VALUES (值1,值2,值3…值n), (值1,值2,值3…值n), (值1,值2,值3…值n);
4.插入查詢結果
語法: INSERT INTO 表名(字段1,字段2,字段3…字段n) SELECT (字段1,字段2,字段3…字段n) FROM 表2 WHERE …; #將從表2里面查詢出來的結果來插入到我們的表中,但是注意查詢出來的數據要和我們前面指定的字段要對應好
二.更新(修改)數據update
語法: UPDATE 表名 SET 字段1=值1, #注意語法,可以同時來修改多個值,用逗號分隔 字段2=值2, WHERE CONDITION; #更改哪些數據,通過where條件來定位到符合條件的數據 示例: UPDATE mysql.user SET password=password(‘123’) where user=’root’ and host=’localhost’; #這句話是對myslq這個庫中的user表中的user字段為'root'並且host字段為'localhost'的這條記錄的password字段的數據進行修改,將passord字段的那個數據改為password('123')這個方法對123加工后的密碼數據,password()這個方法是mysql提供的密碼進行加密用的方法。 定位到某個記錄,並把這個記錄中的某項內容更改掉
三.刪除數據delete,truncate
在MySQL中有兩種方法可以刪除數據,一種是DELETE語句,另一種是TRUNCATE TABLE語句。DELETE語句可以通過WHERE
對要刪除的記錄進行選擇。而使用TRUNCATE TABLE將刪除表中的所有記錄。因此,DELETE語句更靈活。
1.delete
語法: DELETE FROM 表名 WHERE CONITION; #刪除符合條件的一些記錄 DELETE FROM 表名;如果不加where條件,意思是將表里面所有的內容都刪掉,但是清空所有的內容,一般我們用truncate ,能夠將id置為零,delete不能將id置零,再插入數據的時候,會按照之前的數據記錄的id數繼續遞增 示例: DELETE FROM mysql.user WHERE password=’123’;
2.truncate
TRUNCATE TABLE 表名 # truncate table tb1;
delete 和truncate 的區別
效率方面:drop > truncate > delete
1、delete語句,是DML語句不會自動提交,truncate語句通常被認為是DDL語句能被自動提交。
2、delete語句,后面可以跟where子句,通常指定where子句中的條件表達式,只刪除滿足條件的部分記錄,而truncate語句,只
能用於刪除表中的所有記錄。
3、truncate語句,刪除表中的數據后,向表中添加記錄時,自動增加字段的默認初始值重新從1開始,而使用delete語句,刪除表
中所有記錄后,向表中添加記錄時,自動增加字段的值,為刪除時該字段的最大值加1,也就是在原來的基礎上遞增。
4、delete語句,每刪除一條記錄,都會在日志中記錄,而使用truncate語句,不會在日志中記錄刪除的內容,因此,truncate語句的
執行效率比delete語句高。
5.truncate刪除表中的所有行數據,但表結構不變.新行的計數值會歸零,(比如在約束了auto_increment時)如果想保留delete
四.查詢數據 select (單表查詢)
1.單表查詢的語法,關鍵字
查詢數據的本質:
mysql會到你本地的硬盤上找到對應的文件,然后打開文件,按照你的查詢條件來找出你需要的數據。下面是完整的一個單表查詢的語法
select * from,這個select * 指的是要查詢所有字段的數據。 SELECT distinct 字段1,字段2... FROM 庫名.表名 #from后面是說從庫的某個表中去找數據,mysql會去找到這個庫對應的文件夾下去找到你表名對應的那個數據文件,找不到就直接報錯了,找到了就繼續后面的操作 WHERE 條件 #從表中找符合條件的數據記錄,where后面跟的是你的查詢條件 GROUP BY field(字段) #分組 HAVING 篩選 #過濾,過濾之后執行select后面的字段篩選,就是說我要確定一下需要哪個字段的數據,你查詢的字段數據進行去重,然后在進行下面的操作 ORDER BY field(字段) #將結果按照后面的字段進行排序 LIMIT 限制條數 #將最后的結果加一個限制條數,就是說我要過濾或者說限制查詢出來的數據記錄的條數
2. 關鍵字執行的優先級
From 1.找到表:from Where 2.拿着where指定的約束條件,去文件/表中取出一條條記錄 group by 3.將取出的一條條記錄進行分組group by,如果沒有group by,則整體作為一組 having 4.將分組的結果進行having過濾 select 5.執行select distinct 6.去重 order by 7.將結果按條件排序:order by limit 8.限制結果的顯示條數

SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number>

(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) HAVING <having_condition> (9) ORDER BY <order_by_condition> (10) LIMIT <limit_number>
3.查詢操作
- 簡單查詢:
# 查詢 select 值 from 表名; select * from 表名; # 查詢表中所有數據
- 避免重復:
#避免重復 select distinct 字段名 from 表名; # 去重復 distinct要寫在所有查詢字段的前面
distinct:將查詢的結果進行去重
有時需要查詢出某個字段不重復的記錄,這時可以使用mysql提供的distinct這個關鍵字來過濾重復的記錄,但是實際中我們往往用distinct來返回不重復字段的條數(count(distinct id)),其原因是distinct只能返回他的目標字段,而無法返回其他字段,distinct 想寫在其他字段后面需要配合聚合函數來寫。 mysql> select id,count(distinct post) from employee; ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 報錯了:是因為distinct不能返回其他的字段,只能返回目標字段 mysql> select count(distinct post) from employee; +----------------------+ | count(distinct post) | +----------------------+ | 4 | +----------------------+ 1 row in set (0.00 sec)
- 四則運算查詢:
#四則運算查詢 select name,age * 12 from tb1;
- 自定義顯示格式concat():
select concat('游客編號:',customer_id,'編號:',order_id) from table2;
select concat('游客編號:',customer_id,'編號:',order_id) as 自定義顯示字段 from table2;
結果如下:
4.where約束
where語句中可以使用: 1. 比較運算符:> < >= <= <> != 2. between 80 and 100 值在80到100之間 3. in(80,90,100) 值是80或90或100 4. like '王%' 可以是%或_ %表示任意多字符 _表示一個字符 5. 邏輯運算符:在多個條件直接可以使用邏輯運算符 and or not
5.分組查詢group by
1.分組發生在where之后,即分組是基於where之后得到的記錄而進行的
2.分組指的是:將所有記錄按照某個相同字段進行歸類,比如針對員工信息表的職位分組,或者按照性別進行分組等
ONLY_FULL_GROUP_BY
這是mysql中對於group by的一種設置模式,對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中
所以對於設置了這個模式的時候,使用group by 時,要在group by 后加入所查詢的字段.
比如: select name from table1 group by id,name 根據性別分組要查詢名字時要加上 name
不過,如果我們用設置了unique約束的字段作為分組的依據,則每一條記錄自成一組,這種分組沒有意義多條記錄之間的某個字段值相同,該字段通常用來作為分組的依據
#查看MySQL 5.7默認的sql_mode如下: mysql> select @@global.sql_mode; ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION #!!! 注意 !!! ONLY_FULL_GROUP_BY的語義就是確定select target list中的所有列的值都是明確語義,簡單的說來,在ONLY_FULL_GROUP_BY模式下, target list中的值要么是來自於聚集函數的結果,要么是來自於group by list中的表達式的值。 #設置sql_mole如下操作(我們可以去掉ONLY_FULL_GROUP_BY模式): mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
6.HAVING過濾
加在 group by 后面
having 與 where 的不同:
having的語法格式和where是一模一樣的,只不過having是在分組之后進行的進一步的過濾,where不能使用聚合函數,having是可以使用聚合函數的 !!!執行優先級從高到低:where > group by > having 1. Where 發生在分組group by之前,因而Where中可以有任意字段,但是絕對不能使用聚合函數。 2. Having發生在分組group by之后,因而Having中可以使用分組的字段,無法直接取到其他字段,having是可以使用聚合函數
7.查詢排序:ORDER BY
按單列排序 SELECT * FROM employee ORDER BY salary; #默認是升序排列 SELECT * FROM employee ORDER BY salary ASC; #升序 SELECT * FROM employee ORDER BY salary DESC; #降序
8.限制查詢的記錄數:LIMIT
示例: #取出工資表中工資最高的前三位 SELECT * FROM employee ORDER BY salary DESC LIMIT 3; #默認初始位置為0,從第一條開始順序取出三條 SELECT * FROM employee ORDER BY salary DESC LIMIT 0,5; #從第0開始,即先查詢出第一條,然后包含這一條在內往后查5條 SELECT * FROM employee ORDER BY salary DESC LIMIT 5,5; #從第5開始,即先查詢出第6條,然后包含這一條在內往后查5條
數據表中數據量很大的時候,可以用limit來進行分頁顯示
select * from employee limit 0,5; # 顯示第0項開始的5行數據
9.使用正則表達式查詢
正則表達式是通用的
#之前我們用like做模糊匹配,只有%和_,局限性比較強,所以我們說一個正則 SELECT * FROM employee WHERE name REGEXP '^wwe'; # 以wwe開頭的字符串 SELECT * FROM employee WHERE name REGEXP 'on$'; # 以on結尾的字符串 SELECT * FROM employee WHERE name REGEXP 'm{2}'; # m出現兩次