MySQL一些常用的高級SQL語句


摘要

為了方便數據庫的使用,本篇文章通過列舉高級SQL語句的語法及使用來幫助你更快的學習SQL語句

一、按關鍵字排序

1.1、使用ORDER BY語句來實現排序

1.2、排序可針對一個或多個字段

1.3、ASC:升序,默認排序方式

1.4、DESC:降序

1.5、ORDER BY的語法結構

 語法:
1
select column1,column2,... from 庫名 order by column1,column,... asc|desc;
 1 語句使用  2 mysql -uroot -p123123  3 mysql> create database score;  4 mysql> use score;  5 mysql> create table test(xuehao int(6) not null primary key,nianling int(3) not null,xingming char(20) not null,chengji int(3) not null);  6 mysql> insert into test values(201001,17,'zhangsan',60),(201002,17,'zhaoliu',95),(201003,18,'lisi',70),(201004,18,'wangwu',80),(201005,19,'tianqi',55);  7 mysql> select * from test;  8 
 9 升序 10 mysql> select chengji from test order by chengji asc; 11 +---------+
12 | chengji |
13 +---------+
14 |      55 |
15 |      60 |
16 |      70 |
17 |      80 |
18 |      95 |
19 +---------+
20 5 rows in set (0.00 sec) 21 mysql> select chengji from test order by chengji; #默認是ASC 22 +---------+
23 | chengji |
24 +---------+
25 |      55 |
26 |      60 |
27 |      70 |
28 |      80 |
29 |      95 |
30 +---------+
31 5 rows in set (0.00 sec) 32 
33 降序 34 mysql> select chengji from test order by chengji desc; 35 +---------+
36 | chengji |
37 +---------+
38 |      95 |
39 |      80 |
40 |      70 |
41 |      60 |
42 |      55 |
43 +---------+
44 5 rows in set (0.00 sec)

1.6、按單字段排序

 1 mysql> select xuehao,xingming,chengji from test order by chengji;  2 +--------+----------+---------+
 3 | xuehao | xingming | chengji |
 4 +--------+----------+---------+
 5 | 201005 | tianqi   |      55 |
 6 | 201001 | zhangsan |      60 |
 7 | 201003 | lisi     |      70 |
 8 | 201004 | wangwu   |      80 |
 9 | 201002 | zhaoliu  |      95 |
10 +--------+----------+---------+
11 5 rows in set (0.00 sec)

1.7、按多字段排序

 1 mysql> select xingming,chengji from test order by nianling desc,chengji desc;  2 +----------+---------+
 3 | xingming | chengji |
 4 +----------+---------+
 5 | tianqi   |      55 |
 6 | wangwu   |      80 |
 7 | lisi     |      70 |
 8 | zhaoliu  |      95 |
 9 | zhangsan |      60 |
10 +----------+---------+
11 5 rows in set (0.00 sec)

二、對結果進行分組

2.1、使用GROUP BY語句來實現分組

2.2、通常結合聚合函數一起使用

2.3、可以按一個或多個字段對結果進行分組

2.4、GROUP BY分組

 1 mysql> insert into test values(201006,18,'zhangsan',80),(201007,19,'lisi',70);  2 
 3 mysql> select * from test;  4 +--------+----------+----------+---------+
 5 | xuehao | nianling | xingming | chengji |
 6 +--------+----------+----------+---------+
 7 | 201001 |       17 | zhangsan |      60 |
 8 | 201002 |       17 | zhaoliu  |      95 |
 9 | 201003 |       18 | lisi     |      70 |
10 | 201004 |       18 | wangwu   |      80 |
11 | 201005 |       19 | tianqi   |      55 |
12 | 201006 |       18 | zhangsan |      80 |
13 | 201007 |       19 | lisi     |      70 |
14 +--------+----------+----------+---------+
15 7 rows in set (0.00 sec) 16 
17 mysql> select count(xingming),nianling from test group by nianling; 18 +-----------------+----------+
19 | count(xingming) | nianling |
20 +-----------------+----------+
21 |               2 |       17 |
22 |               3 |       18 |
23 |               2 |       19 |
24 +-----------------+----------+
25 3 rows in set (0.00 sec)

2.2、GROUP BY結合ORDER BY

1 mysql> select count(xingming),nianling from test group by nianling order by nianling desc; 2 +-----------------+----------+
3 | count(xingming) | nianling |
4 +-----------------+----------+
5 |               2 |       19 |
6 |               3 |       18 |
7 |               2 |       17 |
8 +-----------------+----------+
9 3 rows in set (0.00 sec)

三、限制結果條目

3.1、只返回select查詢結果的第一行或第幾行

3.2、使用limit語句限制條目

3.3、limit語法結構

 1 語法:  2 select column1,column2,... from 庫名 limit 位置偏移量  3 
 4 mysql> select * from test limit 3;  5 +--------+----------+----------+---------+
 6 | xuehao | nianling | xingming | chengji |
 7 +--------+----------+----------+---------+
 8 | 201001 |       17 | zhangsan |      60 |
 9 | 201002 |       17 | zhaoliu  |      95 |
10 | 201003 |       18 | lisi     |      70 |
11 +--------+----------+----------+---------+
12 3 rows in set (0.00 sec) 13 
14 mysql> select * from test limit 3,3; 15 +--------+----------+----------+---------+
16 | xuehao | nianling | xingming | chengji |
17 +--------+----------+----------+---------+
18 | 201004 |       18 | wangwu   |      80 |
19 | 201005 |       19 | tianqi   |      55 |
20 | 201006 |       18 | zhangsan |      80 |
21 +--------+----------+----------+---------+
22 3 rows in set (0.00 sec) 23 #3,3表示從第三行開始數,顯示后三行

四、設置別名

4.1、使用AS語句設置別名,關鍵字AS可省略

4.2、設置別名時,保證不能與庫中其他表或字段名稱沖突

4.3、別名的語法結構

 1 列的別名:  2 select 列名 as 列名別名 from 庫名;  3 表的別名:  4 select 列名 from 庫名 as 庫名別名;  5 
 6 mysql> select t.xuehao as 學號,t.nianling as 年齡,t.xingming as 姓名,t.chengji as 成績 from test as t;  7 +--------+--------+----------+--------+
 8 | 學號   | 年齡   | 姓名     | 成績   |
 9 +--------+--------+----------+--------+
10 | 201001 |     17 | zhangsan |     60 |
11 | 201002 |     17 | zhaoliu  |     95 |
12 | 201003 |     18 | lisi     |     70 |
13 | 201004 |     18 | wangwu   |     80 |
14 | 201005 |     19 | tianqi   |     55 |
15 | 201006 |     18 | zhangsan |     80 |
16 | 201007 |     19 | lisi     |     70 |
17 +--------+--------+----------+--------+
18 7 rows in set (0.00 sec)

4.4、as作為連接語句

 1 mysql> create table test1 as select * from test;  2 
 3 mysql> select * from test1;  4 +--------+----------+----------+---------+
 5 | xuehao | nianling | xingming | chengji |
 6 +--------+----------+----------+---------+
 7 | 201001 |       17 | zhangsan |      60 |
 8 | 201002 |       17 | zhaoliu  |      95 |
 9 | 201003 |       18 | lisi     |      70 |
10 | 201004 |       18 | wangwu   |      80 |
11 | 201005 |       19 | tianqi   |      55 |
12 | 201006 |       18 | zhangsan |      80 |
13 | 201007 |       19 | lisi     |      70 |
14 +--------+----------+----------+---------+
15 7 rows in set (0.00 sec)

五、通配符的使用

5.1、用於替換字符串中的部分字符

5.2、通常配合like一起使用,並協同where完成查詢

5.3、常用通配符

5.3.1、%:表示0個,1個或多個

5.3.2、_:表示單個字符

 1 mysql> select xuehao,xingming from test where xingming like 'z%';  2 +--------+----------+
 3 | xuehao | xingming |
 4 +--------+----------+
 5 | 201001 | zhangsan |
 6 | 201002 | zhaoliu  |
 7 | 201006 | zhangsan |
 8 +--------+----------+
 9 3 rows in set (0.00 sec) 10 
11 mysql> select xuehao,xingming from test where xingming like 'lis_'; 12 +--------+----------+
13 | xuehao | xingming |
14 +--------+----------+
15 | 201003 | lisi     |
16 | 201007 | lisi     |
17 +--------+----------+
18 2 rows in set (0.00 sec)

 六、子查詢

6.1、也稱作內查詢或者嵌套查詢

6.2、先於主查詢被執行,其結果將作為外層查詢的條件

6.3、在增刪改查中都可以使用子查詢

6.4、支持多層嵌套

6.5、IN語句是用來判斷某個值是否在給定的結果集中

6.6、子查詢的用法

 1 查詢:  2 mysql> select xuehao as 學號,chengji as 成績 from test where chengji in (select chengji from test where chengji >=60);  3 +--------+--------+
 4 | 學號   | 成績   |
 5 +--------+--------+
 6 | 201001 |     60 |
 7 | 201002 |     95 |
 8 | 201003 |     70 |
 9 | 201007 |     70 |
10 | 201004 |     80 |
11 | 201006 |     80 |
12 +--------+--------+
13 6 rows in set (0.00 sec) 14 
15 查詢結合降序使用: 16 mysql> select xuehao as 學號,chengji as 成績 from test where chengji in (select chengji from test where chengji >=60) order by chengji desc; 17 +--------+--------+
18 | 學號   | 成績   |
19 +--------+--------+
20 | 201002 |     95 |
21 | 201004 |     80 |
22 | 201006 |     80 |
23 | 201007 |     70 |
24 | 201003 |     70 |
25 | 201001 |     60 |
26 +--------+--------+
27 6 rows in set (0.01 sec) 28 
29 插入: 30 mysql> create table test_ as select * from score; 31 mysql> delete from test_; 32 mysql> select * from test_; 33 mysql> insert into test_ select * from test where chengji in (select chengji from test where chengji >=80); 34 mysql> select * from test_; 35 +--------+----------+----------+---------+
36 | xuehao | nianling | xingming | chengji |
37 +--------+----------+----------+---------+
38 | 201002 |       17 | zhaoliu  |      95 |
39 | 201004 |       18 | wangwu   |      80 |
40 | 201006 |       18 | zhangsan |      80 |
41 +--------+----------+----------+---------+
42 3 rows in set (0.00 sec) 43 
44 修改:、 45 mysql> alter table test_ add column num int(3); 46 mysql> desc test_ ; 47 mysql> update test_ set num=101 where chengji in (select chengji from test where chengji >=80); 48 mysql> select * from test_; 49 +--------+----------+----------+---------+------+
50 | xuehao | nianling | xingming | chengji | num  |
51 +--------+----------+----------+---------+------+
52 | 201002 |       17 | zhaoliu  |      95 |  101 |
53 | 201004 |       18 | wangwu   |      80 |  101 |
54 | 201006 |       18 | zhangsan |      80 |  101 |
55 +--------+----------+----------+---------+------+
56 3 rows in set (0.00 sec) 57 
58 刪除: 59 mysql> delete from test where chengji in(select chengji from (select *from test where chengji >=75)a); 60 mysql> select * from test; 61 +--------+----------+----------+---------+
62 | xuehao | nianling | xingming | chengji |
63 +--------+----------+----------+---------+
64 | 201001 |       17 | zhangsan |      60 |
65 | 201003 |       18 | lisi     |      70 |
66 | 201005 |       19 | tianqi   |      55 |
67 | 201007 |       19 | lisi     |      70 |
68 +--------+----------+----------+---------+
69 4 rows in set (0.00 sec)

七、NULL值

7.1、表示缺失的值

7.2、與數字0或者空白(spaces)是不同的

7.3、使用IS NULL或IS NOT NULL進行判斷

7.4、NULL值和空值的區別

7.4.1、空值長度為0,不占空間;NULL值的長度為NULL,占用空間

7.4.2、IS NULL無法判斷空值

7.4.3、空值使用“=”或者“<>”來處理

7.4.4、COUNT()計算時,NULL會忽略,空值會加入計算

 1 插入空值:  2 mysql> alter table test_ add column class varchar(16);  3 mysql> select * from test_;  4 mysql> insert into test_ values(201007,19,'lisi',80,102,'');  5 mysql> select * from test_;  6 +--------+----------+----------+---------+------+-------+
 7 | xuehao | nianling | xingming | chengji | num  | class |
 8 +--------+----------+----------+---------+------+-------+
 9 | 201002 |       17 | zhaoliu  |      95 |  101 | NULL  |
10 | 201004 |       18 | wangwu   |      80 |  101 | NULL  |
11 | 201006 |       18 | zhangsan |      80 |  101 | NULL  |
12 | 201007 |       19 | lisi     |      80 |  102 |       |
13 +--------+----------+----------+---------+------+-------+
14 
15 null的用法: 16 mysql> select * from test_ where class is null ; 17 +--------+----------+----------+---------+------+-------+
18 | xuehao | nianling | xingming | chengji | num  | class |
19 +--------+----------+----------+---------+------+-------+
20 | 201002 |       17 | zhaoliu  |      95 |  101 | NULL  |
21 | 201004 |       18 | wangwu   |      80 |  101 | NULL  |
22 | 201006 |       18 | zhangsan |      80 |  101 | NULL  |
23 +--------+----------+----------+---------+------+-------+
24 3 rows in set (0.00 sec) 25 mysql> select * from test_ where class is not null; 26 +--------+----------+----------+---------+------+-------+
27 | xuehao | nianling | xingming | chengji | num  | class |
28 +--------+----------+----------+---------+------+-------+
29 | 201007 |       19 | lisi     |      80 |  102 |       |
30 +--------+----------+----------+---------+------+-------+
31 1 row in set (0.00 sec)

 八、正則表達式

8.1、根據指定的匹配模式匹配記錄中符合要求的特殊字符

8.2、使用REGEXP關鍵字指定匹配模式

8.3、常用匹配模式

字符

說明

^

匹配開始字符

$

匹配結束字符

.

匹配任意單個字符

*

匹配任意個前面的字符

+

匹配前面字符至少1次

p1|p2

匹配p1或p2

[...]

匹配字符集中括號內的任何字符

[^...]

匹配不在括號內的任何字符

{n}

匹配前面的字符串n次

{n,m}

匹配前面的字符串至少n次,至多m次

 1 以z開頭的姓名:(^)  2 mysql> select xuehao,xingming,chengji from test_ where xingming regexp '^z';  3 +--------+----------+---------+
 4 | xuehao | xingming | chengji |
 5 +--------+----------+---------+
 6 | 201002 | zhaoliu  |      95 |
 7 | 201006 | zhangsan |      80 |
 8 +--------+----------+---------+
 9 2 rows in set (0.00 sec) 10 
11 以n結尾的姓名:($) 12 mysql> select xuehao,xingming,chengji from test_ where xingming regexp 'n$'; 13 +--------+----------+---------+
14 | xuehao | xingming | chengji |
15 +--------+----------+---------+
16 | 201006 | zhangsan |      80 |
17 +--------+----------+---------+
18 1 row in set (0.00 sec) 19 
20 匹配單個字符(.) 21 mysql> select xuehao,xingming,chengji from test_ where xingming regexp 'lis.'; 22 +--------+----------+---------+
23 | xuehao | xingming | chengji |
24 +--------+----------+---------+
25 | 201007 | lisi     |      80 |
26 +--------+----------+---------+
27 1 row in set (0.00 sec) 28 
29 匹配前面字符至少1次(+30 mysql> insert into test_ values(201008,20,'lio',75,103,''),(201009,20,'lioo',85,104,''),(201009,20,'liooo',55,105,''); 31 mysql> select xuehao,xingming,chengji from test_ where xingming regexp 'lioo+'; 32 +--------+----------+---------+
33 | xuehao | xingming | chengji |
34 +--------+----------+---------+
35 | 201009 | lioo     |      85 |
36 | 201009 | liooo    |      55 |
37 +--------+----------+---------+
38 2 rows in set (0.00 sec) 39 
40 匹配任意個前面的字符(*) 41 mysql> select xuehao,xingming,chengji from test_ where xingming regexp 'lio*'; 42 +--------+----------+---------+
43 | xuehao | xingming | chengji |
44 +--------+----------+---------+
45 | 201002 | zhaoliu  |      95 |
46 | 201007 | lisi     |      80 |
47 | 201008 | lio      |      75 |
48 | 201009 | lioo     |      85 |
49 | 201009 | liooo    |      55 |
50 +--------+----------+---------+
51 5 rows in set (0.00 sec) 52 
53 匹配p1或p2(p1|p2) 54 mysql> select xuehao,xingming,chengji from test_ where xingming regexp 'l|n'; 55 +--------+----------+---------+
56 | xuehao | xingming | chengji |
57 +--------+----------+---------+
58 | 201002 | zhaoliu  |      95 |
59 | 201004 | wangwu   |      80 |
60 | 201006 | zhangsan |      80 |
61 | 201007 | lisi     |      80 |
62 | 201008 | lio      |      75 |
63 | 201009 | lioo     |      85 |
64 | 201009 | liooo    |      55 |
65 +--------+----------+---------+
66 7 rows in set (0.00 sec) 67 
68 匹配字符集中括號內的任何字符([...]) 69 mysql> select xuehao,xingming,chengji from test_ where xingming regexp '[hz]'; 70 +--------+----------+---------+
71 | xuehao | xingming | chengji |
72 +--------+----------+---------+
73 | 201002 | zhaoliu  |      95 |
74 | 201006 | zhangsan |      80 |
75 +--------+----------+---------+
76 2 rows in set (0.00 sec) 77 
78 匹配前面的字符串n次{n} 79 mysql> select xuehao,xingming,chengji from test_ where xingming regexp 'o{2}'; 80 +--------+----------+---------+
81 | xuehao | xingming | chengji |
82 +--------+----------+---------+
83 | 201009 | lioo     |      85 |
84 | 201009 | liooo    |      55 |
85 +--------+----------+---------+
86 2 rows in set (0.00 sec) 87 
88 匹配前面的字符串至少n次,至多m次({n,m}) 89 mysql> select xuehao,xingming,chengji from test_ where xingming regexp 'o{2,3}'; 90 +--------+----------+---------+
91 | xuehao | xingming | chengji |
92 +--------+----------+---------+
93 | 201009 | lioo     |      85 |
94 | 201009 | liooo    |      55 |
95 +--------+----------+---------+
96 2 rows in set (0.00 sec)

九、算術運算符

9.1、MySQL支持的算術運算符

字符

說明

+

加法

-

減法

*

乘法

/

除法

%

取余數

1 mysql> select 5+2 as addition,8-5 as subtraction,6*7 as multiplication,8/2 as division,9%4 as remainder; 2 +----------+-------------+----------------+----------+-----------+
3 | addition | subtraction | multiplication | division | remainder |
4 +----------+-------------+----------------+----------+-----------+
5 |        7 |           3 |             42 |   4.0000 |         1 |
6 +----------+-------------+----------------+----------+-----------+
7 1 row in set (0.00 sec)

9.2、比較運算符

9.2.1、字符串的比較默認不區分大小寫,可使用binary來區分

9.2.2、常用比較運算符

運算符

說明

=

等於 

大於 

小於 

>=

大於或等於 

<=

小於或等於 

!=或<>

不等於

IN

在集合中

LIKE

通配符匹配

IS NULL

判斷一個值是否為NULL

IS NOT NULL

判斷一個值是否不為NULL

BETWEEN AND

兩者之間

GREATEST

兩個或多個參數時返回最大值

LEAST

兩個或多個參數時返回最小值

1 mysql> select 2=4,2='2','e'='e',(4+4)=(5+3),'n'=NULL; 2 +-----+-------+---------+-------------+----------+
3 | 2=4 | 2='2' | 'e'='e' | (4+4)=(5+3) | 'n'=NULL |
4 +-----+-------+---------+-------------+----------+
5 |   0 |     1 |       1 |           1 |     NULL |
6 +-----+-------+---------+-------------+----------+
7 1 row in set (0.01 sec)

從以上查詢可以看出:

①如果兩者都是整數,則按整數值進行比較

②如果一個整數一個字符串,則會自動將字符串轉換為數字,再進行比較

③如果兩者都是字符串,則按照字符串進行比較

④如果兩者中至少有一個值是NULL,則比較的結果是NULL

 1 mysql> select 2>4,2<'2', 'e'>='e',(4+4)<=(5+3);  2 +-----+-------+----------+--------------+
 3 | 2>4 | 2<'2' | 'e'>='e' | (4+4)<=(5+3) |
 4 +-----+-------+----------+--------------+
 5 |   0 |     0 |        1 |            1 |
 6 +-----+-------+----------+--------------+
 7 1 row in set (0.00 sec)  8 
 9 mysql> select 2!=4,null is null,null is not null,2 between 1 and 4; 10 +------+--------------+------------------+-------------------+
11 | 2!=4 | null is null | null is not null | 2 between 1 and 4 |
12 +------+--------------+------------------+-------------------+
13 |    1 |            1 |                0 |                 1 |
14 +------+--------------+------------------+-------------------+
15 1 row in set (0.00 sec) 16 
17 mysql> select greatest (5,8,12),least (1,5,4); 18 +-------------------+---------------+
19 | greatest (5,8,12) | least (1,5,4) |
20 +-------------------+---------------+
21 |                12 |             1 |
22 +-------------------+---------------+
23 1 row in set (0.00 sec)

十、邏輯運算符

10.1、又稱為布爾運算符

10.2、用來判斷表達式的真假

10.3、常用的邏輯運算符

運算符

說明

NOT或!

邏輯非

AND或&&

邏輯與

OR或||

邏輯或

XOR

邏輯異或

 1 邏輯非  2 mysql> select not 2,!3,not 0,!(4-4);  3 +-------+----+-------+--------+
 4 | not 2 | !3 | not 0 | !(4-4) |
 5 +-------+----+-------+--------+
 6 |     0 |  0 |     1 |      1 |
 7 +-------+----+-------+--------+
 8 1 row in set (0.00 sec)  9 
10 邏輯與 11 mysql> select 2 and 3,4 && 0,0 && NULL,1 and NULL; 12 +---------+--------+-----------+------------+
13 | 2 and 3 | 4 && 0 | 0 && NULL | 1 and NULL |
14 +---------+--------+-----------+------------+
15 |       1 |      0 |         0 |       NULL |
16 +---------+--------+-----------+------------+
17 1 row in set (0.00 sec)

十一、位運算符

11.1、對二進制數進行計算的運算符

11.2、常用的位運算符

運算符

說明

&

按位與

|

按位或

~

按位取反

^

按位異或

<< 

按位左移

>> 

按位右移

1 mysql> select 4&5,4|5,4&~3,3^4,2<<2,2>>1; 2 +-----+-----+------+-----+------+------+
3 | 4&5 | 4|5 | 4&~3 | 3^4 | 2<<2 | 2>>1 |
4 +-----+-----+------+-----+------+------+
5 |   4 |   5 |    4 |   7 |    8 |    1 |
6 +-----+-----+------+-----+------+------+
7 1 row in set (0.00 sec)

十二、連接查詢

        MySQL的連接查詢,通常都是將來自兩個或多個表的行結合起來,基於這些表之間的共同字段,進行數據的拼接,首先,要確定一個主表作為結果集,然后將其他表的行有選擇性的連接到選定的主表結果集上,使用較多的連接查詢包括:內連接、左連接和右連接

12.1、內連接及示意圖

1 mysql> select t.xuehao,t.xingming,t.chengji from test_ t inner join test t1 on t.xingming=t1.xingming; 2 +--------+----------+---------+
3 | xuehao | xingming | chengji |
4 +--------+----------+---------+
5 | 201006 | zhangsan |      80 |
6 | 201007 | lisi     |      80 |
7 | 201007 | lisi     |      80 |
8 +--------+----------+---------+
9 3 rows in set (0.00 sec)

12.2、左連接及示意圖

 1 mysql> select t.xuehao,t.xingming,t.chengji from test_ t left join test t1 on t.xingming=t1.xingming;  2 +--------+----------+---------+
 3 | xuehao | xingming | chengji |
 4 +--------+----------+---------+
 5 | 201006 | zhangsan |      80 |
 6 | 201007 | lisi     |      80 |
 7 | 201007 | lisi     |      80 |
 8 | 201002 | zhaoliu  |      95 |
 9 | 201004 | wangwu   |      80 |
10 | 201008 | lio      |      75 |
11 | 201009 | lioo     |      85 |
12 | 201009 | liooo    |      55 |
13 +--------+----------+---------+
14 8 rows in set (0.00 sec)

12.2、右連接及示意圖

 1 mysql> select t.xuehao,t.xingming,t.chengji from test_ t right join test t1 on t.xingming=t1.xingming;  2 +--------+----------+---------+
 3 | xuehao | xingming | chengji |
 4 +--------+----------+---------+
 5 | 201006 | zhangsan |      80 |
 6 | 201007 | lisi     |      80 |
 7 | 201007 | lisi     |      80 |
 8 |   NULL | NULL     |    NULL |
 9 +--------+----------+---------+
10 4 rows in set (0.00 sec)

 

十三、函數

13.1、數學函數

函數

含義

abs(x)

返回x的絕對值

rand()

返回0到1的隨機數

mod(x,y)

返回x除以y以后的余數

power(x,y)

返回x的y次方

round(x)

返回離x最近的整數

round(x,y)

保留x的y位小數四舍五入后的值

sqrt(x)

返回x的平方根

truncate(x,y)

返回數字x截斷為y位小樹的值

ceil(x)

返回大於或等於x的最小整數

floor(x)

返回小於或等於x的最大整數

greatest(x1,x2...)

返回集合中最大的值

least(x1,x2...)

返回集合中最小的值

 常用的數學函數舉例說明
1
mysql> select abs(-12),rand(),rand(),mod(4,5),power(2,6); 2 +----------+--------------------+--------------------+----------+------------+ 3 | abs(-12) | rand() | rand() | mod(4,5) | power(2,6) | 4 +----------+--------------------+--------------------+----------+------------+ 5 | 12 | 0.7755411516647238 | 0.7329282013074757 | 4 | 64 | 6 +----------+--------------------+--------------------+----------+------------+ 7 1 row in set (0.00 sec) 8 9 mysql> select round(2.4),round(2.5),round(2.4235,2),sqrt(2),truncate(2.4652,2); 10 +------------+------------+-----------------+--------------------+--------------------+ 11 | round(2.4) | round(2.5) | round(2.4235,2) | sqrt(2) | truncate(2.4652,2) | 12 +------------+------------+-----------------+--------------------+--------------------+ 13 | 2 | 3 | 2.42 | 1.4142135623730951 | 2.46 | 14 +------------+------------+-----------------+--------------------+--------------------+ 15 1 row in set (0.00 sec) 16 17 mysql> select ceil(2.2),floor(2.8),greatest(1,2,3,4,5),least(1,2,3,4,5); 18 +-----------+------------+---------------------+------------------+ 19 | ceil(2.2) | floor(2.8) | greatest(1,2,3,4,5) | least(1,2,3,4,5) | 20 +-----------+------------+---------------------+------------------+ 21 | 3 | 2 | 5 | 1 | 22 +-----------+------------+---------------------+------------------+ 23 1 row in set (0.00 sec)

13.2、聚合函數:對表中數據記錄進行集中概括而設計的一類函數

函數

含義

avg()

返回指定列的平均值

count()

返回指定列中非NULL值的個數

min()

返回指定看列的最小值

max()

返回指定列的最大值

sum()

返回指定列的所有值之和


1
聚合函數舉例 2 mysql> select avg(chengji) from test; 3 +--------------+ 4 | avg(chengji) | 5 +--------------+ 6 | 63.7500 | 7 +--------------+ 8 1 row in set (0.00 sec) 9 10 mysql> select sum(chengji) from test; 11 +--------------+ 12 | sum(chengji) | 13 +--------------+ 14 | 255 | 15 +--------------+ 16 1 row in set (0.00 sec) 17 18 mysql> select min(chengji) from test; 19 +--------------+ 20 | min(chengji) | 21 +--------------+ 22 | 55 | 23 +--------------+ 24 1 row in set (0.00 sec) 25 26 mysql> select max(chengji) from test; 27 +--------------+ 28 | max(chengji) | 29 +--------------+ 30 | 70 | 31 +--------------+ 32 1 row in set (0.00 sec) 33 34 mysql> alter table test add sex char(2); 35 mysql> select * from test; 36 +--------+----------+----------+---------+------+ 37 | xuehao | nianling | xingming | chengji | sex | 38 +--------+----------+----------+---------+------+ 39 | 201001 | 17 | zhangsan | 60 | 男 | 40 | 201003 | 18 | lisi | 70 | NULL | 41 | 201005 | 19 | tianqi | 55 | NULL | 42 | 201007 | 19 | lisi | 70 | NULL | 43 +--------+----------+----------+---------+------+ 44 4 rows in set (0.00 sec) 45 mysql> update test set sex='' where xingming='lisi'; 46 mysql> update test set sex='' where xingming='zhangsan'; 47 mysql> select * from test; 48 +--------+----------+----------+---------+------+ 49 | xuehao | nianling | xingming | chengji | sex | 50 +--------+----------+----------+---------+------+ 51 | 201001 | 17 | zhangsan | 60 | 男 | 52 | 201003 | 18 | lisi | 70 | 男 | 53 | 201005 | 19 | tianqi | 55 | NULL | 54 | 201007 | 19 | lisi | 70 | 男 | 55 +--------+----------+----------+---------+------+ 56 4 rows in set (0.00 sec) 57 mysql> select count(sex) from test; 58 +------------+ 59 | count(sex) | 60 +------------+ 61 | 3 | 62 +------------+ 63 1 row in set (0.00 sec)

13.3、字符串函數

函數

含義

length(x)

返回字符串x的長度

trim()

返回去除指定格式的值

concat(x,y)

將提供的參數x和y拼接成一個字符串

upper(x)

將字符串x的所有字母變成大寫字母

lower(x)

將字符串x的所有字母變成小寫字母

left(x,y)

返回字符串x的前y個字符

right(x,y)

返回字符串x的后y個字符

repeat(x.y)

將字符串x重復y次

space(x)

返回x個空格

replace(x,y,z)

將字符串z替代字符串x中的字符串y

strcmp(x,y)

比較x和y,返回的值可以位-1,0,1

substring(x,y,z)

獲取從從字符串x中的第y個位置開始長度為z的字符串

reverse(x)

將字符串x反轉

 1 舉例說明  2 mysql> select length('abc'),trim(  'ab' ),concat('ab','cd'),upper('abc'),lower('ABC');  3 +---------------+---------------+-------------------+--------------+--------------+
 4 | length('abc') | trim(  'ab' ) | concat('ab','cd') | upper('abc') | lower('ABC') |
 5 +---------------+---------------+-------------------+--------------+--------------+
 6 |             3 | ab            | abcd              | ABC          | abc          |
 7 +---------------+---------------+-------------------+--------------+--------------+
 8 1 row in set (0.00 sec)  9 
10 mysql> select left('abcd',2),right('abcd',2),repeat('abc',3); 11 +----------------+-----------------+-----------------+
12 | left('abcd',2) | right('abcd',2) | repeat('abc',3) |
13 +----------------+-----------------+-----------------+
14 | ab             | cd              | abcabcabc       |
15 +----------------+-----------------+-----------------+
16 1 row in set (0.00 sec) 17 
18 mysql> select space(2),replace('abcde','e','g'),strcmp('a','b'),strcmp('a','a'),strcmp('b','a'); 19 +----------+--------------------------+-----------------+-----------------+-----------------+
20 | space(2) | replace('abcde','e','g') | strcmp('a','b') | strcmp('a','a') | strcmp('b','a') |
21 +----------+--------------------------+-----------------+-----------------+-----------------+
22 |          | abcdg                    |              -1 |               0 |               1 |
23 +----------+--------------------------+-----------------+-----------------+-----------------+
24 1 row in set (0.00 sec) 25 
26 mysql> select substring('abcdefg',3,3),reverse('abcdefg'); 27 +--------------------------+--------------------+
28 | substring('abcdefg',3,3) | reverse('abcdefg') |
29 +--------------------------+--------------------+
30 | cde                      | gfedcba            |
31 +--------------------------+--------------------+
32 1 row in set (0.00 sec)

13.4、日期時間函數

函數

含義

curdate()

返回當前時間的年月日

curtime()

返回當前時間的時分秒

now()

返回當前時間的日期和時間

month()

返回日期x中的月份值

week(x)

返回日期x是年度第幾個星期

hour(x)

返回x中的小時值

minute(x)

返回x中的分鍾值

second(x)

返回x中的秒鍾值

dayofweek(x)

返回x是星期幾,1星期日,2星期1

dayofmonth(x)

計算日期x是本月的第幾天

dayofyear(x)

計算日期x是本年的第幾天

 1 mysql> select curdate(),curtime(),now(),month('2020-08-15'),week('2020-08-15');  2 +------------+-----------+---------------------+---------------------+--------------------+
 3 | curdate()  | curtime() | now()               | month('2020-08-15') | week('2020-08-15') |
 4 +------------+-----------+---------------------+---------------------+--------------------+
 5 | 2020-11-02 | 19:03:03  | 2020-11-02 19:03:03 |                   8 |                 32 |
 6 +------------+-----------+---------------------+---------------------+--------------------+
 7 1 row in set (0.00 sec)  8 
 9 mysql> select hour('20:15:45'),minute('20:15:45'),second('20:15:45'); 10 +------------------+--------------------+--------------------+
11 | hour('20:15:45') | minute('20:15:45') | second('20:15:45') |
12 +------------------+--------------------+--------------------+
13 |               20 |                 15 |                 45 |
14 +------------------+--------------------+--------------------+
15 1 row in set (0.00 sec) 16 
17 mysql> select dayofweek('2020-08-15'),dayofmonth('2020-08-15'),dayofyear('2020-08-15'); 18 +-------------------------+--------------------------+-------------------------+
19 | dayofweek('2020-08-15') | dayofmonth('2020-08-15') | dayofyear('2020-08-15') |
20 +-------------------------+--------------------------+-------------------------+
21 |                       7 |                       15 |                     228 |
22 +-------------------------+--------------------------+-------------------------+
23 1 row in set (0.00 sec)

十四、存儲過程

14.1、簡介

14.1.1、是一組為了完成特定功能的SQL語句集合

14.1.2、比傳統的SQL速度更快、執行效率更高

14.1.3、存儲過程的優點

①執行一次后,會將生成的二進制代碼駐留緩沖區,提高執行效率

②SQL語句加上控制語句的集合,靈活性高

③在服務器端存儲,客戶端調用時,降低網絡負載

④可多次重復被調用,可隨時修改,不影響客戶端調用

⑤可完成所有的數據庫操作,也可控制數據庫的信息訪問權限

14.2、創建存儲過程

14.2.1、使用CREATE PROCEDURE語句創建存儲過程

14.2.2、創建存儲過程的語法結構

CREATE PROCEDURE <過程名> (過程參數[...])<過程體> [過程參數[...]] 格式 [IN|OUT|INOUT] <參數名> <類型>

14.3、參數分為

14.3.1、輸入參數:IN

14.3.2、輸出參數:OUT

14.3.3、輸入/輸出參數:INOUT

14.4、存儲過程的主體部分,被稱為過程體

14.5、以BEGIN開始,以END結束,若只有一條SQL語句

14.6、以DELIMITER開始和結束

14.7、存儲過程

 1 mysql> delimiter $$  2 mysql> create procedure a()  3     -> begin  4     -> select * from test limit 3;  5     -> end $$  6 Query OK, 0 rows affected (0.00 sec)  7 
 8 mysql> delimiter ;  9 mysql> call a(); 10 +--------+----------+----------+---------+------+
11 | xuehao | nianling | xingming | chengji | sex  |
12 +--------+----------+----------+---------+------+
13 | 201001 |       17 | zhangsan |      60 | 男   |
14 | 201003 |       18 | lisi     |      70 | 男   |
15 | 201005 |       19 | tianqi   |      55 | NULL |
16 +--------+----------+----------+---------+------+
17 3 rows in set (0.01 sec) 18 
19 Query OK, 0 rows affected (0.01 sec)
 1 mysql> use score;  2 mysql> set @num1=1,@num2=2,@num3=3;  3 mysql> delimiter $$  4 mysql> create procedure p(in num1 int,out num2 int,inout num3 int)  5     -> begin  6     -> select num1,num2,num3;  7     -> set num1=10,num2=20,num3=30;  8     -> select num1,num2,num3;  9     -> end $$ 10 Query OK, 0 rows affected (0.00 sec) 11 
12 mysql> delimiter ; 13 mysql> call p(@num1,@num2,@num3); 14 +------+------+------+
15 | num1 | num2 | num3 |
16 +------+------+------+
17 |    1 | NULL |    3 |
18 +------+------+------+
19 1 row in set (0.00 sec) 20 
21 +------+------+------+
22 | num1 | num2 | num3 |
23 +------+------+------+
24 |   10 |   20 |   30 |
25 +------+------+------+
26 1 row in set (0.00 sec) 27 總結1:in和inout參數會將全局變量的值傳入存儲過程中,而out參數不會將全局變量的值傳入存儲過程中,在全局過程使用中,參數值in、out、inout都會發生改變 28 
29 mysql> select @num1,@num2,@num3; 30 +-------+-------+-------+
31 | @num1 | @num2 | @num3 |
32 +-------+-------+-------+
33 |     1 |    20 |    30 |
34 +-------+-------+-------+
35 1 row in set (0.00 sec) 36 總結2:調用完存儲過程后,發現in參數不會對全局變量的值引起變化,而out和inout參數調用完存儲過程后,會對全局變量的值產生變化,會將存儲過程引用后的值賦值給全局變量,in參數賦值類型可以是變量還有定值,而out和inout參數賦值類型必須是變量

14.8、修改存儲過程

14.8.1、存儲過程的修改分為特征修改和內容修改

14.8.2、特征修改的方法

  ALTER PROCEDURE <過程名> [<特征>...]

14.8.3、內容修改可先刪除原有存儲過程,之后再創建方法

14.9、刪除存儲過程

14.9.1、刪除存儲過程的語法

  DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <過程名>

14.9.2、刪除的過程

1 mysql> drop procedure a; 2 mysql> call a(); 3 ERROR 1305 (42000): PROCEDURE score.a does not exist


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM