主頁 >  其他 > MySQL高級查詢陳述句(一)排序、運算子、別名——超詳細

MySQL高級查詢陳述句(一)排序、運算子、別名——超詳細

2020-09-23 05:28:26 其他

  • 創建示例表
  • 一、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 值就不得不說下空值,空值就是在表的欄位中存盤空字符(‘’)

二者的區別如下:

  1. 空值的長度為 0,不占用空間的;而NULL值的長度是 NULL,是占用空間的,
  2. IS NULL 或者 IS NOT NULL,是用來判斷欄位是不是為 NULL 或者不是 NULL,不能查出是不是空值的,
  3. 空值的判斷使用=’’或者<>’’來處理,
  4. 在通過 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)

總結:

  1. 如果兩者都是整數,則按照整數值進行比較,
  2. 如果一個整數一個字串,則會自動將字串轉換為數字,再進行比較,
  3. 如果兩者都是字串,則按照字串進行比較,
  4. 如果兩者中至少有一個值是 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)

總結:

  1. LEAST 比較的引數為數字時,回傳的是其中最小的值;當比較的引數為字串時,回傳字母表中順序最靠前的字符,
  2. 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
10BETWEEN,CASE,WHEN,THEN,ELSE
11NOT
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/qita/109425.html

標籤:其他

上一篇:MySQL資料庫最全知識點+面試題整理

下一篇:天天大廠我也遭不住啊!來!66道樸實的Python軟體測驗筆試面試題(含答案)拿走!

標籤雲
其他(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