1. 程式人生 > 資料庫 >mysql語法歸檔,初學者mysql必學知識

mysql語法歸檔,初學者mysql必學知識

目錄

1.基礎語法

建立user表,基本表結構如下

- List item

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)