mysql語法歸檔,初學者mysql必學知識
目錄
1.基礎語法
建立user表,基本表結構如下
1.insert
基本語法結構
insert into [table]([column...]) values([values....]);
插入一條資料:
insert into user(id,name,password,phone,email,creater,createTime) values(null,"張三","123456","123465781","[email protected]",1,"2020-12-01");
注:因為id為自動遞增,所以第一個值為null即可
如果全部插入,可以不寫列名,如下:
insert into user values(null,"李四","111111","123465782","[email protected]",1,"2020-12-04");
2.update
基本語法結構
update [table] set column = 更新值 ... [where Clause(條件)]
修改一條資料
update user set name="張二" where id= 7;
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-K0NKUplb-1609752482133)(C:\Users\Y\AppData\Roaming\Typora\typora-user-images\image-20210104164303717.png)]
張三的名字被修改為張二
如果不加where條件則全部修改
3.delete
基本語法結構
delete from [table] [where Clause(條件)]
刪除一條資料
delete from user where id=8;
id為8的資料被刪除了
如果不加where則刪除全部
4.select
因為查詢一般是sql中用的最多和最複雜的,所以我放在了最後
為了方便測試查詢,我添加了age和sex兩個欄位
現在先初始化幾條資料
基本結構
select [column...] from [table]
基本查詢
-
查詢所有
select * from user;
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 1 | 張三 | 123456 | 20 | 男 | 123465781 | [email protected] | 1 | 2020-12-01 00:00:00 | | 2 | 李四 | 111111 | 19 | 女 | 123465782 | [email protected] | 1 | 2020-12-04 00:00:00 | | 3 | 王五 | 123321 | 22 | 男 | NULL | [email protected] | 1 | 2020-12-03 00:00:00 | | 4 | 趙六 | 000000 | 25 | 女 | 123465784 | [email protected] | 1 | 2020-12-09 00:00:00 | | 5 | 田七 | 456123 | 18 | 女 | 123465785 | [email protected] | 1 | 2020-12-05 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 5 rows in set (0.09 sec)
-
查詢指定列
select id,name,phone from user
+----+------+-----------+ | id | name | phone | +----+------+-----------+ | 1 | 張三 | 123465781 | | 2 | 李四 | 123465782 | | 3 | 王五 | NULL | | 4 | 趙六 | 123465784 | | 5 | 田七 | 123465785 | +----+------+-----------+ 5 rows in set (0.07 sec)
條件查詢(where)
-
查詢性別為男的使用者
select * from user where sex = '男';
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 1 | 張三 | 123456 | 20 | 男 | 123465781 | [email protected] | 1 | 2020-12-01 00:00:00 | | 3 | 王五 | 123321 | 22 | 男 | NULL | [email protected] | 1 | 2020-12-03 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 2 rows in set (0.12 sec)
-
查詢年齡大於20的使用者
select * from user where age > 20
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 3 | 王五 | 123321 | 22 | 男 | NULL | [email protected] | 1 | 2020-12-03 00:00:00 | | 4 | 趙六 | 000000 | 25 | 女 | 123465784 | [email protected] | 1 | 2020-12-09 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 2 rows in set (0.11 sec)
-
查詢電話號碼含有123的使用者
select * from user where phone like '%123%'
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 1 | 張三 | 123456 | 20 | 男 | 123465781 | [email protected] | 1 | 2020-12-01 00:00:00 | | 2 | 李四 | 111111 | 19 | 女 | 123465782 | [email protected] | 1 | 2020-12-04 00:00:00 | | 4 | 趙六 | 000000 | 25 | 女 | 123465784 | [email protected] | 1 | 2020-12-09 00:00:00 | | 5 | 田七 | 456123 | 18 | 女 | 123465785 | [email protected] | 1 | 2020-12-05 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 4 rows in set (0.09 sec)
%為萬用字元,表示123只要前後這一串字元中含有123就能匹配
如果為’123%’,則123456能匹配,2123456則不能匹配
同理’%123’,則456123能匹配,123456則不能匹配
-
查詢性別為女且年齡大於20的使用者
select * from user where sex = '女' and age > 20;
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 4 | 趙六 | 000000 | 25 | 女 | 123465784 | [email protected] | 1 | 2020-12-09 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 1 row in set (0.10 sec)
-
查詢性別為男或者年齡小於20的使用者
select * from user where sex = '男' or age < 20;
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 1 | 張三 | 123456 | 20 | 男 | 123465781 | [email protected] | 1 | 2020-12-01 00:00:00 | | 2 | 李四 | 111111 | 19 | 女 | 123465782 | [email protected] | 1 | 2020-12-04 00:00:00 | | 3 | 王五 | 123321 | 22 | 男 | NULL | [email protected] | 1 | 2020-12-03 00:00:00 | | 5 | 田七 | 456123 | 18 | 女 | 123465785 | [email protected] | 1 | 2020-12-05 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 4 rows in set (0.10 sec)
-
查詢手機號碼為空的使用者
select * from user where phone is null;
+----+------+----------+-----+-----+-------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-------+----------------+---------+---------------------+ | 3 | 王五 | 123321 | 22 | 男 | NULL | [email protected] | 1 | 2020-12-03 00:00:00 | +----+------+----------+-----+-----+-------+----------------+---------+---------------------+ 1 row in set (0.09 sec)
如果查詢條件不為空則為is not null
排序(order by)
-
按照建立時間升序排序
select * from user order by createTime;
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 1 | 張三 | 123456 | 20 | 男 | 123465781 | [email protected] | 1 | 2020-12-01 00:00:00 | | 3 | 王五 | 123321 | 22 | 男 | NULL | [email protected] | 1 | 2020-12-03 00:00:00 | | 2 | 李四 | 111111 | 19 | 女 | 123465782 | [email protected] | 1 | 2020-12-04 00:00:00 | | 5 | 田七 | 456123 | 18 | 女 | 123465785 | [email protected] | 1 | 2020-12-05 00:00:00 | | 4 | 趙六 | 000000 | 25 | 女 | 123465784 | [email protected] | 1 | 2020-12-09 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 5 rows in set (0.09 sec)
預設升序
-
按照建立時間降序排序
desc關鍵字代表降序
select * from user order by createTime desc;
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 4 | 趙六 | 000000 | 25 | 女 | 123465784 | [email protected] | 1 | 2020-12-09 00:00:00 | | 5 | 田七 | 456123 | 18 | 女 | 123465785 | [email protected] | 1 | 2020-12-05 00:00:00 | | 2 | 李四 | 111111 | 19 | 女 | 123465782 | [email protected] | 1 | 2020-12-04 00:00:00 | | 3 | 王五 | 123321 | 22 | 男 | NULL | [email protected] | 1 | 2020-12-03 00:00:00 | | 1 | 張三 | 123456 | 20 | 男 | 123465781 | [email protected] | 1 | 2020-12-01 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 5 rows in set (0.10 sec)
-
按照性別排序,性別內建立時間降序
select * from user order by sex,createTime desc;
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 3 | 王五 | 123321 | 22 | 男 | NULL | [email protected] | 1 | 2020-12-03 00:00:00 | | 1 | 張三 | 123456 | 20 | 男 | 123465781 | [email protected] | 1 | 2020-12-01 00:00:00 | | 4 | 趙六 | 000000 | 25 | 女 | 123465784 | [email protected] | 1 | 2020-12-09 00:00:00 | | 5 | 田七 | 456123 | 18 | 女 | 123465785 | [email protected] | 1 | 2020-12-05 00:00:00 | | 2 | 李四 | 111111 | 19 | 女 | 123465782 | [email protected] | 1 | 2020-12-04 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 5 rows in set (0.10 sec)
分頁(limit)
-
查詢建立時間離現在最近的三個使用者
select * from user order by createTime desc limit 3;
select * from user order by createTime desc limit 0,3;
結果一樣
+----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | id | name | password | age | sex | phone | email | creater | createTime | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ | 4 | 趙六 | 000000 | 25 | 女 | 123465784 | [email protected] | 1 | 2020-12-09 00:00:00 | | 5 | 田七 | 456123 | 18 | 女 | 123465785 | [email protected] | 1 | 2020-12-05 00:00:00 | | 2 | 李四 | 111111 | 19 | 女 | 123465782 | [email protected] | 1 | 2020-12-04 00:00:00 | +----+------+----------+-----+-----+-----------+----------------+---------+---------------------+ 3 rows in set (0.07 sec)
limit [開始頁數] [記錄數];
limit 0,3,第一頁,顯示3條;
limit 3,預設第一頁,顯示三條;
分組(group by)
-
統計女生個數
select count(*),sex from user group by sex;
+----------+-----+ | count(*) | sex | +----------+-----+ | 2 | 男 | | 3 | 女 | +----------+-----+ 2 rows in set (0.06 sec)
-
統計男女平均年齡
select avg(age),sex from user group by sex;
+----------+-----+ | avg(age) | sex | +----------+-----+ | 21.0000 | 男 | | 20.6667 | 女 | +----------+-----+ 2 rows in set (0.07 sec)
注:分組 group by的欄位必須是查序列有的,聚合函式除外;
-
統計男女平均年齡,並找出平均年齡為21的
select avg(age) age,sex from user group by sex having age=21;
+---------+-----+ | age | sex | +---------+-----+ | 21.0000 | 男 | +---------+-----+ 1 row in set (0.07 sec)
gaving為group by之後的條件查詢
注,group by是根據前面的查詢結果後分組的,也就是先select 再group by
2.函式集合
1.常用字串函式
-
CHAR_LENGTH()
返回字串的字元數
SELECT CHAR_LENGTH("沒殼的小蝸牛");
+-----------------------------+ | CHAR_LENGTH("沒殼的小蝸牛") | +-----------------------------+ | 6 | +-----------------------------+ 1 row in set (0.06 sec)
-
CONCAT()
字串拼接,引數(s1,s2,…sn)
SELECT CONCAT("沒","殼","的","小","蝸","牛");
+---------------------------------------+ | CONCAT("沒","殼","的","小","蝸","牛") | +---------------------------------------+ | 沒殼的小蝸牛 | +---------------------------------------+ 1 row in set (0.04 sec)
-
LCASE() 和 LOWER()
轉成小寫,兩者功能一樣
SELECT LCASE('NSSNAIL'); SELECT LOWER('NSSNAIL');
+------------------+ | LCASE('NSSNAIL') | +------------------+ | nssnail | +------------------+ 1 row in set (0.05 sec) ---------------------------------------- +------------------+ | LOWER('NSSNAIL') | +------------------+ | nssnail | +------------------+ 1 row in set (0.04 sec)
-
UCASE() 和 UPPER()
轉成大寫,兩者功能一樣
SELECT UCASE('nssnail'); SELECT UPPER('nssnail');
+------------------+ | UCASE('nssnail') | +------------------+ | NSSNAIL | +------------------+ 1 row in set (0.05 sec) ---------------------------------------- +------------------+ | UPPER('nssnail') | +------------------+ | NSSNAIL | +------------------+ 1 row in set (0.07 sec)
-
LEFT()
引數(s,n)
返回字串 s 的前 n 個字元
SELECT LEFT('nssnail',2);
+-------------------+ | LEFT('nssnail',2) | +-------------------+ | ns | +-------------------+ 1 row in set (0.03 sec)
-
RIGHT()
引數(s,n)
返回字串 s 的後 n 個字元
SELECT LEFT('nssnail',2);
+--------------------+ | RIGHT('nssnail',2) | +--------------------+ | il | +--------------------+ 1 row in set (0.03 sec)
-
SUBSTRING()
引數(s, start, length)
從字串 s 的 start 位置擷取長度為 length 的子字串
SELECT SUBSTRING('nssnail',2,5);
+--------------------------+ | SUBSTRING('nssnail',2,5) | +--------------------------+ | ssnai | +--------------------------+ 1 row in set (0.04 sec)
-
TRIM()
去掉字串開始和結尾處的空格
SELECT TRIM(' nssnail ');
+-------------------------+ | TRIM(' nssnail ') | +-------------------------+ | nssnail | +-------------------------+ 1 row in set (0.05 sec)
-
POSITION()
引數(s1 IN s)
從字串 s 中獲取 s1 的開始位置
SELECT POSITION('s' in 'nssnail');
+----------------------------+ | POSITION('s' in 'nssnail') | +----------------------------+ | 2 | +----------------------------+ 1 row in set (0.04 sec)
-
REVERSE()
反轉字串
SELECT REVERSE('nssnail');
+--------------------+ | REVERSE('nssnail') | +--------------------+ | lianssn | +--------------------+ 1 row in set (0.04 sec)
2.常用數字函式
注:聚合函式一般搭配group使用
emp(員工表)
-
AVG()
聚合函式
作用:計算平均數
計算每個部門工資平均數
注:dept_id為部門Id,還有一張部門表,現在還沒寫到聯表查詢,暫不給出,null值為董事長
select dept_id,avg(sal) avg from emp group by dept_id;
+---------+-----------+ | dept_id | avg | +---------+-----------+ | NULL | 5000.0000 | | 10 | 1966.6667 | | 20 | 2143.7500 | | 30 | 1750.0000 | +---------+-----------+ 4 rows in set (0.06 sec)
-
SUM()
聚合函式
作用:求和
計算每個部門工資總和
select dept_id,sum(sal) sum from emp group by dept_id;
+---------+-------+ | dept_id | sum | +---------+-------+ | NULL | 5000 | | 10 | 11800 | | 20 | 8575 | | 30 | 5250 | +---------+-------+ 4 rows in set (0.04 sec)
-
COUNT()
聚合函式
作用:計算總數
計算每個部門的總人數
select dept_id,count(sal) count from emp group by dept_id;
+---------+-------+ | dept_id | count | +---------+-------+ | NULL | 1 | | 10 | 6 | | 20 | 4 | | 30 | 3 | +---------+-------+ 4 rows in set (0.06 sec)
-
MAX()
聚合函式
最大值
查詢每個部門工資最多是多少
select dept_id,max(sal) max from emp group by dept_id;
+---------+------+ | dept_id | max | +---------+------+ | NULL | 5000 | | 10 | 3450 | | 20 | 3675 | | 30 | 3000 | +---------+------+ 4 rows in set (0.07 sec)
-
MIN()
聚合函式
最小值
計算每個部門工資最少是多少
select dept_id,min(sal) min from emp group by dept_id;
+---------+------+ | dept_id | min | +---------+------+ | NULL | 5000 | | 10 | 1250 | | 20 | 800 | | 30 | 950 | +---------+------+ 4 rows in set (0.07 sec)
-
GREATEST()
引數(expr1, expr2, expr3, …)
返回列表中的最大值
SELECT GREATEST(3, 12, 34, 8, 25);
+----------------------------+ | GREATEST(3, 12, 34, 8, 25) | +----------------------------+ | 34 | +----------------------------+ 1 row in set (0.04 sec)
-
LEAST()
返回列表中的最小值
SELECT LEAST(3, 12, 34, 8, 25);
+-------------------------+ | LEAST(3, 12, 34, 8, 25) | +-------------------------+ | 3 | +-------------------------+ 1 row in set (0.03 sec)
3.常用日期函式
-
CURDATE()
返回當前日期
SELECT CURDATE();
+------------+ | CURDATE() | +------------+ | 2021-01-07 | +------------+ 1 row in set (0.05 sec)
-
CURTIME()
返回當前時間
SELECT CURTIME();
+-----------+ | CURTIME() | +-----------+ | 09:48:45 | +-----------+ 1 row in set (0.05 sec)
-
DATE()
從日期或日期時間表達式中提取日期值
有可能會有人問道為什麼查出來跟裡面的DATE函式裡的字串一樣,為什麼不直接用字串表示,因為此時的結果是個日期函式,在日常查詢中日期可以日期對比或者和其他日期函式使用,而字串則不行
SELECT DATE("2021-01-07");
+--------------------+
| DATE("2021-01-07") |
+--------------------+
| 2021-01-07 |
+--------------------+
1 row in set (0.06 sec)
-
DATEDIFF()
計算日期 d1->d2 之間相隔的天數
SELECT DATEDIFF('2020-11-01','2021-1-07');
+------------------------------------+ | DATEDIFF('2020-11-01','2021-1-07') | +------------------------------------+ | -67 | +------------------------------------+ 1 row in set (0.03 sec)
此時為負數,倒過來寫則為正數
-
DATE_FORMAT()
引數(d,f)
按表示式 f的要求顯示日期 d
SELECT DATE_FORMAT('2021-01-07 9:09:09','%Y/%m/%d');
+----------------------------------------------+ | DATE_FORMAT('2021-01-07 9:09:09','%Y/%m/%d') | +----------------------------------------------+ | 2021/01/07 | +----------------------------------------------+ 1 row in set (0.03 sec)
-
DAY()
返回日期值的日期部分
SELECT DAY("2021-01-07");
+-------------------+ | DAY("2021-01-07") | +-------------------+ | 7 | +-------------------+ 1 row in set (0.04 sec)
-
WEEK()
計算日期是本年的第幾個星期,範圍是 0 到 53
SELECT WEEK('2021-01-07');
+--------------------+ | WEEK('2021-01-07') | +--------------------+ | 1 | +--------------------+ 1 row in set (0.04 sec)
-
MONTH()
返回日期中的月份值,1 到 12
SELECT MONTH('2021-06-07');
+---------------------+ | MONTH('2021-06-07') | +---------------------+ | 6 | +---------------------+ 1 row in set (0.05 sec)
-
YEAR()
返回年份
SELECT YEAR('2021-01-07');
+--------------------+ | YEAR('2021-01-07') | +--------------------+ | 2021 | +--------------------+ 1 row in set (0.07 sec)
-
DAYNAME()
返回日期是星期幾,如 Monday,Tuesday
SELECT DAYNAME('2021-01-07');
+-----------------------+ | DAYNAME('2021-01-07') | +-----------------------+ | Thursday | +-----------------------+ 1 row in set (0.07 sec)
-
DAYOFWEEK()
日期 d 今天是星期幾,1 星期日,2 星期一,以此類推
SELECT DAYOFWEEK('2021-01-07');
+-------------------------+ | DAYOFWEEK('2021-01-07') | +-------------------------+ | 5 | +-------------------------+ 1 row in set (0.07 sec)
-
DAYOFMONTH()
計算日期是本月的第幾天
SELECT DAYOFMONTH('2021-01-07');
+--------------------------+ | DAYOFMONTH('2021-01-07') | +--------------------------+ | 7 | +--------------------------+ 1 row in set (0.07 sec)
-
LAST_DAY()
返回給給定日期的那一月份的最後一天
SELECT LAST_DAY("2021-01-07");
+------------------------+ | LAST_DAY("2021-01-07") | +------------------------+ | 2021-01-31 | +------------------------+ 1 row in set (0.08 sec)
如果需要最後一天的天數則可以這樣
SELECT DAY(LAST_DAY("2021-01-07"));
+-----------------------------+ | DAY(LAST_DAY("2021-01-07")) | +-----------------------------+ | 31 | +-----------------------------+ 1 row in set (0.07 sec)
-
NOW()
返回當前日期和時間
SELECT NOW();
+---------------------+ | NOW() | +---------------------+ | 2021-01-07 10:12:45 | +---------------------+ 1 row in set (0.08 sec)
-
STR_TO_DATE()
引數(string, format_mask)
將字串轉變為日期
SELECT STR_TO_DATE("January 07 2021", "%M %d %Y");
+--------------------------------------------+ | STR_TO_DATE("January 07 2021", "%M %d %Y") | +--------------------------------------------+ | 2021-01-07 | +--------------------------------------------+ 1 row in set (0.08 sec)
4.其他常用函式
-
CAST()
轉換資料型別
示例:字串轉int
SELECT CAST("100" AS int);
+--------------------+ | CAST("100" AS int) | +--------------------+ | 100 | +--------------------+ 1 row in set (0.08 sec)
-
IF()
引數(expr,v1,v2)
如果表示式 expr 成立,返回結果 v1;否則,返回結果 v2。
SELECT IF(1 > 0,'正確','錯誤');
+-------------------------+ | IF(1 > 0,'正確','錯誤') | +-------------------------+ | 正確 | +-------------------------+ 1 row in set (0.12 sec)
-
IFNULL()
引數(v1,v2)
如果 v1 的值不為 NULL,則返回 v1,否則返回 v2。
SELECT IFNULL(null,'空值');
+---------------------+ | IFNULL(null,'空值') | +---------------------+ | 空值 | +---------------------+ 1 row in set (0.09 sec)
-
ISNULL()
判斷表示式是否為 NULL,空返回1,非空則返回0
SELECT ISNULL(NULL);
+--------------+ | ISNULL(NULL) | +--------------+ | 1 | +--------------+ 1 row in set (0.07 sec)
SELECT ISNULL('');
+------------+ | ISNULL('') | +------------+ | 0 | +------------+ 1 row in set (0.08 sec)
注:空字串不是null
5.常用JSON函式
-
JSON_EXTRACT()
解析json
select JSON_EXTRACT('{"Total":"123","ECRate":"0.2"}','$.Total');
+----------------------------------------------------------+ | JSON_EXTRACT('{"Total":"123","ECRate":"0.2"}','$.Total') | +----------------------------------------------------------+ | "123" | +----------------------------------------------------------+ 1 row in set (0.0 sec)
解析陣列
select JSON_EXTRACT('[{"Total":"123","ECRate":"0.2"}]','$[0].Total');
+---------------------------------------------------------------+ | JSON_EXTRACT('[{"Total":"123","ECRate":"0.2"}]','$[0].Total') | +---------------------------------------------------------------+ | "123" | +---------------------------------------------------------------+ 1 row in set (0.05 sec)
-
JSON_KEYS()
獲取json的key
select JSON_KEYS('{"Total":"123","ECRate":"0.2"}');
+---------------------------------------------+ | JSON_KEYS('{"Total":"123","ECRate":"0.2"}') | +---------------------------------------------+ | ["Total", "ECRate"] | +---------------------------------------------+ 1 row in set (0.03 sec)
-
JSON_QUOTE()
將字串作為json值引用,方法是用雙引號字元包裝字串,並轉義內部引號和其他字元,然後將結果以
utf8bm4
字串返回SELECT JSON_QUOTE('[1,2,3]');
+-----------------------+ | JSON_QUOTE('[1,2,3]') | +-----------------------+ | "[1,2,3]" | +-----------------------+ 1 row in set (0.04 sec)
-
JSON_UNQUOTE()
去掉json解析後的引號,如JSON_EXTRACT()帶有引號,我們不需要可以這樣
select JSON_UNQUOTE(JSON_EXTRACT('{"Total":"123","ECRate":"0.2"}','$.Total'));
+------------------------------------------------------------------------+ | JSON_UNQUOTE(JSON_EXTRACT('{"Total":"123","ECRate":"0.2"}','$.Total')) | +------------------------------------------------------------------------+ | 123 | +------------------------------------------------------------------------+ 1 row in set (0.04 sec)
3.聯表查詢
- 部門表
-
員工表
1.左連線(left join)
select dept.*,emp.* from dept left join emp on dept.id=emp.dept_id;
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
| id | name | loc | id | name | job | topid | hdate | sal | bonus | dept_id |
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
| 10 | 開發部 | 北京 | 1003 | 李四 | java開發工程師 | 1011 | 1991-02-20 | 1900 | 300 | 10 |
| 10 | 開發部 | 北京 | 1005 | 王五 | java開發工程師 | 1011 | 1991-02-22 | 2450 | 600 | 10 |
| 10 | 開發部 | 北京 | 1009 | 田七 | java開發工程師 | 1011 | 1991-09-28 | 1250 | 1400 | 10 |
| 10 | 開發部 | 北京 | 1011 | 陳紅 | 經理 | 1017 | 1991-05-01 | 3450 | 400 | 10 |
| 10 | 開發部 | 北京 | 1013 | 陳梓鑫 | 前端開發工程師 | 1011 | 1991-06-09 | 1250 | 800 | 10 |
| 10 | 開發部 | 北京 | 1019 | 劉國 | 前端開發工程師 | 1011 | 1991-09-08 | 1500 | 500 | 10 |
| 20 | 產品服務部 | 上海 | 1001 | 張三 | 需求分析師 | 1007 | 1990-12-17 | 800 | 500 | 20 |
| 20 | 產品服務部 | 上海 | 1007 | 趙六 | 經理 | 1017 | 1991-04-02 | 3675 | 700 | 20 |
| 20 | 產品服務部 | 上海 | 1015 | 程成 | 專案助理 | 1007 | 1997-04-19 | 3000 | 1000 | 20 |
| 20 | 產品服務部 | 上海 | 1021 | 秦問天 | 需求分析師 | 1007 | 1997-05-23 | 1100 | 1000 | 20 |
| 30 | 財務部 | 廣州 | 1023 | 趙家豪 | 經理 | 1017 | 1991-12-03 | 950 | NULL | 30 |
| 30 | 財務部 | 廣州 | 1025 | 長青 | 財務 | 1023 | 1991-12-03 | 3000 | 600 | 30 |
| 30 | 財務部 | 廣州 | 1027 | 葉少雲 | 財務 | 1023 | 1992-01-23 | 1300 | 400 | 30 |
| 40 | 技術專家組 | 深圳 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
14 rows in set (0.11 sec)
聯查dept表和emp表
語法 [table1] left join [table2] on [條件]
如果on條件不成立則table1的資料能查出,table2的資料為null
如上資料中的技術專家組,
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
| id | name | loc | id | name | job | topid | hdate | sal | bonus | dept_id |
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
| 40 | 技術專家組 | 深圳 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
emp表中沒有dept_id為40的,則將dept表的id,name,loc查出,emp表資料為null
2.右連線
select dept.*,emp.* from emp right join dept on dept.id=emp.dept_id;
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
| id | name | loc | id | name | job | topid | hdate | sal | bonus | dept_id |
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
| 10 | 開發部 | 北京 | 1003 | 李四 | java開發工程師 | 1011 | 1991-02-20 | 1900 | 300 | 10 |
| 10 | 開發部 | 北京 | 1005 | 王五 | java開發工程師 | 1011 | 1991-02-22 | 2450 | 600 | 10 |
| 10 | 開發部 | 北京 | 1009 | 田七 | java開發工程師 | 1011 | 1991-09-28 | 1250 | 1400 | 10 |
| 10 | 開發部 | 北京 | 1011 | 陳紅 | 經理 | 1017 | 1991-05-01 | 3450 | 400 | 10 |
| 10 | 開發部 | 北京 | 1013 | 陳梓鑫 | 前端開發工程師 | 1011 | 1991-06-09 | 1250 | 800 | 10 |
| 10 | 開發部 | 北京 | 1019 | 劉國 | 前端開發工程師 | 1011 | 1991-09-08 | 1500 | 500 | 10 |
| 20 | 產品服務部 | 上海 | 1001 | 張三 | 需求分析師 | 1007 | 1990-12-17 | 800 | 500 | 20 |
| 20 | 產品服務部 | 上海 | 1007 | 趙六 | 經理 | 1017 | 1991-04-02 | 3675 | 700 | 20 |
| 20 | 產品服務部 | 上海 | 1015 | 程成 | 專案助理 | 1007 | 1997-04-19 | 3000 | 1000 | 20 |
| 20 | 產品服務部 | 上海 | 1021 | 秦問天 | 需求分析師 | 1007 | 1997-05-23 | 1100 | 1000 | 20 |
| 30 | 財務部 | 廣州 | 1023 | 趙家豪 | 經理 | 1017 | 1991-12-03 | 950 | NULL | 30 |
| 30 | 財務部 | 廣州 | 1025 | 長青 | 財務 | 1023 | 1991-12-03 | 3000 | 600 | 30 |
| 30 | 財務部 | 廣州 | 1027 | 葉少雲 | 財務 | 1023 | 1992-01-23 | 1300 | 400 | 30 |
| 40 | 技術專家組 | 深圳 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
14 rows in set (0.12 sec)
聯查dept表和emp表
語法 [table1] right join [table2] on [條件]
如果on條件不成立則table2的資料能查出,table1的資料為null
與left join相反的作用,如上查詢,如果將left join的table1和table2調換,使用right join,結果相同
3.內連線
select dept.*,emp.* from dept inner join emp on dept.id=emp.dept_id;
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
| id | name | loc | id | name | job | topid | hdate | sal | bonus | dept_id |
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
| 10 | 開發部 | 北京 | 1003 | 李四 | java開發工程師 | 1011 | 1991-02-20 | 1900 | 300 | 10 |
| 10 | 開發部 | 北京 | 1005 | 王五 | java開發工程師 | 1011 | 1991-02-22 | 2450 | 600 | 10 |
| 10 | 開發部 | 北京 | 1009 | 田七 | java開發工程師 | 1011 | 1991-09-28 | 1250 | 1400 | 10 |
| 10 | 開發部 | 北京 | 1011 | 陳紅 | 經理 | 1017 | 1991-05-01 | 3450 | 400 | 10 |
| 10 | 開發部 | 北京 | 1013 | 陳梓鑫 | 前端開發工程師 | 1011 | 1991-06-09 | 1250 | 800 | 10 |
| 10 | 開發部 | 北京 | 1019 | 劉國 | 前端開發工程師 | 1011 | 1991-09-08 | 1500 | 500 | 10 |
| 20 | 產品服務部 | 上海 | 1001 | 張三 | 需求分析師 | 1007 | 1990-12-17 | 800 | 500 | 20 |
| 20 | 產品服務部 | 上海 | 1007 | 趙六 | 經理 | 1017 | 1991-04-02 | 3675 | 700 | 20 |
| 20 | 產品服務部 | 上海 | 1015 | 程成 | 專案助理 | 1007 | 1997-04-19 | 3000 | 1000 | 20 |
| 20 | 產品服務部 | 上海 | 1021 | 秦問天 | 需求分析師 | 1007 | 1997-05-23 | 1100 | 1000 | 20 |
| 30 | 財務部 | 廣州 | 1023 | 趙家豪 | 經理 | 1017 | 1991-12-03 | 950 | NULL | 30 |
| 30 | 財務部 | 廣州 | 1025 | 長青 | 財務 | 1023 | 1991-12-03 | 3000 | 600 | 30 |
| 30 | 財務部 | 廣州 | 1027 | 葉少雲 | 財務 | 1023 | 1992-01-23 | 1300 | 400 | 30 |
+----+------------+------+------+--------+----------------+-------+------------+------+-------+---------+
13 rows in set (0.16 sec)
聯查dept表和emp表
語法 [table1] inner join [table2] on [條件]
如果on條件不成立則不查出
如上查詢結果所示,沒有查出部門id為40的資料
4.union 與 union all
作用,將兩個結果集並集
union去重
union all 不去重,效率比union高
使用union和union all結果集列數必須對應
這裡只講解union all
,union可以自己寫幾條資料測試
-
查詢部門Id為10且工資大於3000的
select * from emp where dept_id=10 and sal > 3000;
+------+------+------+-------+------------+------+-------+---------+ | id | name | job | topid | hdate | sal | bonus | dept_id | +------+------+------+-------+------------+------+-------+---------+ | 1011 | 陳紅 | 經理 | 1017 | 1991-05-01 | 3450 | 400 | 10 | +------+------+------+-------+------------+------+-------+---------+ 1 row in set (0.14 sec)
-
查詢部門Id為20且獎金大於700(包括700)的
select * from emp where dept_id=20 and bonus >= 700;
+------+--------+------------+-------+------------+------+-------+---------+ | id | name | job | topid | hdate | sal | bonus | dept_id | +------+--------+------------+-------+------------+------+-------+---------+ | 1007 | 趙六 | 經理 | 1017 | 1991-04-02 | 3675 | 700 | 20 | | 1015 | 程成 | 專案助理 | 1007 | 1997-04-19 | 3000 | 1000 | 20 | | 1021 | 秦問天 | 需求分析師 | 1007 | 1997-05-23 | 1100 | 1000 | 20 | +------+--------+------------+-------+------------+------+-------+---------+ 3 rows in set (0.10 sec)
-
(查詢部門Id為10且工資大於3000的)和(查詢部門Id為20且獎金大於700(包括700)的)
select * from emp where dept_id=10 and sal > 3000 union all select * from emp where dept_id=20 and bonus >= 700;
+------+--------+------------+-------+------------+------+-------+---------+ | id | name | job | topid | hdate | sal | bonus | dept_id | +------+--------+------------+-------+------------+------+-------+---------+ | 1011 | 陳紅 | 經理 | 1017 | 1991-05-01 | 3450 | 400 | 10 | | 1007 | 趙六 | 經理 | 1017 | 1991-04-02 | 3675 | 700 | 20 | | 1015 | 程成 | 專案助理 | 1007 | 1997-04-19 | 3000 | 1000 | 20 | | 1021 | 秦問天 | 需求分析師 | 1007 | 1997-05-23 | 1100 | 1000 | 20 | +------+--------+------------+-------+------------+------+-------+---------+ 4 rows in set (0.08 sec)