主頁 >  其他 > 學會MYSQL資料庫高級SQL陳述句一篇就夠了(一一舉例)!!!

學會MYSQL資料庫高級SQL陳述句一篇就夠了(一一舉例)!!!

2020-11-04 20:40:50 其他

博主花了兩天兩夜,整理出一些 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 的字串
p1p2匹配 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判斷一個值是否為 NULLREGEXP正則運算式

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! 8l
2~9=,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN
3^10BETWEEN,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次方
#33ci'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

上一篇:MySQL常用判斷函式總結!!看你都用過沒

下一篇:MyBatis 版本升級引發的線上問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more