博主花了兩天兩夜,整理出一些 SQL 陳述句的高級使用方法,SQL陳述句的熟練使用,在平時的運維作業中可以提供不小的幫助,尤其是在一些規模較小的公司,運維身兼數職,可能會有不少資料庫的相關作業,本章將從不同的方面出發介紹 SQL 陳述句的高級運用方法,
文章目錄
- 一:MyAQL進階查詢
- 1.1:按關鍵字排序
- 1.11:按單字短排序
- 1.12:按多欄位排序
- 1.2:對結果進行分組
- 1.21:常用的聚合函式包括:
- 1.22:GROUP BY分組
- 1.23:GROUP BY集合ORDER BY
- 1.3:限制結果條目
- 1.4:設定別名
- 1.41:AS的用法
- 1.42:進行多表相連
- 1.5:進行兩連查詢
- 1.43:定義列別名
- 1.51:通配符的用法
- 1.6:子查詢
- 1.61:子查詢的用法
- 1.7:mysql算數運算子號
- 1.8:NULL值
- 1.81:查詢name欄位不為空的記錄
- 1.82:查詢name欄位為NULL值的記錄
- 二:正則運算式
- 2.1:正則運算式匹配表
- 2.11:包含指定字串的記錄
- 2.12:以"."代替字串的任意一個字符的記錄
- 2.13:匹配包含或者關系的記錄
- 2.14:匹配前面字符的任意多次
- 2.15:”+“匹配前面字符至少一次
- 三:運算子
- 3.1:算數運算子
- 3.1:運算子號分類
- 3.11:MYSQL支持使用的運算子號
- 3.2:比較運算
- 3.21:常用比較運算子
- 3.22:等于運算子
- 3.23:不等于運算子
- 3.24:大于、大于等于、小于、小于等于運算子
- 3.25: IS NULL、IS NOT NULL
- 3.26:BETWEEN AND
- 3.27:LEAST、GREATEST
- 3.28:IN、NOT IN
- 3.29:LIKE、NOT LIKE
- 3.3:邏輯運算子
- 3.31:常用的邏輯運算子號
- 3.32:邏輯非
- 3.33:邏輯與
- 3.34:邏輯或
- 3.35:邏輯異或
- 3.4:位運算子
- 3.41:MYSQL支持的運算子
- 3.42:運算子的優先級
- 3.5:連接查詢
- 3.51:左連接
- 3.52:右連接
- 四:資料庫函式
- 4.1:常用的函式分類
- 4.2:數學函式
- 4.3:字串函式
- 4.5:日期時間函式
- 4.51:常用的日期時間函式
- 五:存盤程序簡介
- 5.1:創建存盤程序的語法結構
- 5.11:創建存盤程序
- 5.12:存盤程序的語法結構
- 5.13:存盤程序的引數
一:MyAQL進階查詢
在對 MySQL 資料庫的增、刪、改、查操作有一定了解之后,就可以學習一些 SQL 陳述句的高級使用方法,SQL陳述句的熟練使用,在平時的運維作業中可以提供不小的幫助,尤其是在一些規模較小的公司,運維身兼數職,可能會有不少資料庫的相關作業,本章將從不同的方面出發介紹 SQL 陳述句的高級運用方法,
本資料庫環境為MySQL5.6
1.1:按關鍵字排序
- 使用ORDERBY陳述句來實作排序
- 排序可針對一個或多個欄位
- ASC:升序,默認排序方式 【升序是從小到大】
- DESC:降序 【降序是從大到小】
- ORDER BY的語法結構
- ORDER BY后面跟欄位名
SELECT column1, column2,....FROM table_name ORDER BY column1,column2,...ASC|DESC;
1.11:按單字短排序
- 我們這邊新建一個資料庫tt
mysql> create database tt;
mysql> use tt;
mysql> create table tt (id int(10) not null primary key auto_increment,name char(20) not null,score decimal(5,2),address varchar(40)default '未知')engine=innodb;
mysql> desc tt;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(40) | YES | | 未知 | |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
mysql> insert into tt (name,score,address) values ('wangwu',68,'beijing'),('lisi',9njing');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into tt (name,score,address) values ('zhangsan',74,'beijing'),('shang78,'hangzhou');
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
#寫入資料
mysql> select * from tt;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | wangwu | 68.00 | beijing |
| 2 | lisi | 90.00 | nanjing |
| 3 | zhangsan | 74.00 | beijing |
| 4 | shanghai | 78.00 | hangzhou |
+----+----------+-------+----------+
4 rows in set (0.02 sec)
- 篩選大于70分的
【SELECT 陳述句中如果沒有指定具體的排序方式,則默認按 ASC 方式進行排序,DESC 是按降序方式進行排列,當然 ORDER BY 前面也可以使用 WHERE 子句對查詢結果進一步過濾.】
mysql> select name,score from tt where score>=70;
+----------+-------+
| name | score |
+----------+-------+
| lisi | 90.00 |
| zhangsan | 74.00 |
| shanghai | 78.00 |
+----------+-------+
3 rows in set (0.00 sec)
#篩選大于70分的進行升序排序 【對score欄位排序】
mysql> select name,score from tt where score>=70 order by score; #ASC可省略,升序
+----------+-------+
| name | score |
+----------+-------+
| zhangsan | 74.00 |
| shanghai | 78.00 |
| lisi | 90.00 |
+----------+-------+
3 rows in set (0.00 sec)
#篩選大于70分的進行降序排序 【對score欄位排序】
mysql> select name,score from tt where score>=70 order by score desc; #降序
+----------+-------+
| name | score |
+----------+-------+
| lisi | 90.00 |
| shanghai | 78.00 |
| zhangsan | 74.00 |
+----------+-------+
3 rows in set (0.00 sec)
1.12:按多欄位排序
這邊我們再次插入新的資料內容
mysql> insert into tt(name,score,address) values('tom',66,'wuxi'),('jerry',77,'hangzhou');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from tt;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | wangwu | 68.00 | beijing |
| 2 | lisi | 90.00 | nanjing |
| 3 | zhangsan | 74.00 | beijing |
| 4 | shanghai | 78.00 | hangzhou |
| 5 | tom | 66.00 | wuxi |
| 6 | jerry | 77.00 | hangzhou |
+----+----------+-------+----------+
6 rows in set (0.01 sec)
mysql> select id,name,score from tt where score>=70 order by score ASC;
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 3 | zhangsan | 74.00 |
| 6 | jerry | 77.00 |
| 4 | shanghai | 78.00 |
| 2 | lisi | 90.00 |
+----+----------+-------+
4 rows in set (0.00 sec)
mysql> select id,name,score from tt where score>=70 order by score DESC;
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 2 | lisi | 90.00 |
| 4 | shanghai | 78.00 |
| 6 | jerry | 77.00 |
| 3 | zhangsan | 74.00 |
+----+----------+-------+
4 rows in set (0.00 sec)
- 修改lisi成績為66分
mysql> update tt set score=66 where id=2;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select id,name,score from tt where score>=70 order by score desc;
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 4 | shanghai | 78.00 |
| 6 | jerry | 77.00 |
| 3 | zhangsan | 74.00 |
+----+----------+-------+
3 rows in set (0.00 sec)
#更改表中資料如下
mysql> select * from tt;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | wangwu | 80.00 | beijing |
| 2 | lisi | 66.00 | nanjing |
| 3 | zhangsan | 80.00 | beijing |
| 4 | shanghai | 78.00 | hangzhou |
| 5 | tom | 80.00 | wuxi |
| 6 | jerry | 77.00 | hangzhou |
+----+----------+-------+----------+
6 rows in set (0.00 sec)
mysql> select id,name,score from tt where score>=70 order by score desc,id desc ;
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 5 | tom | 80.00 |
| 3 | zhangsan | 80.00 |
| 1 | wangwu | 80.00 |
| 4 | shanghai | 78.00 |
| 6 | jerry | 77.00 |
+----+----------+-------+
5 rows in set (0.00 sec)
1.2:對結果進行分組
通過 SQL 查詢出來的結果,還可以對其進行分組,使用 GROUP BY 陳述句來實作,
GROUP BY 從字面上看,是以 BY 后面的內容對查詢出的資料進行分組,就是將一個“資料集”劃分成若干個“小區域”,然后針對這些個“小區域”進行資料處理,
- 使用GROUP BY陳述句來實作分組
- 通常結合聚合函式一起使用
- 可以按一個或多個欄位對結果進行分組
- GROUP BY的語法結構
SELECT column_name, aggregate_function(column_name)FROM table_name WHERE column_name operator value GROUP BY column_name;
1.21:常用的聚合函式包括:
count (欄位名稱) 計數 函式
count (*) 技術
sum (*) 求和
avg (*) 平均值
max (*) 最大
min (*) 最小值
1.22:GROUP BY分組
統計70跟80分的人數
mysql> select * from tt;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | wangwu | 80.00 | beijing |
| 2 | lisi | 66.00 | nanjing |
| 3 | zhangsan | 80.00 | beijing |
| 4 | shanghai | 78.00 | hangzhou |
| 5 | tom | 80.00 | wuxi |
| 6 | jerry | 77.00 | hangzhou |
+----+----------+-------+----------+
6 rows in set (0.00 sec)
mysql> select count(name),score from tt where score >=70 group by score;
+-------------+-------+
| count(name) | score |
+-------------+-------+
| 1 | 77.00 |
| 1 | 78.00 |
| 3 | 80.00 |
+-------------+-------+
3 rows in set (0.00 sec)
求班級的學生的平均成績
mysql> select avg(score) from tt;
+------------+
| avg(score) |
+------------+
| 76.833333 |
+------------+
1 row in set (0.00 sec)
1.23:GROUP BY集合ORDER BY
mysql> select count(name),score from tt where score >=70 group by score order by score desc;
+-------------+-------+
| count(name) | score |
+-------------+-------+
| 3 | 80.00 |
| 1 | 78.00 |
| 1 | 77.00 |
+-------------+-------+
3 rows in set (0.00 sec)
mysql> select count(name),score from tt where score >=70 group by score order by score ;
+-------------+-------+
| count(name) | score |
+-------------+-------+
| 1 | 77.00 |
| 1 | 78.00 |
| 3 | 80.00 |
+-------------+-------+
3 rows in set (0.00 sec)
1.3:限制結果條目
在使用 MySQL SELECT 陳述句進行查詢時,結果集回傳的是所有匹配的記錄,有時候僅需要回傳第一行或者前幾行,這時候就需要用到 LIMIT 子句,
LIMIT 的第一個引數是位置偏移量(可選引數),是設定 MySQL 從哪一行開始顯示,如果不設定第一個引數,將會從表中的第一條記錄開始顯示,需要注意的是,第一條記錄的位置偏移量是 0,第二條是 1,以此類推,第二個引數是設定回傳記錄行的最大數目,
- 只回傳SELECT查詢結果的第一行或前幾行
- 使用LIMIT陳述句限制條目
- LIMIT語法結構
SELECT column1,column2,...FROM table_name LIMIT[offset,] number;
number:回傳記錄行的最大數目
[offset,]:位置偏移量,從0開始
- 查看前三行的記錄
mysql> select * from tt limit 3;
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 1 | wangwu | 80.00 | beijing |
| 2 | lisi | 66.00 | nanjing |
| 3 | zhangsan | 80.00 | beijing |
+----+----------+-------+---------+
3 rows in set (0.00 sec)
- 查看3到5行的記錄
mysql> select * from tt limit 3,2;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 4 | shanghai | 78.00 | hangzhou |
| 5 | tom | 80.00 | wuxi |
+----+----------+-------+----------+
2 rows in set (0.00 sec)
- 列出班級前三名
mysql> insert into tt (name,score,address) values ('aa',87,'shanghai'),('shuaige',76,'hangzgzhou');
mysql> select * from tt;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 1 | wangwu | 80.00 | beijing |
| 2 | lisi | 66.00 | nanjing |
| 3 | zhangsan | 80.00 | beijing |
| 4 | shanghai | 78.00 | hangzhou |
| 5 | tom | 80.00 | wuxi |
| 6 | jerry | 77.00 | hangzhou |
| 7 | aa | 87.00 | shanghai |
| 8 | shuaige | 76.00 | hangzhou |
+----+----------+-------+----------+
8 rows in set (0.00 sec)
mysql> select * from tt order by score desc limit 3;
+----+----------+-------+----------+
| id | name | score | address |
+----+----------+-------+----------+
| 7 | aa | 87.00 | shanghai |
| 1 | wangwu | 80.00 | beijing |
| 3 | zhangsan | 80.00 | beijing |
+----+----------+-------+----------+
3 rows in set (0.00 sec)
1.4:設定別名
在 MySQL 查詢時,當表的名字比較長或者表內某些欄位比較長時,為了方便書寫或者多次使用相同的表,可以給欄位列或表設定別名,使用的時候直接使用別名,簡潔明了,增 強可讀性,
- 使用AS陳述句設定別名,關鍵字AS可省略
- 設定別名時,保證不能與庫中其他表或欄位名稱沖突
- 別名的語法結構
SELECT column_name AS alias_name FROM table_name;
SELECT column_name(s)FROM table_name ASalias_name;
1.41:AS的用法
示例
mysql> select count(*) from tt;
+----------+
| count(*) |
+----------+
| 8 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) as 數量 from tt;
+--------+
| 數量 |
+--------+
| 8 |
+--------+
1 row in set (0.00 sec)
- 多表相連
mysql> create table gg (id int(10) not null primary key auto_increment,gg_name varchar(10) not null);
Query OK, 0 rows affected (0.07 sec)
mysql> show tables;
+--------------+
| Tables_in_tt |
+--------------+
| gg |
| tt |
+--------------+
2 rows in set (0.00 sec)
mysql> desc gg;
+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| gg_name | varchar(10) | NO | | NULL | |
+---------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql> insert into gg (gg_name) values ('喬治'),('佩奇'),('蘇西');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from gg;
+----+---------+
| id | gg_name |
+----+---------+
| 1 | 喬治 |
| 2 | 佩奇 |
| 3 | 蘇西 |
+----+---------+
3 rows in set (0.00 sec)
mysql> alter table tt add column hobby int(3) not null;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc tt;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | | NULL | |
| score | decimal(5,2) | YES | | NULL | |
| address | varchar(40) | YES | | 未知 | |
| hobby | int(3) | NO | | NULL | |
+---------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 0 |
| 2 | lisi | 66.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 0 |
| 4 | shanghai | 78.00 | hangzhou | 0 |
| 5 | tom | 80.00 | wuxi | 0 |
| 6 | jerry | 77.00 | hangzhou | 0 |
| 7 | aa | 87.00 | shanghai | 0 |
| 8 | shuaige | 76.00 | hangzhou | 0 |
+----+----------+-------+----------+-------+
8 rows in set (0.00 sec)
定義了不允許為空 null 這邊顯示跌是默認值
如果定義的是允許為空 就是顯示的是null 什么都沒雨
資料庫中’ ':是空的字串 是有值的
null:是什么都沒有 沒有值
1.42:進行多表相連
- 把80分以上的hobby欄位設為1 80以下的人設為2
mysql> update tt set hobby=1 where score >=75;
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7 Changed: 7 Warnings: 0
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 1 |
| 2 | lisi | 66.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 1 |
| 4 | shanghai | 78.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 1 |
| 6 | jerry | 77.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 1 |
| 8 | shuaige | 76.00 | hangzhou | 1 |
+----+----------+-------+----------+-------+
8 rows in set (0.00 sec)
mysql> update tt set hobby=2 where score>=80;
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 2 | lisi | 66.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 2 |
| 4 | shanghai | 78.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 2 |
| 6 | jerry | 77.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 76.00 | hangzhou | 1 |
+----+----------+-------+----------+-------+
8 rows in set (0.00 sec)
1.5:進行兩連查詢
inner join 【內連接】
mysql> select * from tt inner join gg on tt.hobby=gg.id
-> ;
+----+----------+-------+----------+-------+----+---------+
| id | name | score | address | hobby | id | gg_name |
+----+----------+-------+----------+-------+----+---------+
| 1 | wangwu | 80.00 | beijing | 2 | 2 | 佩奇 |
| 3 | zhangsan | 80.00 | beijing | 2 | 2 | 佩奇 |
| 4 | shanghai | 78.00 | hangzhou | 1 | 1 | 喬治 |
| 5 | tom | 80.00 | wuxi | 2 | 2 | 佩奇 |
| 6 | jerry | 77.00 | hangzhou | 1 | 1 | 喬治 |
| 7 | aa | 87.00 | shanghai | 2 | 2 | 佩奇 |
| 8 | shuaige | 76.00 | hangzhou | 1 | 1 | 喬治 |
+----+----------+-------+----------+-------+----+---------+
7 rows in set (0.00 sec)
mysql> select tt.name,gg.gg_name from tt inner join gg on tt.hobby=gg.id;
+----------+---------+
| name | gg_name |
+----------+---------+
| wangwu | 佩奇 |
| zhangsan | 佩奇 |
| shanghai | 喬治 |
| tom | 佩奇 |
| jerry | 喬治 |
| aa | 佩奇 |
| shuaige | 喬治 |
+----------+---------+
7 rows in set (0.00 sec)
- 設定別名
mysql> select T.name,G.gg_name from tt as T inner join gg as G on T.hobby=G.id;
+----------+---------+
| name | gg_name |
+----------+---------+
| wangwu | 佩奇 |
| zhangsan | 佩奇 |
| shanghai | 喬治 |
| tom | 佩奇 |
| jerry | 喬治 |
| aa | 佩奇 |
| shuaige | 喬治 |
+----------+---------+
7 rows in set (0.00 sec)
#取消自定義
mysql> select T.name,G.gg_name from tt T inner join gg G on T.hobby=G.id;
+----------+---------+
| name | gg_name |
+----------+---------+
| wangwu | 佩奇 |
| zhangsan | 佩奇 |
| shanghai | 喬治 |
| tom | 佩奇 |
| jerry | 喬治 |
| aa | 佩奇 |
| shuaige | 喬治 |
+----------+---------+
7 rows in set (0.00 sec)
1.43:定義列別名
mysql> select T.name 姓名,G.gg_name 角色 from tt T inner join gg G on T.hobby=G.id;
+----------+--------+
| 姓名 | 角色 |
+----------+--------+
| wangwu | 佩奇 |
| zhangsan | 佩奇 |
| shanghai | 喬治 |
| tom | 佩奇 |
| jerry | 喬治 |
| aa | 佩奇 |
| shuaige | 喬治 |
+----------+--------+
7 rows in set (0.00 sec)
1.5:通配符
通配符主要用于替換字串中的部分字符,通過部分字符的匹配將相關結果查詢出來, 通常通配符都是跟 LIKE 一起使用的,并協同 WHERE 子句共同來完成查詢任務,
- 用于替換字串的部分字符
- 通常配合LIKE一起使用,并協同WHERE完成查詢
- 常用的通配符
%表示零個、一個或多個
_表示單個字符
1.51:通配符的用法
- 過濾zhangsan
mysql> select name,score from tt where name like 'z_______';
+----------+-------+
| name | score |
+----------+-------+
| zhangsan | 80.00 |
+----------+-------+
1 row in set (0.00 sec)
- z后面任意字符
mysql> select name,score from tt where name like 'z%';
+----------+-------+
| name | score |
+----------+-------+
| zhangsan | 80.00 |
+----------+-------+
1 row in set (0.00 sec)
- 兩者集合使用,過濾前面為一個字符 緊接著是hu兩個字符 后面兩個、一個、多個字符
mysql> select name,score from tt where name like 's_%';
+----------+-------+
| name | score |
+----------+-------+
| shanghai | 78.00 |
| shuaige | 76.00 |
+----------+-------+
2 rows in set (0.00 sec)
1.6:子查詢
子查詢也被稱作內查詢或者嵌套查詢,是指在一個查詢陳述句里面還嵌套著另一個查詢語 句,子查詢陳述句是先于主查詢陳述句被執行的,其結果作為外層的條件回傳給主查詢進行下一 步的查詢過濾,子查詢不僅可以在 SELECT 陳述句中使用,在 INERT、UPDATE、DELETE 中也同樣適用,在嵌套的時候,子查詢內部還可以再次嵌套新的子查詢,也就是說可以多層 嵌套,
- 也稱作內查詢或者嵌套查詢
- 先于主查詢被執行,其結果將作為外層主查詢的條件
- 在增刪改查中都可以使用子查詢
- 支持多層嵌套
- IN陳述句是用來判斷某個值是否在給定的結果集中
1.61:子查詢的用法
- 查看小當家的興趣愛好表
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 2 | lisi | 66.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 2 |
| 4 | shanghai | 78.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 2 |
| 6 | jerry | 77.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 76.00 | hangzhou | 1 |
+----+----------+-------+----------+-------+
8 rows in set (0.00 sec)
mysql> select * from gg;
+----+---------+
| id | gg_name |
+----+---------+
| 1 | 喬治 |
| 2 | 佩奇 |
| 3 | 蘇西 |
+----+---------+
3 rows in set (0.00 sec)
#篩選佩奇的興趣愛好組的人
mysql> select name,hobby from tt where hobby in(select id from gg where gg_name='佩奇');
+----------+-------+
| name | hobby |
+----------+-------+
| wangwu | 2 |
| zhangsan | 2 |
| tom | 2 |
| aa | 2 |
+----------+-------+
4 rows in set (0.00 sec)
方法二:后面輸出的結果賦予了前面的值
mysql> select name,hobby from tt where hobby=(select id from gg where gg_name='佩奇');
+----------+-------+
| name | hobby |
+----------+-------+
| wangwu | 2 |
| zhangsan | 2 |
| tom | 2 |
| aa | 2 |
+----------+-------+
4 rows in set (0.00 sec)
篩選出喬治與佩奇興趣愛好 的人
mysql> select name,hobby from tt where hobby in (select id from gg);
+----------+-------+
| name | hobby |
+----------+-------+
| wangwu | 2 |
| zhangsan | 2 |
| shanghai | 1 |
| tom | 2 |
| jerry | 1 |
| aa | 2 |
| shuaige | 1 |
+----------+-------+
7 rows in set (0.00 sec)
查看佩奇興趣愛好的人
mysql> select name,hobby from tt where hobby>(select id from gg where gg_name='喬治');
+----------+-------+
| name | hobby |
+----------+-------+
| wangwu | 2 |
| zhangsan | 2 |
| tom | 2 |
| aa | 2 |
+----------+-------+
4 rows in set (0.00 sec)
mysql> select name,hobby from tt where hobby in(select id from gg where gg_name='喬治');
+----------+-------+
| name | hobby |
+----------+-------+
| shanghai | 1 |
| jerry | 1 |
| shuaige | 1 |
+----------+-------+
3 rows in set (0.00 sec)
mysql> select name,hobby from tt where hobby in(select id from gg where gg_name='佩奇');
+----------+-------+
| name | hobby |
+----------+-------+
| wangwu | 2 |
| zhangsan | 2 |
| tom | 2 |
| aa | 2 |
+----------+-------+
4 rows in set (0.00 sec)
mysql> select name,hobby from tt where hobby=(select id from gg where gg_name='佩奇');
+----------+-------+
| name | hobby |
+----------+-------+
| wangwu | 2 |
| zhangsan | 2 |
| tom | 2 |
| aa | 2 |
+----------+-------+
4 rows in set (0.00 sec)
mysql> select name,hobby from tt where hobby!=(select id from gg where gg_name='喬治');
+----------+-------+
| name | hobby |
+----------+-------+
| wangwu | 2 |
| lisi | 0 |
| zhangsan | 2 |
| tom | 2 |
| aa | 2 |
+----------+-------+
5 rows in set (0.00 sec)
mysql> select name,hobby from tt where hobby<>(select id from gg where gg_name='喬治');
+----------+-------+
| name | hobby |
+----------+-------+
| wangwu | 2 |
| lisi | 0 |
| zhangsan | 2 |
| tom | 2 |
| aa | 2 |
+----------+-------+
5 rows in set (0.00 sec)
#總結:經過測驗發現mysql中用<>與!=都是可以的,但sqlserver中不識別!=,所以建議用<>
1.7:mysql算數運算子號
mysql> select 1+5;
+-----+
| 1+5 |
+-----+
| 6 |
+-----+
1 row in set (0.01 sec)
mysql> select 1*5;
+-----+
| 1*5 |
+-----+
| 5 |
+-----+
1 row in set (0.00 sec)
mysql> select 1=5;
+-----+
| 1=5 |
+-----+
| 0 |
+-----+
1 row in set (0.00 sec)
mysql> select 1!=5;
+------+
| 1!=5 |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> <> or != 用于判斷數字,字串,運算式不相等的判斷,如果不相等,回傳值為1,否則回傳值為0.
- 創建一個新表,把nanjing匯入到新表中
mysql> create table xi like tt;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+--------------+
| Tables_in_tt |
+--------------+
| gg |
| tt |
| xi |
+--------------+
3 rows in set (0.00 sec)
mysql> select * from xi;
Empty set (0.00 sec)
mysql> insert into xi select * from tt where id in (select id from tt where address='beijing');
Query OK, 2 rows affected, 1 warning (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 1
mysql> select * from xi;
+----+----------+-------+---------+-------+
| id | name | score | address | hobby |
+----+----------+-------+---------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 3 | zhangsan | 80.00 | beijing | 2 |
+----+----------+-------+---------+-------+
2 rows in set (0.00 sec)
- 把沒有達到80分的人的分數每人加5分
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 2 | lisi | 66.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 2 |
| 4 | shanghai | 78.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 2 |
| 6 | jerry | 77.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 76.00 | hangzhou | 1 |
+----+----------+-------+----------+-------+
8 rows in set (0.00 sec)
mysql> update tt set score=score+5 where score<80;
Query OK, 4 rows affected (0.01 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 2 | lisi | 71.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 2 |
| 4 | shanghai | 83.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 2 |
| 6 | jerry | 82.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 81.00 | hangzhou | 1 |
+----+----------+-------+----------+-------+
8 rows in set (0.00 sec)
- EXIST 這個關鍵字在子查詢時,主要用于判斷子查詢的結果集是否為空,如果不為空, 則回傳 TRUE;反之,則回傳 FALSE,
mysql> select name,score from tt where exists (select id from gg where gg_name='佩奇');
+----------+-------+
| name | score |
+----------+-------+
| wangwu | 80.00 |
| lisi | 71.00 |
| zhangsan | 80.00 |
| shanghai | 83.00 |
| tom | 80.00 |
| jerry | 82.00 |
| aa | 87.00 |
| shuaige | 81.00 |
+----------+-------+
8 rows in set (0.00 sec)
mysql> select name,score from tt where exists (select id from gg where gg_name='任務');
Empty set (0.00 sec)
1.8:NULL值
- 表示缺失的值
- 與數字0或者空白(spaces)是不同的
- 使用IS NULL或IS NOT NULL進行判斷
- NULL值和空值的區別
空值長度為0,不占空間;NULL值的長度為NULL,占用空間
.IS NULL無法判斷空值
空值使用“="或者“<>"來處理
.COUNT()計算時,NULL會忽略,空值會加入計算
NULL里面沒有任何值 ,占用一部分空間
示例
mysql> create table num (id int(4) not null primary key auto_increment,name char(10));
Query OK, 0 rows affected (0.02 sec)
mysql> desc num;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(4) | NO | PRI | NULL | auto_increment |
| name | char(10) | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
mysql> insert into num (id,name) values (2,'tom');
Query OK, 1 row affected (0.01 sec)
mysql> select * from num;
+----+------+
| id | name |
+----+------+
| 2 | tom |
+----+------+
1 row in set (0.00 sec)
mysql> insert into num (id) values (3);
Query OK, 1 row affected (0.01 sec)
mysql> select * from num;
+----+------+
| id | name |
+----+------+
| 2 | tom |
| 3 | NULL |
2 rows in set (0.00 sec)
#在向表內插入記錄或者更新記錄時,如果該欄位沒有 NOT NULL 并且沒有值,這時候新記錄的該欄位將被保存為 NULL
- 進行統計
mysql> select count(id) from num;
+-----------+
| count(id) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
mysql> select count(name) from num;
+-------------+
| count(name) |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
#COUNT()計算時,NULL會忽略,空值會加入計算`
#插入空值
mysql> insert into num (id,name) values (4,'');
mysql> insert into num (id,name) values (4,'');
Query OK, 1 row affected (0.01 sec)
mysql> select * from num;
+----+------+
| id | name |
+----+------+
| 2 | tom |
| 3 | NULL |
| 4 | |
+----+------+
3 rows in set (0.00 sec)
mysql> select count(name) from num;
+-------------+
| count(name) |
+-------------+
| 2 |
+-------------+
1 row in set (0.01 sec)
#可以看出空值會被加入計算 null不會
1.81:查詢name欄位不為空的記錄
mysql> select * from num where name is not null;
+----+------+
| id | name |
+----+------+
| 2 | tom |
| 4 | |
+----+------+
2 rows in set (0.00 sec)
1.82:查詢name欄位為NULL值的記錄
mysql> select * from num where name is null;
+----+------+
| id | name |
+----+------+
| 3 | NULL |
+----+------+
1 row in set (0.00 sec)
二:正則運算式
MySQL 正則運算式通常是在檢索資料庫記錄的時候,根據指定的匹配模式匹配記錄中符合要求的特殊字串,MySQL 的正則運算式使用 REGEXP 這個關鍵字來指定正則運算式的匹配模式,
- 根據指定的匹配模式匹配記錄中符合要求的特殊字符
- 使用REGEXP關鍵字指定匹配模式
- 常用匹配模式
2.1:正則運算式匹配表
| 匹配模式 | 描述 | 實體 |
|---|---|---|
| ^ | 匹配文本的開始字符 | ‘^bd’ 匹配以 bd 開頭的字串 |
| $ | 匹配文本的結束字符 | ‘qn$’ 匹配以 qn 結尾的字串 |
| . | 匹配任何單個字符 | ‘s.t’ 匹配任何s 和t 之間有一個字符的字串 |
| * | 匹配零個或多個在它前面的字符 | ‘fo*t’ 匹配 t 前面有任意個 o |
| + | 匹配前面的字符 1 次或多次 | ‘hom+’ 匹配以 ho 開頭,后面至少一個m 的字串 |
| 字串 | 匹配包含指定的字串 | ‘clo’ 匹配含有 clo 的字串 |
| p1 | p2 | 匹配 p1 或 p2 |
| […] | 匹配字符集合中的任意一個字符 | ‘[abc]’ 匹配 a 或者 b 或者 c |
| [^…] | 匹配不在括號中的任何字符 | ‘[^ab]’ 匹配不包含 a 或者 b 的字串 |
| {n} | 匹配前面的字串 n 次 | ‘g{2}’ 匹配含有 2 個 g 的字串 |
| {n,m} | 匹配前面的字串至少 n 次,至多m 次 | ‘f{1,3}’ 匹配 f 最少 1 次,最多 3 次 |
了解正則運算式的匹配規則之后,就可以將這些規則技巧應用于 SQL 陳述句中,從而可以更準確、更快速的查出所需的記錄,下面通過示例的方式詳細介紹 MySQL 正則運算式的使用方法,
示例:
- 列印以wa為開頭的欄位
mysql> select * from tt where name regexp '^wa';
+----+--------+-------+---------+-------+
| id | name | score | address | hobby |
+----+--------+-------+---------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
+----+--------+-------+---------+-------+
1 row in set (0.00 sec)
- 列印以結尾的欄位
mysql> select * from tt where name regexp 'm$';
+----+------+-------+---------+-------+
| id | name | score | address | hobby |
+----+------+-------+---------+-------+
| 5 | tom | 80.00 | wuxi | 2 |
+----+------+-------+---------+-------+
1 row in set (0.00 sec)
2.11:包含指定字串的記錄
在tt表查詢包含字串zh與ng,且兩個字符之間只有一個字符的name欄位并列印出對應的記錄
mysql> select * from tt where name regexp 'zh.ng';
+----+----------+-------+---------+-------+
| id | name | score | address | hobby |
+----+----------+-------+---------+-------+
| 3 | zhangsan | 80.00 | beijing | 2 |
+----+----------+-------+---------+-------+
1 row in set (0.00 sec)
mysql> select * from tt where name regexp 'sh.';
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 4 | shanghai | 83.00 | hangzhou | 1 |
| 8 | shuaige | 81.00 | hangzhou | 1 |
+----+----------+-------+----------+-------+
2 rows in set (0.00 sec)
2.12:以"."代替字串的任意一個字符的記錄
- 在tt表查詢包含字串zh與ng,且兩個字符之間只有一個字符的name欄位并列印出對應的記錄
mysql> select * from tt where name regexp 'zh.ng';
+----+----------+-------+---------+-------+
| id | name | score | address | hobby |
+----+----------+-------+---------+-------+
| 3 | zhangsan | 80.00 | beijing | 2 |
+----+----------+-------+---------+-------+
1 row in set (0.00 sec)`在這里插入代碼片`
mysql> select * from tt where name regexp 'shu..';
+----+---------+-------+----------+-------+
| id | name | score | address | hobby |
+----+---------+-------+----------+-------+
| 8 | shuaige | 81.00 | hangzhou | 1 |
+----+---------+-------+----------+-------+
1 row in set (0.00 sec)
2.13:匹配包含或者關系的記錄
- 列如,在tt表中查詢包含字串sh或者i欄位并列印對應的欄位記錄
mysql> select * from tt where name regexp 'sh|i';
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 2 | lisi | 71.00 | nanjing | 0 |
| 4 | shanghai | 83.00 | hangzhou | 1 |
| 8 | shuaige | 81.00 | hangzhou | 1 |
+----+----------+-------+----------+-------+
3 rows in set (0.00 sec)
2.14:匹配前面字符的任意多次
- 列如,在tt表中查詢包含三個或者更多的連續的o的name欄位并列印對應的欄位記錄
#這邊我們首先先插入資料
mysql> insert into tt (name,score,address,hobby) values ('00',37,'tianjing',2),('0000',88,'shanghai',3);
#進行查詢表資料
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 2 | lisi | 71.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 2 |
| 4 | shanghai | 83.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 2 |
| 6 | jerry | 82.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 81.00 | hangzhou | 1 |
| 9 | 00 | 37.00 | tianjing | 2 |
| 10 | 0000 | 88.00 | shanghai | 3 |
+----+----------+-------+----------+-------+
10 rows in set (0.00 sec)
##匹配包含00或者更多0的欄位
mysql> select * from tt where name regexp '00*';
+----+------+-------+----------+-------+
| id | name | score | address | hobby |
+----+------+-------+----------+-------+
| 9 | 00 | 37.00 | tianjing | 2 |
| 10 | 0000 | 88.00 | shanghai | 3 |
+----+------+-------+----------+-------+
2 rows in set (0.00 sec)
#*是否能匹配???
mysql> select * from tt where name regexp '*';
ERROR 1139 (42000): Got error 'repetition-operator operand invalid' from regexp
這邊*不是顯示所有 0*顯示前面出現一個或者多個 *是次數的含義
2.15:”+“匹配前面字符至少一次
- 在tt表中查詢包含四個或者更多個0的name欄位并列印對應記錄
mysql> select * from tt where name regexp '^[a-s]';
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 2 | lisi | 71.00 | nanjing | 0 |
| 4 | shanghai | 83.00 | hangzhou | 1 |
| 6 | jerry | 82.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 81.00 | hangzhou | 1 |
+----+----------+-------+----------+-------+
5 rows in set (0.00 sec)
三:運算子
3.1:算數運算子
- MySQL 的運算子用于對記錄中的欄位值進行運算,MySQL
的運算子共有四種,分別是:算術運算子、比較運算子、邏輯運算子和位運算子,下面分別對這四種運算子進行說明, - 用于對記錄中的欄位值進行運算
3.1:運算子號分類
-
算數運算子
-
比較運算子
-
邏輯運算子
-
位運算子
3.11:MYSQL支持使用的運算子號
| 運算子 | 描述 |
|---|---|
| + | 加法 |
| - | 減法 |
| * | 乘法 |
| / | 除法 |
| % | 取余數 |
例如,以 SELECT 命令來實作最基礎的加減乘除運算,具體操作如下所示,
mysql> select 2+3,2*4,6%2,5/2;
+-----+-----+------+--------+
| 2+3 | 2*4 | 6%2 | 5/2 |
+-----+-----+------+--------+
| 5 | 8 | 0 | 2.5000 |
+-----+-----+------+--------+
1 row in set (0.00 sec)
在除法運算和求余數運算中,除數不能為 0,若除數是 0,回傳的結果則為 NULL,需要注意的是,如果有多個運算子,按照先乘除后加減的優先級進行運算,相同優先級的運算 符沒有先后順序,
3.2:比較運算
字串的比較迷人不區分大小寫,可使用binary來區分
3.21:常用比較運算子
| 運算子 | 描述 | 運算子 | 描述 |
|---|---|---|---|
| = | 等于 | IS NOT NULL | 判斷一個值是否不為 NULL |
| > | 大于 | BETWEEN AND | 兩者之間 |
| < | 小于 | IN | 在集合中 |
| >= | 大于等于 | LIKE | 通配符匹配 |
| <= | 小于等于 | GREATEST | 兩個或多個引數時回傳最大值 |
| !=或<> | 不等于 | LEAST | 兩個或多個引數時回傳最小值 |
| IS NULL | 判斷一個值是否為 NULL | REGEXP | 正則運算式 |
3.22:等于運算子
等號(=)是用來判斷數字、字串和運算式是否相等的,如果相等則回傳 1,如果不相等則回傳 0,如果比較的兩者有一個值是 NULL,則比較的結果就是 NULL,其中字符的比較是根據 ASCII 碼來判斷的,如果 ASCII 碼相等,則表示兩個字符相同;如果 ASCII 碼不相等,則表示兩個字符不相同,例如,等于運算子在數字、字串和運算式上的使用,具 體操作如下所示,
mysql> select 2=3,3='3','q'='q',(3+4)=(2+5),'a'=NULL;
+-----+-------+---------+-------------+----------+
| 2=3 | 3='3' | 'q'='q' | (3+4)=(2+5) | 'a'=NULL |
+-----+-------+---------+-------------+----------+
| 0 | 1 | 1 | 1 | NULL |
+-----+-------+---------+-------------+----------+
1 row in set (0.00 sec)
從以上查詢可以看出來:
如果兩者都是整數,則按照整數值進行比較,
- 如果一個整數一個字串,則會自動將字串轉換為數字,再進行比較,
- 如果兩者都是字串,則按照字串進行比較,
- 如果兩者中至少有一個值是 NULL,則比較的結果是 NULL
3.23:不等于運算子
- 不等于號有兩種寫法,分別是<>或者!=,用于針對數字、字串和運算式不相等的比較,如果不相等則回傳 1,如果相等則回傳
0,這點正好跟等于的回傳值相反,需要注意的是不等于運算子不能用于判斷 NULL,
mysql> select 'pan'<>'chou',4!=5,NULL=NULL;
+---------------+------+-----------+
| 'pan'<>'chou' | 4!=5 | NULL=NULL |
+---------------+------+-----------+
| 1 | 1 | NULL |
+---------------+------+-----------+
1 row in set (0.00 sec)
#不等于運算子不能判斷NULL
- 數值與字串是否能比較?
mysql> select 'hhh'=32;
+----------+
| 'hhh'=32 |
+----------+
| 0 |
+----------+
1 row in set, 1 warning (0.00 sec)
mysql> select 'hhh'!=32;
+-----------+
| 'hhh'!=32 |
+-----------+
| 1 |
+-----------+
1 row in set, 1 warning (0.00 sec)
3.24:大于、大于等于、小于、小于等于運算子
- 大于(>)運算子用來判斷左側的運算元是否大于右側的運算元,若大于回傳 1,否則回傳 0,同樣不能用于判斷 NULL,
- 小于(<)運算子用來判斷左側的運算元是否小于右側的運算元,若小于回傳 1,否則回傳 0,同樣不能用于判斷 NULL,
- 大于等于(>=)判斷左側的運算元是否大于等于右側的運算元,若大于等于回傳 1,否則回傳 0,不能用于判斷 NULL,
- 小于等于(<=)判斷左側的運算元是否小于等于右側的運算元,若小于等于回傳 1,否則回傳 0,不能用于判斷 NULL,
數值比較會自動轉換ASCII表的數值
具體內容點擊 https://baike.baidu.com/item/ASCII/309296?fr=aladdin
我們需要大體記住幾個常用Dec(十進制)的就行:
0是48
大寫A是65 B是66 依次往后推算
小寫a是97 b是98
mysql> select 5>3,'a'>'b',3>=4,(5+6)<=(3+2),5<3,3<2,'x'<='y',5<=5.5,'u'>=NULL;
+-----+---------+------+--------------+-----+-----+----------+--------+-----------+
| 5>3 | 'a'>'b' | 3>=4 | (5+6)<=(3+2) | 5<3 | 3<2 | 'x'<='y' | 5<=5.5 | 'u'>=NULL |
+-----+---------+------+--------------+-----+-----+----------+--------+-----------+
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | NULL |
+-----+---------+------+--------------+-----+-----+----------+--------+-----------+
1 row in set (0.00 sec)
3.25: IS NULL、IS NOT NULL
- SNULL 判斷一個值是否為 NULL,如果為 NULL 回傳 1,否則回傳 0,
- IS NOT NULL 判斷一個值是否不為 NULL,如果不為 NULL 回傳 1,否則回傳 0
mysql> select 2 is NULL,'d' is not NULL,NULL IS NULL;
+-----------+-----------------+--------------+
| 2 is NULL | 'd' is not NULL | NULL IS NULL |
+-----------+-----------------+--------------+
| 0 | 1 | 1 |
+-----------+-----------------+--------------+
1 row in set (0.00 sec)
3.26:BETWEEN AND
- BETWEEN AND
比較運算通常用于判斷一個值是否落在某兩個值之間,例如,判斷某數字是否在另外兩個數字之間,也可以判斷某英文字母是否在另外兩個字母之間
mysql> select 5 between 2 and 8,7 between 5 and 10,'d' between 'a' and 'z';
+-------------------+--------------------+-------------------------+
| 5 between 2 and 8 | 7 between 5 and 10 | 'd' between 'a' and 'z' |
+-------------------+--------------------+-------------------------+
| 1 | 1 | 1 |
+-------------------+--------------------+-------------------------+
1 row in set (0.00 sec)
mysql> select 9 between 2 and 8,7 between 5 and 10,8 between 'a' and 'z';
+-------------------+--------------------+-----------------------+
| 9 between 2 and 8 | 7 between 5 and 10 | 8 between 'a' and 'z' |
+-------------------+--------------------+-----------------------+
| 0 | 1 | 0 |
+-------------------+--------------------+-----------------------+
1 row in set, 2 warnings (0.00 sec)
3.27:LEAST、GREATEST
- LEAST:當有兩個或者多個引數時,回傳其中的最小值,如果其中一個值為 NULL,則回傳結果就為 NULL,
- GREATEST:當有兩個或者多個引數時,回傳其中的最大值,如果其中一個值為 NULL, 則回傳結果就為 NULL,
mysql> SELECT least(5,2,3),least('z','d','f'),greatest(1,2,6),greatest('a','d','c');
+--------------+--------------------+-----------------+-----------------------+
| least(5,2,3) | least('z','d','f') | greatest(1,2,6) | greatest('a','d','c') |
+--------------+--------------------+-----------------+-----------------------+
| 2 | d | 6 | d |
+--------------+--------------------+-----------------+-----------------------+
1 row in set (0.00 sec)
min是否能求最小值呢
mysql> select min(2,3,4),min('d','e','f');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '3,4),min('d','e','f')' at line 1
#對了是不能的 min后面只能跟欄位名稱
3.28:IN、NOT IN
- IN 判斷一個值是否在對應的串列中,如果是回傳 1,否則回傳 0,
- NOT IN 判斷一個值是否不在對應的串列中,如果不是回傳 1,否則回傳 0,
mysql> select 2 in (1,2,3,4,5),'c' not in ('a','b','c');
+------------------+--------------------------+
| 2 in (1,2,3,4,5) | 'c' not in ('a','b','c') |
+------------------+--------------------------+
| 1 | 0 |
+------------------+--------------------------+
1 row in set (0.00 sec)
3.29:LIKE、NOT LIKE
- LIKE 用來匹配字串,如果匹配成功則回傳 1,反之回傳 0,LIKE 支持兩種通配符:’%’
用于匹配任意數目的字符,而’_’只能匹配一個字符,NOT LIKE 正好跟 LIKE 相反,如果沒有匹配成功則回傳 1,反之回傳 0,
mysql> select 'fei' like 'shu_','like' like '%e','' not like '%a';
+-------------------+------------------+------------------+
| 'fei' like 'shu_' | 'like' like '%e' | '' not like '%a' |
+-------------------+------------------+------------------+
| 0 | 1 | 1 |
+-------------------+------------------+------------------+
1 row in set (0.00 sec)
3.3:邏輯運算子
- 邏輯運算子又被稱為布爾運算子,通常用來判斷運算式的真偽,如果為真回傳 1,否則回傳 0,真和假也可以用 TRUE 和 FALSE 表示,
- 又被稱布林值運算子
- 用來判斷運算式的真偽
3.31:常用的邏輯運算子號
| 運算子 | 描述 |
|---|---|
| NOT | 或 ! 邏輯非 |
| AND 或 && | 邏輯與 |
| OR 或 | |
| XOR | 邏輯異或 |

3.32:邏輯非
邏輯運算子中最簡單的運算子就是邏輯非,邏輯非使用 NOT 或!表示,邏輯非將跟在它后面的邏輯測驗取反,把真變為假,把假變為真,如果 NOT 后面的運算元為 0 時,所得值為 1;如果運算元為非 0 時,所得值為 0;如果運算元為 NULL 時,所得值為 NULL,例如,對非 0 值和 0 值分別作邏輯非運算,具體操作如下所示,
mysql> select not 0,not 2,!6,!(3-3);
+-------+-------+----+--------+
| not 0 | not 2 | !6 | !(3-3) |
+-------+-------+----+--------+
| 1 | 0 | 0 | 1 |
+-------+-------+----+--------+
1 row in set (0.00 sec)
3.33:邏輯與
- 邏輯與通常用于判斷兩個值或多個值的有效性,如果所有值都是真回傳 1,否則回傳 0,邏輯與使用 AND 或者&&表示,例如,對非 0 值、0
值和 NULL 值分別作邏輯與運算,具體操作如下所示,
mysql> select 3 and 5,0 and 2,0 and NULL,3 and NULL;
+---------+---------+------------+------------+
| 3 and 5 | 0 and 2 | 0 and NULL | 3 and NULL |
+---------+---------+------------+------------+
| 1 | 0 | 0 | NULL |
+---------+---------+------------+------------+
1 row in set (0.00 sec)
3.34:邏輯或
- 邏輯與通常用于判斷兩個值或多個值的有效性,如果所有值都是真回傳 1,否則回傳 0,邏輯與使用 AND 或者&&表示,例如,對非 0 值、0
值和 NULL 值分別作邏輯與運算,
一旦有個非0值,出來就是非0值
mysql> select 2 OR 5,0 OR 3,0 OR NULL,2 OR NULL;
+--------+--------+-----------+-----------+
| 2 OR 5 | 0 OR 3 | 0 OR NULL | 2 OR NULL |
+--------+--------+-----------+-----------+
| 1 | 1 | NULL | 1 |
+--------+--------+-----------+-----------+
1 row in set (0.00 sec)
3.35:邏輯異或
- 兩個非 NULL 值的運算元,如果兩者都是 0 或者都是非 0,則回傳 0;如果一個為 0, 另一個為非 0,則回傳結果為1;當任意一個值為 NULL 時,回傳值為 NULL,例如,對非0 值、0 值和 NULL 值分別作邏輯異或運算,具體操作如下所示,
mysql> SELECT 1 XOR 5,0 XOR 0,0 XOR 3,1 XOR NULL,NULL XOR NULL;
+---------+---------+---------+------------+---------------+
| 1 XOR 5 | 0 XOR 0 | 0 XOR 3 | 1 XOR NULL | NULL XOR NULL |
+---------+---------+---------+------------+---------------+
| 0 | 0 | 1 | NULL | NULL |
+---------+---------+---------+------------+---------------+
1 row in set (0.00 sec)
3.4:位運算子
位運算子實際上是對二進制數進行計算的運算子,MySQL 內位運算會先將運算元變成二進制格式,然后進行位運算,最后在將計算結果從二進制變回到十進制格式,方便用戶查看,
3.41:MYSQL支持的運算子
| 運算子 | 描述 |
|---|---|
| & | 按位與 |
| l | |
| ~ | 按位取反 |
| ^ | 按位異或 |
| << | 按位左移 |
| >> | 按位右移 |
示例:對數字進行按位與、或和取反運算
mysql> select 10&15,10|15,10^15,5 &~1;
+-------+-------+-------+-------+
| 10&15 | 10|15 | 10^15 | 5 &~1 |
+-------+-------+-------+-------+
| 10 | 15 | 5 | 4 |
+-------+-------+-------+-------+
1 row in set (0.00 sec)

- 按位與運算(&),是對應的二進制位都是 1 的,它們的運算結果為 1,否則為 0,所以 10 & 15 的結果為 10,
- 按位或運算(|),是對應的二進制位有一個或兩個為 1 的,運算結果為 1,否則為 0, 所以 10 | 15 的結果為 15,
- 按位異或運算(^),是對應的二進制位不相同時,運算結果 1,否則為 0,所以 10 ^ 15的結果為 5,
- 按位取反(~),是對應的二進制數逐位反轉,即 1 取反后變為 0, 0 取反后變為 1,數字 1 的二進制是 0001,取反后變為
1110, 數字 5 的二進制是 0101,將 1110 和 0101進行求與操作,其結果是二進制的 0100,轉換為十進制就是 4,
列如對數字進行左移動或右移的運算
mysql> select 1<<2;
+------+
| 1<<2 |
+------+
| 4 |
+------+
1 row in set (0.01 sec)
mysql> select 10<<2;
+-------+
| 10<<2 |
+-------+
| 40 |
+-------+
1 row in set (0.00 sec)
<<左移位運算 向左移動兩位,空缺出補0
1<<2
0001
0100 左移后
10<<2
1010
101000 左移后
3.42:運算子的優先級
- 以上不管哪種運算子,在使用程序中都有優先級問題,運算子的優先級決定了不同的運算子在計算程序中的先后順序,級別高的運算子會先進行計算,如果運算子的級別相同, MySQL會按照順序從左到右依次進行計算,如果不確定所使用的運算子的優先級,可以使用()改變優先級,
| 優先級 | 運算子 | 優優先級 | 運算子 |
|---|---|---|---|
| 1 | ! 8 | l | |
| 2 | ~ | 9 | =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN |
| 3 | ^ | 10 | BETWEEN,CASE,WHEN,THEN,ELSE |
| 4 | * | , /(DIV), %(MOD) | 11 |
| 5 | +,- | 12 | &&,AND |
| 6 | >>,<< | 13 | |
| 7 | & | 14 | := |
3.5:連接查詢
- MySQL
的連接查詢,通常都是將來自兩個或多個表的行結合起來,基于這些表之間的共同欄位,進行資料的拼接,首先,要確定一個主表作為結果集,然后將其他表的行有選擇
性的連接到選定的主表結果集上,使用較多的連接查詢包括:內連接、左連接和右連接, - 為了便于理解,這里使用兩個表tt和gg老進行演示
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 2 | lisi | 71.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 2 |
| 4 | shanghai | 83.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 2 |
| 6 | jerry | 82.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 81.00 | hangzhou | 1 |
| 9 | 00 | 37.00 | tianjing | 2 |
| 10 | 0000 | 88.00 | shanghai | 3 |
+----+----------+-------+----------+-------+
10 rows in set (0.00 sec)
mysql> select * from gg;
+----+---------+
| id | gg_name |
+----+---------+
| 1 | 喬治 |
| 2 | 佩奇 |
| 3 | 蘇西 |
+----+---------+
3 rows in set (0.01 sec)
上述操作是將 tt表的每一行與 gg表的每一行進行比較,以檢查它們是否都滿足條件,當滿足條件時,INNER JOIN 將回傳由 tt表和 gg表中的列組成的新行,如果沒有匹配項,查詢將回傳一個空的結果集,
- 具體的INNER JOIN作業原理

如果表中至少有一個匹配項,INNER JOIN 關鍵字將回傳一行,如果沒有匹配項,則不會有輸出結果,
3.51:左連接
- MySQL 除了內連接,還可以使用外連接,區別于 MySQL
外連接是將表分為基礎表和參考表,再依據基礎表回傳滿足條件或不滿足條件的目錄,外連接按照連接時表的順序來分, 有左連接和右連接之分, - 左連接也可以被稱為左外連接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN
關鍵字來表示,左連接以左側表為基礎表,接收左表的所有行,并用這些行與右側參考表中的記錄進行匹配,也就是說匹配左表中的所有行以及右表中符合條件的行, - 查詢出tt表的左右內容,并查詢出T.hobby和G.id相等判斷的gg中的部分
mysql> select T.name,G.gg_name from tt T left join gg G on T.hobby=G.id;
+----------+---------+
| name | gg_name |
+----------+---------+
| shanghai | 喬治 |
| jerry | 喬治 |
| shuaige | 喬治 |
| wangwu | 佩奇 |
| zhangsan | 佩奇 |
| tom | 佩奇 |
| aa | 佩奇 |
| 00 | 佩奇 |
| 0000 | 蘇西 |
| lisi | NULL |
+----------+---------+
10 rows in set (0.00 sec)
#主表全部顯示
從以上左連接查詢結果可以看出,除了匹配的行,還包括了左表中有但右表中沒有的行,如果有表沒有對應值,則使用 NULL 代替,也就是說在左連接查詢中,使用 NULL 值表示右表中沒有找到與左表中匹配的記錄,

3.52:右連接
右連接也被稱為右外連接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關鍵字來表示,右連接跟左連接正好相反,它是以右表為基礎表,用于接收右表中的所有行,并用這些記錄與左表中的行進行匹配,也就是說匹配右表中的每一行及左表中符合條件的記錄,
mysql> select T.name,G.gg_name from tt T left join gg G on T.hobby=G.id;
+----------+---------+
| name | gg_name |
+----------+---------+
| shanghai | 喬治 |
| jerry | 喬治 |
| shuaige | 喬治 |
| wangwu | 佩奇 |
| zhangsan | 佩奇 |
| tom | 佩奇 |
| aa | 佩奇 |
| 00 | 佩奇 |
| 0000 | 蘇西 |
| lisi | NULL |
+----------+---------+
10 rows in set (0.00 sec)
在右連接的查詢結果集中,除了符合匹配規則的行外,還包括右表中有但是左表中不匹 配的行,這些記錄在左表中以 NULL 補足,

四:資料庫函式
MYSQL提供了實作各種功能的函式
4.1:常用的函式分類
- 數學函式
- 聚合函式
- 字串函式
- 日期時間函式
4.2:數學函式
- abs(x)回傳x的絕對值
mysql> select abs(-2),abs(-3.14);
+---------+------------+
| abs(-2) | abs(-3.14) |
+---------+------------+
| 2 | 3.14 |
+---------+------------+
1 row in set (0.00 sec)
mysql> select abs(2),abs(-3.14);
+--------+------------+
| abs(2) | abs(-3.14) |
+--------+------------+
| 2 | 3.14 |
+--------+------------+
1 row in set (0.00 sec)
- rand()回傳0到1的亂數
mysql> select rand();
+--------------------+
| rand() |
+--------------------+
| 0.6662262563279143 |
+--------------------+
1 row in set (0.00 sec)
#取值范圍:0<=x<1
- mod(x,y)回傳x除以y以后的余數
mysql> select mod(5,2);
+----------+
| mod(5,2) |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
- power(x,y)回傳x的y次方
#3的3ci'fan
mysql> select power(3,3);
+------------+
| power(3,3) |
+------------+
| 27 |
+------------+
1 row in set (0.00 sec)
mysql> select power(4,3);
+------------+
| power(4,3) |
+------------+
| 64 |
+------------+
1 row in set (0.00 sec)
- round(x) 回傳離x最近的整數
mysql> select round(2.49);
+-------------+
| round(2.49) |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
mysql> select round(3.67);
+-------------+
| round(3.67) |
+-------------+
| 4 |
+-------------+
1 row in set (0.00 sec)
- sqrt(x)回傳x的平方跟
mysql> select sqrt(4);
+---------+
| sqrt(4) |
+---------+
| 2 |
+---------+
1 row in set (0.00 sec)
mysql> select sqrt(9);
+---------+
| sqrt(9) |
+---------+
| 3 |
+---------+
1 row in set (0.00 sec)
- truncate(x,y)回傳數字x截斷為y位小數的值
mysql> select truncate(3.1415926,2);
+-----------------------+
| truncate(3.1415926,2) |
+-----------------------+
| 3.14 |
+-----------------------+
1 row in set (0.00 sec)
- ceil(x)回傳大于或等于x的最小整數
mysql> select ceil(3.4);
+-----------+
| ceil(3.4) |
+-----------+
| 4 |
+-----------+
1 row in set (0.00 sec)
mysql> select ceil(5.4);
+-----------+
| ceil(5.4) |
+-----------+
| 6 |
+-----------+
1 row in set (0.00 sec)
- greates(x1,x2…)回傳集合中最大得值
- least(x1,x2…)回傳集合中最小的值
mysql> select greatest(11,12,9),least(10,7,14);
+-------------------+----------------+
| greatest(11,12,9) | least(10,7,14) |
+-------------------+----------------+
| 12 | 7 |
+-------------------+----------------+
1 row in set (0.00 sec)
4.3:字串函式
length(x)回傳字串x的值
mysql> select length('aaaa');
+----------------+
| length('aaaa') |
+----------------+
| 4 |
+----------------+
1 row in set (0.00 sec)
mysql> select length('aa aa');
+-----------------+
| length('aa aa') |
+-----------------+
| 5 |
+-----------------+
1 row in set (0.00 sec)
- trim()回傳去除指定格式的值
mysql> select trim('abcd');
+--------------+
| trim('abcd') |
+--------------+
| abcd |
+--------------+
1 row in set (0.00 sec)
mysql> select trim(' abcd');
+---------------+
| trim(' abcd') |
+---------------+
| abcd |
+---------------+
1 row in set (0.00 sec)
mysql> select trim('ab cd');
+---------------+
| trim('ab cd') |
+---------------+
| ab cd |
+---------------+
1 row in set (0.00 sec)
#只能去除前后兩端空格 不能過濾中間的空格
- concat(x,y)將提供的引數x和y拼接成一個字串
mysql> select concat('abc','fff');
+---------------------+
| concat('abc','fff') |
+---------------------+
| abcfff |
+---------------------+
1 row in set (0.00 sec)
#空格是不能被過濾
mysql> select concat('abc',' fff');
+------------------------+
| concat('abc',' fff') |
+------------------------+
| abc fff |
+------------------------+
1 row in set (0.00 sec)
- 字串有空格進行去除相連
mysql> select concat('asd',trim(' qwe'));
+-----------------------------+
| concat('asd',trim(' qwe')) |
+-----------------------------+
| asdqwe |
+-----------------------------+
1 row in set (0.00 sec)
- upper(x)將字串x的所有字母變為大寫字母
- lower(x)將字串x的所有字母變為小寫字母
mysql> select upper('cde'),lower('SDG');
+--------------+--------------+
| upper('cde') | lower('SDG') |
+--------------+--------------+
| CDE | sdg |
+--------------+--------------+
1 row in set (0.00 sec)
- eft(x,y)回傳字串的前y個字符
- right(x,y)回傳字符的后y個字符
mysql> select left('certsd',3);
+------------------+
| left('certsd',3) |
+------------------+
| cer |
+------------------+
1 row in set (0.00 sec)
mysql> select right('certsd',3);
+-------------------+
| right('certsd',3) |
+-------------------+
| tsd |
+-------------------+
1 row in set (0.00 sec)
mysql> select concat(left('certsd',3),right('certsd',3));
+--------------------------------------------+
| concat(left('certsd',3),right('certsd',3)) |
+--------------------------------------------+
| certsd |
+--------------------------------------------+
1 row in set (0.00 sec)
- repeat(x,y)將字串重復y次
mysql> select repeat('qwer',3);
+------------------+
| repeat('qwer',3) |
+------------------+
| qwerqwerqwer |
+------------------+
1 row in set (0.00 sec)
- space(x)回傳x個空格
#做一個內嵌
- replace(x,y,z)將字串z代替字串x中的字符y
mysql> select replace('dd','ua','xx');
+-------------------------+
| replace('dd','ua','xx') |
+-------------------------+
| dd |
+-------------------------+
1 row in set (0.01 sec)
- strcmp(x,y)比較x和y,回傳的值可以為-1,0,1
mysql> select strcmp(14,14);
+---------------+
| strcmp(14,14) |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec)
mysql> select strcmp(27,7);
+--------------+
| strcmp(27,7) |
+--------------+
| -1 |
+--------------+
1 row in set (0.00 sec)
mysql> select strcmp(7,17);
+--------------+
| strcmp(7,17) |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
#比較的是第一個數
- substring(x,y,z)獲取從字串的x中的第y個位置開始長度為z的字串
mysql> select substring('defgdasd',2,3);
+---------------------------+
| substring('defgdasd',2,3) |
+---------------------------+
| efg |
+---------------------------+
1 row in set (0.00 sec)
#substring(完整字串,起始位置,長度)
- reverse(x)將字串x反轉
#倒過來輸出
mysql> select reverse ('abc');
+-----------------+
| reverse ('abc') |
+-----------------+
| cba |
+-----------------+
1 row in set (0.00 sec)
#反過來大寫
mysql> select upper(reverse ('abc'));
+------------------------+
| upper(reverse ('abc')) |
+------------------------+
| CBA |
+------------------------+
1 row in set (0.00 sec)```
4.5:日期時間函式
4.51:常用的日期時間函式
- curdate()回傳當前時間的年月日)
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2020-11-02 |
+------------+
1 row in set (0.00 sec)
- curtime()回傳當前時間的時分秒
mysql> select curtime();
+-----------+
| curtime() |
+-----------+
| 12:03:06 |
+-----------+
1 row in set (0.00 sec)
- now()回傳當前時間的日期和時間
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2020-11-02 12:03:10 |
+---------------------+
1 row in set (0.00 sec)
- mount(x)返日期x中的月份值
mysql> select month('2020-08-25');
+---------------------+
| month('2020-08-25') |
+---------------------+
| 8 |
+---------------------+
1 row in set (0.00 sec)
- week(x)回傳日期x是年度第幾個星期
mysql> select week('2020-08-25');
+--------------------+
| week('2020-08-25') |
+--------------------+
| 34 |
+--------------------+
1 row in set (0.00 sec)
- hour(x)回傳x中的小時值
mysql> select hour('16:35:53');
+------------------+
| hour('16:35:53') |
+------------------+
| 16 |
+------------------+
1 row in set (0.00 sec)
#顯示當前的秒
- dayofweek(x)回傳x是星期幾,1星期日,2是星期一
mysql> select dayofweek(curdate());
+----------------------+
| dayofweek(curdate()) |
+----------------------+
| 2 |
+----------------------+
1 row in set (0.00 sec)
- dayofmonth(x)計算日期x是本月的第幾天
mysql> select dayofmonth(curdate());
+-----------------------+
| dayofmonth(curdate()) |
+-----------------------+
| 2 |
+-----------------------+
1 row in set (0.01 sec)
- dayodyear(x)計算日期x是本年的第幾天
mysql> select dayofyear(curdate());
+----------------------+
| dayofyear(curdate()) |
+----------------------+
| 307 |
+----------------------+
1 row in set (0.00 sec)
五:存盤程序簡介
- 存盤程序簡介
- 是一組為了完成特定功能的SQL陳述句集合
- 比傳統SQL速度更快、執行效率更高
存盤程序的優點
執行一次后,會將生成的二進制代碼駐留緩沖區,提高執行效率
SQL陳述句加上控制陳述句的集合,靈活性高
在服務器端存盤,客戶端呼叫時,降低網路負載
可多次重復被呼叫,可隨時修改,不影響客戶端呼叫
可完成所有的資料庫操作,也可控制資料庫的資訊訪問權限
5.1:創建存盤程序的語法結構
- 使用CREATE PROCEDURE陳述句創建存盤程序
- 創建存盤程序的語法結構
CREATE PROCEDURE<程序名>([程序引數[…..]])<程序體>
[程序引數[.-..]]格式
IN| ouT|lNouTj引數名><型別>
引數分為
- 輸入引數:IN
- 輸出引數:OUT
- 輸入/輸出引數:INOUT
5.11:創建存盤程序
- 存盤程序主題部分,被稱為程序體
- 以BEGIN開始,以END結束,若只有一條SQL陳述句,則可以省略BEGIN-END
- 以DELIMITER開始和結束
mysql>DELIMITER $$ //$$是用戶自定義的結束符
//省略存盤程序其他步驟
mysql> DELIMITER; //分號前有空格
5.12:存盤程序的語法結構
#定義存盤程序
delimiter $$
create procedure存盤程序名(in 引數名引數型別)
begin
#定義變數
declare變數名變數型別
#變數賦值
set變數名=值
sql陳述句1;
sql陳述句2;
…
sql陳述句n;
end$
delimiter;
#呼叫存盤程序
call存盤程序名(實際引數);
#洗掉存盤程序
drop procedure存盤程序名;
- 創建資料庫
mysql> delimiter $$
mysql> create procedure TT()
-> begin
-> select name,score from tt;
-> end$$
mysql> delimiter ; #將陳述句的結束符恢復為分號
- 查詢存盤程序
mysql> show procedure status where db='tt'\G;
*************************** 1. row ***************************
Db: tt
Name: TT
Type: PROCEDURE
Definer: root@localhost
Modified: 2020-11-02 16:44:07
Created: 2020-11-02 16:44:07
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 row in set (0.00 sec)
#不做為where條件篩選會輸出的東西比較多
- 呼叫存盤程序:
mysql> call TT();
+----------+-------+
| name | score |
+----------+-------+
| wangwu | 80.00 |
| lisi | 71.00 |
| zhangsan | 80.00 |
| shanghai | 83.00 |
| tom | 80.00 |
| jerry | 82.00 |
| aa | 87.00 |
| shuaige | 81.00 |
| 00 | 37.00 |
| 0000 | 88.00 |
+----------+-------+
10 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
5.13:存盤程序的引數
MySQL存盤程序的引數用在存盤程序的定義,共有三種引數型別,IN,OUT,INOUT,形式如:
CREATEPROCEDURE 存盤程序名([[IN |OUT |INOUT ] 引數名 資料類形...])
- IN 輸入引數:表示呼叫者向程序傳入值(傳入值可以是字面量或變數)
- OUT 輸出引數:表示程序向呼叫者傳出值(可以回傳多個值)(傳出值只能是變數)
- INOUT 輸入輸出引數:既表示呼叫者向程序傳入值,又表示程序向呼叫者傳出值(值只能是變數) 查看指定用戶資訊
查看指定用戶資訊
mysql> create procedure PP(in my_name varchar(10))
-> begin
-> select name,score from tt where name=my_name;
-> end$$
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> show procedure status where db='tt';
+----+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db | Name | Type | Definer | Modified | Created | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+----+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| tt | PP | PROCEDURE | root@localhost | 2020-11-02 16:55:50 | 2020-11-02 16:55:50 | DEFINER | | utf8 | utf8_general_ci | utf8_general_ci |
| tt | TT | PROCEDURE | root@localhost | 2020-11-02 16:44:07 | 2020-11-02 16:44:07 | DEFINER | | utf8 | utf8_general_ci | utf8_general_ci |
+----+------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
2 rows in set (0.00 sec)
#實作呼叫
mysql> call PP('lisi');
+------+-------+
| name | score |
+------+-------+
| lisi | 71.00 |
+------+-------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
加入控制陳述句
需求:輸入一個成績
把lisi進行分組 輸入76分以上被分配到第一組 76以下改為第二組
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 2 | lisi | 71.00 | nanjing | 0 |
| 3 | zhangsan | 80.00 | beijing | 2 |
| 4 | shanghai | 83.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 2 |
| 6 | jerry | 82.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 81.00 | hangzhou | 1 |
| 9 | 00 | 37.00 | tianjing | 2 |
+----+----------+-------+----------+-------+
9 rows in set (0.00 sec)
mysql> call CC(76);
Query OK, 1 row affected (0.01 sec)
mysql> select * from tt;
+----+----------+-------+----------+-------+
| id | name | score | address | hobby |
+----+----------+-------+----------+-------+
| 1 | wangwu | 80.00 | beijing | 2 |
| 2 | lisi | 76.00 | nanjing | 1 |
| 3 | zhangsan | 80.00 | beijing | 2 |
| 4 | shanghai | 83.00 | hangzhou | 1 |
| 5 | tom | 80.00 | wuxi | 2 |
| 6 | jerry | 82.00 | hangzhou | 1 |
| 7 | aa | 87.00 | shanghai | 2 |
| 8 | shuaige | 81.00 | hangzhou | 1 |
| 9 | 00 | 37.00 | tianjing | 2 |
+----+----------+-------+----------+-------+
9 rows in set (0.00 sec)
#以改好
有任何問題都可以在評論區留言或私聊博主,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/202500.html
標籤:AI
