- 創建示例表
- 一、order by排序陳述句
- 示例
- 1.單欄位排序
- 2.多欄位排序
- 二、group by 分組陳述句
- 語法結構
- 示例
- 三、limit限制陳述句
- 語法結構
- 示例
- as設定別名陳述句
- 列的別名語法結構:
- 示例
- 1.直接設定別名
- 2.如果表的長度比較長,可以使用AS給表設定別名,在查詢的程序中直接使用別名
- 3.AS還可以作為連接陳述句的運算子
- like陳述句結合通配符
- 常見的通配符
- 示例
- in子查詢(嵌套查詢)陳述句
- 子查詢語法格式
- 示例1
- 示例2
- UPDATE結合子查詢
- 示例
- in結合not用法
- 子查詢上也可以使用比較運算子(=、<、>、>=、<=)
- 子查詢結合EXIST 關鍵字
- NULL 值描述
- 比較null值和空值
- 正則運算式
- 常見的正則運算式
- 示例
- 四、運算子
- 1.常見運算子
- 示例
- 2.比較運算子
- (1)等于運算子
- (2)不等于運算子
- (3)大于、大于等于、小于、小于等于運算子
- (4)IS NULL、IS NOT NULL
- (5)BETWEEN AND
- (6)LEAST、GREATEST
- (7)IN、NOT IN
- (8)LIKE、NOT LIKE
- 3.邏輯運算子
- (1)邏輯非
- (2)邏輯與
- (3)邏輯或
- (4)邏輯異或
- 4.位運算子
- 5.運算子優先級
- 五、連接查詢
- 1.內連接
- 語法格式
- 2.左連接
- 3.右連接
創建示例表
mysql> select * from player;
+----+-----------------------------+-------+
| id | name | level |
+----+-----------------------------+-------+
| 1 | 火狗 | 10 |
| 2 | 裂焰之狂犬 | 10 |
| 3 | 黃鳥—金翅域骨凰 | 15 |
| 4 | 亞洲人 | 14 |
| 5 | 小舞 | 35 |
| 6 | 極東之地的住民 | 47 |
| 7 | 老太太—沉默的智者 | 46 |
| 8 | 皮鞋 | 46 |
| 9 | 暗獄常勝靴 | 46 |
| 10 | 熊崽忽 | 46 |
| 11 | 有著奇怪職業 | 45 |
| 12 | 一樣黑的猥瑣狗熊 | 45 |
| 13 | sagou | 7 |
| 14 | senoku | 15 |
| 15 | shirley | 1 |
| 16 | useless | 1 |
| 17 | guess | 25 |
| 18 | Dog | 24 |
| 19 | leslieF | 3 |
| 20 | oooooo | 23 |
| 21 | ooo | 13 |
| 22 | oooo | 43 |
| 23 | 浩然狂舞曲 | 43 |
+----+-----------------------------+-------+
23 rows in set (0.00 sec)
一、order by排序陳述句
- 使用ORDER BY陳述句來實作排序
- 排序可針對一個或多個欄位
- ASC:升序,默認排序方式
- DESC:降序
ORDER BY的語法結構:
selcet 欄位1,欄位2…… from 表名 order by 欄位1,欄位2…… ASC
selcet 欄位1,欄位2…… from 表名 order by 欄位1,欄位2…… DESC
示例
按關鍵字排序
使用SELECT陳述句可以將需要的資料從MySQL資料庫中查詢出來,如果對查詢的結果進行排序,該如何去實作呢?
可以使用ORDER BY陳述句來完成排序,并最終將排序后的結果回傳給用戶,這個陳述句的排序不光可以針對某一個欄位,
也可以針對多個欄位,以下就是MySQL中ORDERBY陳述句的語法結構,
1.單欄位排序
mysql> select id,name,level from player where level>=45 order by id desc; //降序排列id
+----+-----------------------------+-------+
| id | name | level |
+----+-----------------------------+-------+
| 12 | 一樣黑的猥瑣狗熊 | 45 |
| 11 | 有著奇怪職業 | 45 |
| 10 | 熊崽忽 | 46 |
| 9 | 暗獄常勝靴 | 46 |
| 8 | 皮鞋 | 46 |
| 7 | 老太太—沉默的智者 | 46 |
| 6 | 極東之地的住民 | 47 |
+----+-----------------------------+-------+
7 rows in set (0.00 sec)
2.多欄位排序
ORDER BY后面跟多個欄位時,欄位之間使用英文逗號隔開,
優先級是按先后順序而定,下面以A和B分別表示兩個欄位,
- ORDER BYA,B desc指A用升序,B用降序
- ORDER BY A asc,B desc指A用升序,B用降序;
- ORDER BYA desc,B desc指A用降序,B用降序;
mysql> select id,name,level from player where level>=45 order by level,id asc; //查看level大于等于45并一level,id列升序排列的id,name,level列的資訊,(先排列level,后排列id)
+----+-----------------------------+-------+
| id | name | level |
+----+-----------------------------+-------+
| 11 | 有著奇怪職業 | 45 |
| 12 | 一樣黑的猥瑣狗熊 | 45 |
| 7 | 老太太—沉默的智者 | 46 | //可以看到在level=46的行中,id是以升序排列的
| 8 | 皮鞋 | 46 |
| 9 | 暗獄常勝靴 | 46 |
| 10 | 熊崽忽 | 46 |
| 6 | 極東之地的住民 | 47 |
+----+-----------------------------+-------+
7 rows in set (0.00 sec)
mysql> select id,name,level from player where level>=45 order by level,id desc; //level升序排列,id降序排列
+----+-----------------------------+-------+
| id | name | level |
+----+-----------------------------+-------+
| 12 | 一樣黑的猥瑣狗熊 | 45 |
| 11 | 有著奇怪職業 | 45 |
| 10 | 熊崽忽 | 46 | //可以看到在level=46的行中,id是以降序排列的
| 9 | 暗獄常勝靴 | 46 |
| 8 | 皮鞋 | 46 |
| 7 | 老太太—沉默的智者 | 46 |
| 6 | 極東之地的住民 | 47 |
+----+-----------------------------+-------+
7 rows in set (0.00 sec)
二、group by 分組陳述句
對結果進行分組:通過 SQL 查詢出來的結果,還可以對其進行分組,使用 GROUP BY 陳述句來實作,
- GROUP BY 從字面上看,是以 BY 后面的內容對查詢出的資料進行分組,就是將一個“資料集”劃分成若干個“小區域”,然后針對這些個“小區域”進行資料處理,
- GROUP BY通常都是結合聚合函式一起使用的,常用的聚合函式包括:
計數(COUNT)、求和(SUM)、求平均數(AVG)、最大值(MAX)、最小值(MIN), - GROUP BY 分組的時候可以按一個或多個欄位對結果進行分組處理,
語法結構
SELECT 列名,函式(列名) FROM 表名 WHERE 列名 控制陳述句 GROUP BY 列名;
示例
mysql> select count(name),level from player where level>=45 group by level; //對level列相同的name值進行統計,并顯示
+-------------+-------+
| count(name) | level |
+-------------+-------+
| 2 | 45 |
| 4 | 46 |
| 1 | 47 |
+-------------+-------+
3 rows in set (0.01 sec)
mysql> select count(name),level from player where level>=45 group by level order by count(name) desc; //結合order by陳述句進行排序
+-------------+-------+
| count(name) | level |
+-------------+-------+
| 4 | 46 |
| 2 | 45 |
| 1 | 47 |
+-------------+-------+
3 rows in set (0.00 sec)
三、limit限制陳述句
- limit陳述句來限制結果條目:在使用 MySQL SELECT 陳述句進行查詢時,結果集回傳的是所有匹配的記錄,有時候僅需要回傳第一行或者前幾行,這時候就需要用到 LIMIT 子句,
- LIMIT 的第一個引數是位置偏移量(可選引數),是設定 MySQL 從哪一行開始顯示,
- 如果不設定第一個引數,將會從表中的第一條記錄開始顯示,需要注意的是,第一條記錄的位置偏移量是 0,第二條是 1,以此類推,第二個引數是設定回傳記錄行的最大數目,
語法結構
SELECT 欄位1,欄位2, … FROM 表名 LIMIT [位偏移量,] 限制數目
示例
mysql> select id,name,level from player limit 3; //顯示從第一行往后的3行
+----+--------------------------+-------+
| id | name | level |
+----+--------------------------+-------+
| 1 | 火狗 | 10 |
| 2 | 裂焰之狂犬 | 10 |
| 3 | 黃鳥—金翅域骨凰 | 15 |
+----+--------------------------+-------+
3 rows in set (0.00 sec)
mysql> select id,name,level from player limit 2,3; //顯示從第3行開始往后的3行
+----+--------------------------+-------+
| id | name | level |
+----+--------------------------+-------+
| 3 | 黃鳥—金翅域骨凰 | 15 |
| 4 | 亞洲人 | 14 |
| 5 | 小舞 | 35 |
+----+--------------------------+-------+
3 rows in set (0.00 sec)
mysql> select id,name,level from player order by level desc limit 5; 結合order by 先降序排列,再限制條目
+----+-----------------------------+-------+
| id | name | level |
+----+-----------------------------+-------+
| 6 | 極東之地的住民 | 47 |
| 8 | 皮鞋 | 46 |
| 7 | 老太太—沉默的智者 | 46 |
| 10 | 熊崽忽 | 46 |
| 9 | 暗獄常勝靴 | 46 |
+----+-----------------------------+-------+
5 rows in set (0.00 sec)
as設定別名陳述句
- 在MySQL查詢時,當表的名字比較長或者表內某些欄位比較長時,為了方便書寫或者多次使用相同的表,
- 可以給欄位列或表設定別名,
使用的時候直接使用別名,簡潔明了,增強可讀性, - 設定別名使用AS陳述句,
列的別名語法結構:
SELECT 列名 FROM 表名 AS 別名;
示例
1.直接設定別名
mysql> select count(*) from player; //先使用count統計所有
+----------+
| count(*) |
+----------+
| 23 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) as number from player; //對count設定別名,顯示的 count(*)變為了number
+--------+
| number |
+--------+
| 23 |
+--------+
1 row in set (0.00 sec)
mysql> select count(*) nub from player; //為表設定別名,as是可以省略的
+-----+
| nub |
+-----+
| 23 |
+-----+
1 row in set (0.00 sec)
2.如果表的長度比較長,可以使用AS給表設定別名,在查詢的程序中直接使用別名
mysql> select p.id,p.name from player as p limit 5;
+----+--------------------------+
| id | name |
+----+--------------------------+
| 1 | 火狗 |
| 2 | 裂焰之狂犬 |
| 3 | 黃鳥—金翅域骨凰 |
| 4 | 亞洲人 |
| 5 | 小舞 |
+----+--------------------------+
5 rows in set (0.00 sec)
3.AS還可以作為連接陳述句的運算子
例如,執行以下操作即可實作用一條 SQL陳述句完成在創建表tmp的時候將player表內的資料寫入 tmp 表,
mysql> create table tmp as select * from player;
Query OK, 23 rows affected (0.02 sec)
Records: 23 Duplicates: 0 Warnings: 0
mysql> create table tmp as select * from player; //這里as作為連接運算子,相當于中轉,將player表中的資料匯入tmp表中
Query OK, 23 rows affected (0.02 sec)
Records: 23 Duplicates: 0 Warnings: 0
mysql> select * from tmp;
+----+-----------------------------+-------+
| id | name | level |
+----+-----------------------------+-------+
| 1 | 火狗 | 10 |
| 2 | 裂焰之狂犬 | 10 |
| 3 | 黃鳥—金翅域骨凰 | 15 |
| 4 | 亞洲人 | 14 |
| 5 | 小舞 | 35 |
| 6 | 極東之地的住民 | 47 |
| 7 | 老太太—沉默的智者 | 46 |
| 8 | 皮鞋 | 46 |
……省略部分
注意:
1. 在為表設定別名時,要保證別名不能與資料庫中的其他表的名稱沖突,
2. 列的別名是在結果中有顯示的,而表的別名在結果中沒有顯示,只在執行查詢時使用,是臨時的,
like陳述句結合通配符
- 通配符主要用于替換字串中的部分字符,通過部分字符的匹配將相關結果查詢出來,
- 通常通配符都是跟 LIKE 一起使用的,并協同 WHERE 子句共同來完成查詢任務,
常見的通配符
| 常用的通配符 | 含義 |
|---|---|
| % | 百分號表示零個、一個或多個字符 |
| _ | 下劃線表示單個字符 |
示例
mysql> select * from player where name like 's%'; //顯示所有s開頭的資料
+----+---------+-------+
| id | name | level |
+----+---------+-------+
| 13 | sagou | 7 |
| 14 | senoku | 15 |
| 15 | shirley | 1 |
+----+---------+-------+
3 rows in set (0.00 sec)
mysql> select * from player where name like '%g';
+----+------+-------+
| id | name | level |
+----+------+-------+
| 18 | Dog | 24 |
+----+------+-------+
1 row in set (0.00 sec)
mysql> select * from player where name like '__g'; //兩個下劃線代替兩個字符
+----+------+-------+
| id | name | level |
+----+------+-------+
| 18 | Dog | 24 |
+----+------+-------+
1 row in set (0.00 sec)
mysql> select id,name,level from player where name like '_es%';
+----+---------+-------+
| id | name | level |
+----+---------+-------+
| 19 | leslieF | 3 |
+----+---------+-------+
1 row in set (0.00 sec)
in子查詢(嵌套查詢)陳述句
- 子查詢也被稱作內查詢或者嵌套查詢,是指在一個查詢陳述句里面還嵌套著另一個查詢陳述句子查詢陳述句是先于主查詢陳述句被執行的,
- 其結果作為外層的條件回傳給主查詢進行下一步的查詢過濾,
- 子查詢不僅可以在 SELECT 陳述句中使用,在 INERT、UPDATE、DELETE中也同樣適用,在嵌套的時候,子查詢內部還可以再次嵌套新的子查詢,也就是說可以多層嵌套,
- IN用來判斷某個值是否
子查詢語法格式
<運算式> [NOT] IN <子查詢>
- 當運算式與子查詢回傳的結果集中的某個值相等時,回傳TRUE,否則回傳 FALSE,
- 若啟用了 NOT 關鍵字,則回傳值相反,
- 需要注意的是,子查詢只能回傳一列資料,如果需求比較復雜,一列解決不了問題,可以使用多層嵌套的方式來應對,
- 多數情況下,子查詢都是與SELECT陳述句一起使用的,
示例1
mysql> select name,level from player where id in (select id from player where level>=45); //先查詢level>=45的id資料,在查詢當id滿足上個條件時的name和level欄位的資料,
+-----------------------------+-------+
| name | level |
+-----------------------------+-------+
| 極東之地的住民 | 47 |
| 老太太—沉默的智者 | 46 |
| 皮鞋 | 46 |
| 暗獄常勝靴 | 46 |
| 熊崽忽 | 46 |
| 有著奇怪職業 | 45 |
| 一樣黑的猥瑣狗熊 | 45 |
+-----------------------------+-------+
7 rows in set (0.01 sec)
注意,子查詢是被放到括號內的,這個括號是無法省略的,缺失則會報錯,無法形成子查詢,
示例2
子查詢內要查詢的欄位通常都是一個,查詢后形成結果集供主查詢使用,
子查詢還可以用在 INSERT 陳述句中,子查詢的結果集可以通過 INSERT 陳述句插入到其他的表中,
mysql> select * from tmp;
+----+-----------------------------+-------+
| id | name | level |
+----+-----------------------------+-------+
| 1 | 火狗 | 10 |
| 2 | 裂焰之狂犬 | 10 |
| 3 | 黃鳥—金翅域骨凰 | 15 |
| 4 | 亞洲人 | 14 |
| 5 | 小舞 | 35 |
| 6 | 極東之地的住民 | 47 |
| 7 | 老太太—沉默的智者 | 46 |
| 8 | 皮鞋 | 46 |
……省略部分
mysql> truncate table tmp; //清空tmp表
Query OK, 0 rows affected (0.01 sec)
mysql> select * from tmp; //查看tmp表,資料為空
Empty set (0.00 sec)
mysql> insert into tmp select * from player where id in (select id from player); //將player表的值賦給tmp,注意這里的tmp和play的結構要相同才行
Query OK, 23 rows affected (0.00 sec)
Records: 23 Duplicates: 0 Warnings: 0
UPDATE結合子查詢
- UPDATE內的子查詢,在set更新內容時,可以是單獨的一列,也可以是多列,
示例
mysql> select id,name,level from tmp where id=6;
+------+-----------------------+-------+
| id | name | level |
+------+-----------------------+-------+
| 6 | 極東之地的住民 | 47 |
+------+-----------------------+-------+
1 row in set (0.00 sec)
mysql> update tmp set level = level - 7 where id in (select a.id from (select id from tmp where level >= 47) a); //是level>=47的level值減去7,別名a在這里不能省略
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select id,name,level from tmp where id=6; //查看,確實減去了7
+------+-----------------------+-------+
| id | name | level |
+------+-----------------------+-------+
| 6 | 極東之地的住民 | 40 |
+------+-----------------------+-------+
1 row in set (0.00 sec)
mysql> update tmp set level=47 where id=6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select id,name,level from tmp where id=6;
+------+-----------------------+-------+
| id | name | level |
+------+-----------------------+-------+
| 6 | 極東之地的住民 | 47 |
+------+-----------------------+-------+
1 row in set (0.00 sec)
mysql> delete from tmp where id in (select a.id from (select id from tmp where level=47)a); //注意這里的別名a是不能省略的,否則無法識別id欄位是來自哪里的
Query OK, 1 row affected (0.01 sec)
注意:類似 select 方式的子查詢,MySQL 不支持,需要多引入一層子查詢
mysql> update tmp set level = level - 7 where id in (select id from tmp where level >= 47);
ERROR 1093 (HY000): You can't specify target table 'tmp' for update in FROM clause
in結合not用法
在IN前面還可以添加NOT,其作用與IN相反,表示否定(即不在子查詢的結果集里面),
mysql> select name,level from tmp where id not in (select id from tmp where level < 30); //查詢level不小于30的資料
+-----------------------------+-------+
| name | level |
+-----------------------------+-------+
| 小舞 | 35 |
| 老太太—沉默的智者 | 46 |
| 皮鞋 | 46 |
| 暗獄常勝靴 | 46 |
| 熊崽忽 | 46 |
| 有著奇怪職業 | 45 |
| 一樣黑的猥瑣狗熊 | 45 |
| oooo | 43 |
| 浩然狂舞曲 | 43 |
+-----------------------------+-------+
9 rows in set (0.00 sec)
子查詢上也可以使用比較運算子(=、<、>、>=、<=)
mysql> select id,name,level from tmp where id = (select id from tmp where name='shirley');
+------+---------+-------+
| id | name | level |
+------+---------+-------+
| 15 | shirley | 1 |
+------+---------+-------+
1 row in set (0.00 sec)
子查詢結合EXIST 關鍵字
在子查詢時,EXIST 關鍵字主要用于判斷子查詢的結果集是否為空,如果不為空, 則回傳 TRUE;反之,則回傳FALSE,
mysql> select count(*) as number from tmp where EXISTS (select id from tmp where name='shirley'); //name='shirley'的值是存在的,則統計name的值
+--------+
| number |
+--------+
| 22 |
+--------+
1 row in set (0.00 sec)
NULL 值描述
- 在SQL陳述句使用程序中,經常會碰到NULL這幾個字符,通常使用NULL來表示缺失的值,也就是在表中該欄位是沒有值的,
- 如果在創建表時,限制某些欄位不為空,則可以使用NOT NULL關鍵字,不使用則默認可以為空,
- 在向表內插入記錄或者更新記錄時,如果該欄位沒有NOT NULL并且沒有值,這時候新記錄的該欄位將被保存為 NULL,
- 需要注意的是,NULL 值與數字 0 或者空白(spaces)的欄位是不同的,值為NULL的欄位是沒有值的,
- 在SQL陳述句中,使用IS NULL可以判斷表內的某個欄位是不是NULL值,相反的用IS NOT NULL 可以判斷不是NULL值,
################首先創建一個表用于測驗#######################################
mysql> CREATE TABLE `test` (
-> `id` int(10) NOT NULL AUTO_INCREMENT,
-> `NAME` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
-> `level` int(10) NOT NULL,
-> `coin` int(32),
-> PRIMARY KEY (id)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test(name,level) values('aa',10); //插入資料
Query OK, 1 row affected (0.01 sec)
mysql> insert into test(name,level,coin) values('ab',20,100);
Query OK, 1 row affected (0.01 sec)
mysql> select * from test; //coin欄位未插入資料默認為null
+----+------+-------+------+
| id | NAME | level | coin |
+----+------+-------+------+
| 1 | aa | 10 | NULL |
| 2 | ab | 20 | 100 |
+----+------+-------+------+
2 rows in set (0.00 sec)
mysql> select * from test where coin is null; //查詢出coin欄位為null的資料
+----+------+-------+------+
| id | NAME | level | coin |
+----+------+-------+------+
| 1 | aa | 10 | NULL |
+----+------+-------+------+
1 row in set (0.00 sec)
mysql> select * from test where coin is not null; //查詢出coin欄位不為null的資料
+----+------+-------+------+
| id | NAME | level | coin |
+----+------+-------+------+
| 2 | ab | 20 | 100 |
+----+------+-------+------+
1 row in set (0.00 sec)
比較null值和空值
提到 NULL 值就不得不說下空值,空值就是在表的欄位中存盤空字符(‘’)
二者的區別如下:
- 空值的長度為 0,不占用空間的;而NULL值的長度是 NULL,是占用空間的,
- IS NULL 或者 IS NOT NULL,是用來判斷欄位是不是為 NULL 或者不是 NULL,不能查出是不是空值的,
- 空值的判斷使用=’’或者<>’’來處理,
- 在通過 count()計算有多少記錄數時,如果遇到 NULL 值會自動忽略掉,遇到空值會加入到記錄中進行計算,
mysql> select coin from test;
+------+
| coin |
+------+
| NULL |
| 100 |
| 123 |
+------+
3 rows in set (0.00 sec)
mysql> select count(coin) from test; //null值是不計入統計的
+-------------+
| count(coin) |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
mysql> alter table test add cxxx char(8) default''; //插入一個默認為空的欄位
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into test(name,level,coin,cxxx) values('cd',30,111,'lll');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test; //cxxx欄位有3個空值,1個有效值
+----+------+-------+------+------+
| id | NAME | level | coin | cxxx |
+----+------+-------+------+------+
| 1 | aa | 10 | NULL | |
| 2 | ab | 20 | 100 | |
| 3 | bc | 30 | 123 | |
| 4 | cd | 30 | 111 | lll |
+----+------+-------+------+------+
4 rows in set (0.00 sec)
mysql> select count(cxxx) from test; //空值是參與count統計的
+-------------+
| count(cxxx) |
+-------------+
| 4 |
+-------------+
1 row in set (0.00 sec)
mysql> select * from test where cxxx=''; //查詢cxxx欄位為空值的資料
+----+------+-------+------+------+
| id | NAME | level | coin | cxxx |
+----+------+-------+------+------+
| 1 | aa | 10 | NULL | |
| 2 | ab | 20 | 100 | |
| 3 | bc | 30 | 123 | |
+----+------+-------+------+------+
3 rows in set (0.00 sec)
mysql> select * from test where cxxx<> ''; //查詢cxxx欄位不為空值的資料
+----+------+-------+------+------+
| id | NAME | level | coin | cxxx |
+----+------+-------+------+------+
| 4 | cd | 30 | 111 | lll |
+----+------+-------+------+------+
1 row in set (0.00 sec)
正則運算式
- MySQL 正則運算式通常是在檢索資料庫記錄的時候,根據指定的匹配模式匹配記錄中符合要求的特殊字串,
- MySQL 的正則運算式使用 REGEXP 這個關鍵字來指定正則運算式的匹配模式,REGEXP 運算子所支持的匹配模式
常見的正則運算式
| 匹配模式 | 描述 | 描述 |
|---|---|---|
| ^ | 匹配文本的開始字符 | ‘^bd’ 匹配以 bd 開頭的字串 |
| $ | 匹配文本的結束字符 | ‘qn$’ 匹配以 qn 結尾的字串 |
| . | 匹配任何單個字符 | ‘s.t’ 匹配任何s 和t 之間有一個字符的字串 |
| * | 匹配零個或多個在它前面的字符 | ‘fo*t’ 匹配 t 前面有任意個 o |
| + | 匹配前面的字符 1 次或多次 | ‘hom+’ 匹配以 ho 開頭,后面至少一個 |
| ‘字串’ | 匹配包含指定的字串 | ‘clo’ 匹配含有 clo 的字串 |
| p1|p2 | 匹配 p1 或 p2 | ‘bg|fg’ 匹配 bg 或者 fg |
| […] | 匹配字符集合中的任意一個字符 | ‘[abc]’ 匹配 a 或者 b 或者 c |
| [^…] | 匹配不在括號中的任何字符 | ‘[^ab]’ 匹配不包含 a 或者 b 的字串 |
| {n} | 匹配前面的字串 n 次 | ‘g{2}’ 匹配含有 2 個 g 的字串 |
| {n,m} | 匹配前面的字串至少 n 次,至多m 次 | ‘f{1,3}’ 匹配 f 最少 1 次,最多 3 次 |
示例
mysql> select id,name,level from player where name REGEXP '^us'; //匹配us開頭的資料
+----+---------+-------+
| id | name | level |
+----+---------+-------+
| 16 | useless | 1 |
+----+---------+-------+
1 row in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP 'ss$';
+----+---------+-------+
| id | name | level |
+----+---------+-------+
| 16 | useless | 1 |
| 17 | guess | 25 |
+----+---------+-------+
2 rows in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP 'ok'; //查詢包含ok字符的資料
+----+--------+-------+
| id | name | level |
+----+--------+-------+
| 14 | senoku | 15 |
+----+--------+-------+
1 row in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP 'shir.ey'; //以.代替一個字符
+----+---------+-------+
| id | name | level |
+----+---------+-------+
| 15 | shirley | 1 |
+----+---------+-------+
1 row in set (0.01 sec)
mysql> select id,name,level from player where name REGEXP '[^a-z]';
+----+-----------------------------+-------+
| id | name | level |
+----+-----------------------------+-------+
| 1 | 火狗 | 10 |
| 2 | 裂焰之狂犬 | 10 |
| 3 | 黃鳥—金翅域骨凰 | 15 |
| 4 | 亞洲人 | 14 |
| 5 | 小舞 | 35 |
| 6 | 極東之地的住民 | 47 |
| 7 | 老太太—沉默的智者 | 46 |
| 8 | 皮鞋 | 46 |
| 9 | 暗獄常勝靴 | 46 |
| 10 | 熊崽忽 | 46 |
| 11 | 有著奇怪職業 | 45 |
| 12 | 一樣黑的猥瑣狗熊 | 45 |
| 23 | 浩然狂舞曲 | 43 |
+----+-----------------------------+-------+
13 rows in set (0.00 sec)
mysql> select id,name,level from player where name REGEXP '^[a-z]';
+----+---------+-------+
| id | name | level |
+----+---------+-------+
| 13 | sagou | 7 |
| 14 | senoku | 15 |
| 15 | shirley | 1 |
| 16 | useless | 1 |
| 17 | guess | 25 |
| 18 | Dog | 24 |
| 19 | leslieF | 3 |
| 20 | oooooo | 23 |
| 21 | ooo | 13 |
| 22 | oooo | 43 |
+----+---------+-------+
10 rows in set (0.00 sec)
四、運算子
MySQL 的運算子用于對記錄中的欄位值進行運算,MySQL 的運算子共有四種,分別是:算術運算子、比較運算子、邏輯運算子和位運算子,
1.常見運算子
| 運算子 | 描述 |
|---|---|
| + | 加法 |
| - | 減法 |
| * | 乘法 |
| / | 除法 |
| % | 取余數 |
示例
mysql> create table lls as (select 1+2 as addition, 2-1 as subtraction, 2*3 as multiplication, 4/2 as division, 8%2 as remainder);
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from lls;
+----------+-------------+----------------+----------+-----------+
| addition | subtraction | multiplication | division | remainder |
+----------+-------------+----------------+----------+-----------+
| 3 | 1 | 6 | 2.0000 | 0 |
+----------+-------------+----------------+----------+-----------+
1 row in set (0.00 sec)
mysql> select 1+1 as addition, 4-1 as subtraction, 2*7 as multiplication, 4/0 as division, 4%2 as remainder;
+----------+-------------+----------------+----------+-----------+
| addition | subtraction | multiplication | division | remainder |
+----------+-------------+----------------+----------+-----------+
| 2 | 3 | 14 | NULL | 0 |
+----------+-------------+----------------+----------+-----------+
1 row in set, 1 warning (0.00 sec)
注意:
- 在除法運算和求余數運算中,除數不能為 0,若除數是 0,回傳的結果則為 NULL,
- 如果有多個運算子,按照先乘除后加減的優先級進行運算,相同優先級的運算 符沒有先后順序,
- 在 MySQL 的欄位值內還有一種情況:某些字串型別的欄位存盤的數字型字串,這些欄位在進行算術運算時將會被自動轉換為數字的值,
- 如果字串的開始部分是數字,在轉 換時將被轉換為這個數字,如果是既包含字符又包含數字得的混合字串,無法轉換為數字時,將被轉換為 0,這些細節在進行算術運算時需多加注意,
2.比較運算子
- 比較運算子是查詢資料記錄時經常使用的一類運算子,通過使用比較運算子可以判斷出 表中有哪些記錄是符合條件的,如果比較的結果為真則回傳 1,如果為假則回傳 0,
- 比較的結果如果不確定則回傳 NULL,其中字串在進行比較的時候默認是不區分大小寫的,如果要區分大小寫可以通過 binary 關鍵字來實作,常用的比較運算子
| 運算子 | 描述 |
|---|---|
| = | 等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| !=或<> | 不等于 |
| IS NULL | 判斷一個值是否為 NULL |
| IS NOT NULL | 判斷一個值是否不為 NULL |
| BETWEEN AND | 兩者之間 |
| IN | 在集合中 |
| LIKE | 通配符匹配 |
| GREATEST | 兩個或多個引數時回傳最大值 |
| LEAST | 兩個或多個引數時回傳最小值 |
| REGEXP | 正則運算式 |
(1)等于運算子
等號(=)是用來判斷數字、字串和運算式是否相等的,如果相等則回傳1,如果不相等則回傳0,
如果比較的兩者有一個值是 NULL,則比較的結果就是 NULL,其中字符的比較是根據 ASCII 碼來判斷的,
如果 ASCII 碼相等,則表示兩個字符相同;如果ASCII碼不相等,則表示兩個字符不相同,
mysql> select 2=4,2='2','e'='e',(2+2)=(3+1),'r'=NULL;
+-----+-------+---------+-------------+----------+
| 2=4 | 2='2' | 'e'='e' | (2+2)=(3+1) | 'r'=NULL |
+-----+-------+---------+-------------+----------+
| 0 | 1 | 1 | 1 | NULL |
+-----+-------+---------+-------------+----------+
1 row in set (0.00 sec)
總結:
- 如果兩者都是整數,則按照整數值進行比較,
- 如果一個整數一個字串,則會自動將字串轉換為數字,再進行比較,
- 如果兩者都是字串,則按照字串進行比較,
- 如果兩者中至少有一個值是 NULL,則比較的結果是 NULL,
(2)不等于運算子
- 不等于號有兩種寫法,分別是<>或者!=,用于針對數字、字串和運算式不相等的比較,
- 如果不相等則回傳 1,如果相等則回傳 0,這點正好跟等于的回傳值相反,需要注意的是不等于運算子不能用于判斷 NULL,
mysql> select 'ltp'<>'ltp', 1<>2, 3!=3, 2.5!=2, NULL<>NULL ;
+--------------+------+------+--------+------------+
| 'ltp'<>'ltp' | 1<>2 | 3!=3 | 2.5!=2 | NULL<>NULL |
+--------------+------+------+--------+------------+
| 0 | 1 | 0 | 1 | NULL |
+--------------+------+------+--------+------------+
1 row in set (0.01 sec)
(3)大于、大于等于、小于、小于等于運算子
- 大于(>)運算子用來判斷左側的運算元是否大于右側的運算元,若大于回傳 1,否則回傳 0,同樣不能用于判斷 NULL,
- 小于(<)運算子用來判斷左側的運算元是否小于右側的運算元,若小于回傳 1,否則回傳 0,同樣不能用于判斷 NULL,
- 大于等于(>=)判斷左側的運算元是否大于等于右側的運算元,若大于等于回傳 1,否則回傳 0,不能用于判斷 NULL,
- 小于等于(<=)判斷左側的運算元是否小于等于右側的運算元,若小于等于回傳 1,否則回傳 0,不能用于判斷 NULL,
mysql> select 5>4,'a'>'b',2>=3,(2+3)>=(1+2),4.4<3,1<2,'x'<='y',5<=5.5,'u'>=NULL;
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
| 5>4 | 'a'>'b' | 2>=3 | (2+3)>=(1+2) | 4.4<3 | 1<2 | 'x'<='y' | 5<=5.5 | 'u'>=NULL |
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | NULL |
+-----+---------+------+--------------+-------+-----+----------+--------+-----------+
1 row in set (0.00 sec)
(4)IS NULL、IS NOT NULL
- IS NULL 判斷一個值是否為 NULL,如果為 NULL 回傳 1,否則回傳 0,
- IS NOT NULL 判斷一個值是否不為 NULL,如果不為 NULL 回傳 1,否則回傳 0,例如,關于數字、字符和 NULL 值的運用,
mysql> select 2 IS NULL,'f' IS NOT NULL,NULL IS NULL;
+-----------+-----------------+--------------+
| 2 IS NULL | 'f' IS NOT NULL | NULL IS NULL |
+-----------+-----------------+--------------+
| 0 | 1 | 1 |
+-----------+-----------------+--------------+
1 row in set (0.00 sec)
- IS NULL:判斷為空
- IS NOT NULL :判斷不為空
- 兩者只是有無 NOT 這個關鍵字的區別,同時回傳值不同,
(5)BETWEEN AND
BETWEEN AND 比較運算通常用于判斷一個值是否落在某兩個值之間,例如,判斷某數字是否在另外兩個數字之間,也可以判斷某英文字母是否在另外兩個字母之間
mysql> select 4 BETWEEN 2 AND 6,5 BETWEEN 6 AND 8,'c' BETWEEN 'a' AND 'f';
+-------------------+-------------------+-------------------------+
| 4 BETWEEN 2 AND 6 | 5 BETWEEN 6 AND 8 | 'c' BETWEEN 'a' AND 'f' |
+-------------------+-------------------+-------------------------+
| 1 | 0 | 1 |
+-------------------+-------------------+-------------------------+
1 row in set (0.00 sec)
(6)LEAST、GREATEST
- LEAST:當有兩個或者多個引數時,回傳其中的最小值,如果其中一個值為 NULL,則回傳結果就為 NULL,
- GREATEST:當有兩個或者多個引數時,回傳其中的最大值,如果其中一個值為 NULL, 則回傳結果就為 NULL,
mysql> SELECT least(1,2,3),least('a','b','c'),greatest(1,2,3),greatest('a','b','c');
+--------------+--------------------+-----------------+-----------------------+
| least(1,2,3) | least('a','b','c') | greatest(1,2,3) | greatest('a','b','c') |
+--------------+--------------------+-----------------+-----------------------+
| 1 | a | 3 | c |
+--------------+--------------------+-----------------+-----------------------+
1 row in set (0.00 sec)
總結:
- LEAST 比較的引數為數字時,回傳的是其中最小的值;當比較的引數為字串時,回傳字母表中順序最靠前的字符,
- GREATEST 比較的引數為數字時, 回傳的是其中最大的值;當比較的引數為字串時,回傳字母表中順序最靠后的字符,
(7)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)
(8)LIKE、NOT LIKE
- LIKE 用來匹配字串,如果匹配成功則回傳 1,反之回傳 0,
- LIKE 支持兩種通配符:’%’ 用于匹配任意數目的字符,而’_’只能匹配一個字符,
- NOT LIKE 正好跟 LIKE 相反,如果沒有匹配成功則回傳 1,反之回傳 0,
例如,若要判斷某字串能否匹配成功,分單字符匹配和多字符匹配,也可以判斷不匹配.
mysql> SELECT 'ltp' LIKE 'ly_','lpp' LIKE '%p','etc' NOT LIKE '%th';
+------------------+-----------------+----------------------+
| 'ltp' LIKE 'ly_' | 'lpp' LIKE '%p' | 'etc' NOT LIKE '%th' |
+------------------+-----------------+----------------------+
| 0 | 1 | 1 |
+------------------+-----------------+----------------------+
1 row in set (0.00 sec)
3.邏輯運算子
邏輯運算子又被稱為布爾運算子,通常用來判斷運算式的真偽,如果為真回傳 1,否則回傳 0,
真和假也可以用 TRUE 和 FALSE 表示,MySQL 中支持使用的邏輯運算子有四種,
| 運算子 | 描述 |
|---|---|
| NOT 或 ! | 邏輯非 |
| AND 或 && | 邏輯與 |
| OR 或|| | 邏輯或 |
| XOR | 邏輯異或 |
(1)邏輯非
邏輯運算子中最簡單的運算子就是邏輯非,邏輯非使用 NOT 或!表示,邏輯非將跟在它后面的邏輯測驗取反,把真變為假,把假變為真,如果 NOT 后面的運算元為 0 時,所得值為 1;如果運算元為非 0 時,所得值為 0;如果運算元為 NULL 時,所得值為 NULL,
mysql>SELECT not 2,!3,not 0,!(4-4);
+-------+----+--------+--------+
| not 2 | !3 | not 0 | !(4-4) |
+-------+----+--------+--------+
| 0 | 0 | 1 | 1 |
+-------+----+--------+--------+
1 row in set (0.00 sec)
(2)邏輯與
- 邏輯與通常用于判斷兩個值或多個值的有效性,如果所有值都是真回傳 1,否則回傳 0,遇0則為0
- 邏輯與使用 AND 或者&&表示,
mysql> SELECT 2 AND 3,4 && 0,0 && NULL,1 AND NULL;
+---------+--------+-----------+------------+
| 2 AND 3 | 4 && 0 | 0 && NULL | 1 AND NULL |
+---------+--------+-----------+------------+
| 1 | 0 | 0 | NULL |
+---------+--------+-----------+------------+
1 row in set (0.00 sec)
(3)邏輯或
- 邏輯或表示包含的運算元,任意一個為非零值并且不是 NULL 值時,回傳 1,否則回傳0,
- 邏輯或通常使用 OR 或者||來表示,
mysql>SELECT 2 OR 3,4 || 0,0 OR NULL,1 || NULL; ### ||這種方式不準確,or比較靠譜
+--------+--------+-----------+-----------+
| 2 OR 3 | 4 || 0 | 0 OR NULL | 1 || NULL |
+--------+--------+-----------+-----------+
| 1 | 1 | NULL | 1 |
+--------+--------+-----------+-----------+
1 row in set (0.00 sec)
(4)邏輯異或
- 兩個非 NULL 值的運算元,如果兩者都是 0 或者都是非 0,則回傳 0;如果一個為 0, 另一個為非 0,則回傳結果為1;
- 當任意一個值為 NULL 時,回傳值為 NULL,
mysql>SELECT 2 XOR 3,0 XOR 0,0 XOR 5,1 XOR NULL,NULL XOR NULL;
+---------+---------+---------+------------+---------------+
| 2 XOR 3 | 0 XOR 0 | 0 XOR 5 | 1 XOR NULL | NULL XOR NULL |
+---------+---------+---------+------------+---------------+
| 0 | 0 | 1 | NULL | NULL |
+---------+---------+---------+------------+---------------+
1 row in set (0.00 sec)
4.位運算子
位運算子實際上是對二進制數進行計算的運算子,MySQL 內位運算會先將運算元變成二進制格式,然后進行位運算,最后在將計算結果從二進制變回到十進制格式,方便用戶查看,MySQL 支持 6 種位運算子
| 運算子 | 描述 |
|---|---|
| & | 按位與 |
| | | 按位或 |
| ~ | 按位取反 |
| ^ | 按位異或 |
| << | 按位左移 |
| >> | 按位右移 |
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)
以第一個邏輯與 10&15 為例
10= 1 0 1 0
15= 1 1 1 1
____________
邏輯與: 1 0 1 0 =10
mysql> SELECT 1<<2, 2<<2,10>>2,15>>2;
+------+------+-------+-------+
| 1<<2 | 2<<2 | 10>>2 | 15>>2 |
+------+------+-------+-------+
| 4 | 8 | 2 | 3 |
+------+------+-------+-------+
1 row in set (0.00 sec)
1<<2 :1向左偏移兩位,即:001變為100=4
10>>2:10向右偏移兩位,即:1010變為0010=2 ;偏移后超出的位數將被移除并丟棄,不足的位用0補齊
5.運算子優先級
以上不管哪種運算子,在使用程序中都有優先級問題,運算子的優先級決定了不同的運 算符在計算程序中的先后順序,級別高的運算子會先進行計算,如果運算子的級別相同, MySQL 會按照順序從左到右依次進行計算,如果不確定所使用的運算子的優先級,可以使用()改變優先級,“!”的優先級最高,而“:=”的優先級最低,
| 優先級 | 運算子 |
|---|---|
| 1 | ! |
| 2 | ~ |
| 3 | ^ |
| 4 | * , /(DIV), %(MOD) |
| 5 | +,- |
| 6 | >>,<< |
| 7 | & |
| 8 | | |
| 9 | =,<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN |
| 10 | BETWEEN,CASE,WHEN,THEN,ELSE |
| 11 | NOT |
| 12 | &&,AND |
| 13 | ||,OR,XOR |
| 14 | := |
五、連接查詢
MySQL 的連接查詢,通常都是將來自兩個或多個表的行結合起來,基于這些表之間的共同欄位,進行資料的拼接,
首先,要確定一個主表作為結果集,然后將其他表的行有選擇性的連接到選定的主表結果集上,使用較多的連接查詢包括:內連接、左連接和右連接,
MySQL 除了內連接,還可以使用外連接,區別于 MySQL 外連接是將表分為基礎表和參考表,再依據基礎表回傳滿足條件或不滿足條件的記錄,外連接按照連接時表的順序來分,
有左連接和右連接之分,
這里使用兩個表 a_player 和 b_player 來進行演示,首先需要創建這兩個表,然后插入一些初始資料,
CREATE TABLE `a_player` (
`a_id` int(11) DEFAULT NULL,
`a_name` varchar(32) DEFAULT NULL,
`a_level` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `b_player` (
`b_id` int(11) DEFAULT NULL,
`b_name` varchar(32) DEFAULT NULL,
`b_level` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into a_player(a_id, a_name, a_level) values(1, 'aaaa', 10);
insert into a_player(a_id, a_name, a_level) values(2, 'bbbb', 20);
insert into a_player(a_id, a_name, a_level) values(3, 'cccc', 30);
insert into a_player(a_id, a_name, a_level) values(4, 'dddd', 40);
insert into b_player(b_id, b_name, b_level) values(2, 'bbbb', 20);
insert into b_player(b_id, b_name, b_level) values(3, 'cccc', 30);
insert into b_player(b_id, b_name, b_level) values(5, 'eeee', 50);
insert into b_player(b_id, b_name, b_level) values(6, 'ffff', 60);
mysql> select * from a_player;
+------+--------+---------+
| a_id | a_name | a_level |
+------+--------+---------+
| 1 | aaaa | 10 |
| 2 | bbbb | 20 |
| 3 | cccc | 30 |
| 4 | dddd | 40 |
+------+--------+---------+
4 rows in set (0.00 sec)
mysql> select * from b_player;
+------+--------+---------+
| b_id | b_name | b_level |
+------+--------+---------+
| 2 | bbbb | 20 |
| 3 | cccc | 30 |
| 5 | eeee | 50 |
| 6 | ffff | 60 |
+------+--------+---------+
4 rows in set (0.00 sec)
1.內連接
MySQL 中的內連接就是兩張或多張表中同時符合某種條件的資料記錄的組合,通常在FROM 子句中使用關鍵字 INNER JOIN 來連接多張表,并使用 ON 子句設定連接條件,
- 兩張或多張表中同時符合某種條件的資料記錄組合
- FROM子句中使用INNERJOIN關鍵字連接多張表,并使用ON設定連接條件
- 是系統默認的表連接方式,可以省略INNER關鍵字
- 多表支持連續使用INNER JOIN,建議不超過三個表

語法格式
SELECT 欄位 FROM 表1 INNER JOIN 表2 ON 表1.欄位 = 表2.欄位;
示例:在剛才創建的 a_player 和 b_player 表中使用內連接查詢出通過判斷 a_id 和 b_id 相等,包含在兩個表內的部分
mysql> select a_id id,a_name,a_level from a_player inner join b_player on a_id=b_id;
+------+--------+---------+
| id | a_name | a_level |
+------+--------+---------+
| 2 | bbbb | 20 |
| 3 | cccc | 30 |
+------+--------+---------+
2 rows in set (0.00 sec)
- 上述操作是將 a_player 表的每一行與 b_player 表的每一行進行比較,以檢查它們是否都滿足條件,當滿足條件時,INNER JOIN 將回傳由 a_player 表中的列組成的行,如果沒有匹配項,查詢將回傳一個空的結果集,INNER JOIN 結果集中的行必須出現在兩個表 a_player 和 b_player 中,是這兩個表的交叉部分,即a_id=b_id的部分
- 如果表中至少有一個匹配項,INNER JOIN 關鍵字將回傳一行,如果沒有匹配項,則不會有輸出結果,
2.左連接
- 左連接也可以被稱為左外連接,
- 在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 關鍵字來表示,
- 左連接以左側表為基礎表,接收左表的所有行,并用這些行與右側參考表中的記錄進行匹配,也就是說匹配左表中的所有行以及右表中符合條件的行,

示例,從a_player 和 b_player 表中,查詢出 a_player 表中所有內容,并且查詢出通過 a_id 和 b_id 相等判斷出的 b_player 中的部分,具體操作如下,
mysql> select * from a_player a left join b_player b on a.a_id=b.b_id;
+------+--------+---------+------+--------+---------+
| a_id | a_name | a_level | b_id | b_name | b_level |
+------+--------+---------+------+--------+---------+
| 2 | bbbb | 20 | 2 | bbbb | 20 |
| 3 | cccc | 30 | 3 | cccc | 30 |
| 1 | aaaa | 10 | NULL | NULL | NULL |
| 4 | dddd | 40 | NULL | NULL | NULL |
+------+--------+---------+------+--------+---------+
4 rows in set (0.00 sec)
總結:
- 從以上左連接查詢結果可以看出,除了匹配的行,a_id 和 b_id 是 2 和 3 那兩行,還包括了左表中有但右表中沒有的行,如果有表沒有對應值,則使用 NULL 代替,也就是說在左連接查詢中,使用 NULL 值表示右表中沒有找到與左表中匹配的記錄,
- 從原理圖可以看出,左連接中左表的記錄將會全部表示出來,而右表只會顯示符合搜索 條件的記錄,也就是圖中交叉的部分,右表記錄不足的地方均為 NULL,
3.右連接
- 右連接也被稱為右外連接.
- 在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關鍵字來表示,
- 右連接跟左連接正好相反,它是以右表為基礎表,用于接收右表中的所有行,并用這些記錄與左表中的行進行匹配,也就是說匹配右表中的每一行及左表中符合條件的記錄,

例如,從 a_player 和 b_player 表中,查詢出在 b_player 表內的所有記錄,并且通過判斷 a_id 和 b_id 相等,在 a_player 表內的部分,具體的實作操作如下所示,
mysql> select * from a_player a right join b_player b on a.a_id=b.b_id;
+------+--------+---------+------+--------+---------+
| a_id | a_name | a_level | b_id | b_name | b_level |
+------+--------+---------+------+--------+---------+
| 2 | bbbb | 20 | 2 | bbbb | 20 |
| 3 | cccc | 30 | 3 | cccc | 30 |
| NULL | NULL | NULL | 5 | eeee | 50 |
| NULL | NULL | NULL | 6 | ffff | 60 |
+------+--------+---------+------+--------+---------+
4 rows in set (0.00 sec)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/104688.html
標籤:其他
下一篇:新手,求諒解
