摘要
為了方便數據庫的使用,本篇文章通過列舉高級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