主頁 > 前端設計 > MySQL資料庫高級查詢陳述句 ——————進階查詢

MySQL資料庫高級查詢陳述句 ——————進階查詢

2020-10-17 12:34:52 前端設計

MySQL進階查詢

按關鍵字排序

使用ORDERBY陳述句來實作排序
排序可針對一個或多個欄位
ASC:升序,默認排序方式
DESC:降序
ORDER BY的語法結構
SELECT column1,column2,…FROM table_name ORDER BY column1,column2,…ASC|DESC

實驗舉例

mysql> use school;
mysql> create table info ( id int(4) not null primary key, name varchar(10) not null, score decimal (5,2),haddy int(4) not null);
mysql> insert into info (name,scrore,habby) values ('zhaoliu',70,2);  //插入資料省略部分內容
mysql> select count(addr) from info;             //添加地址選項
mysql> select * from info;
+----+----------+--------+-------+------+
| id | name     | scrore | habby | addr |
+----+----------+--------+-------+------+
|  1 | zhangsan |  88.00 |     1 | NULL |
|  2 | lisi     |  90.00 |     1 |      |
|  3 | wangwu   |  95.00 |     2 | nj   |
|  4 | zhaoliu  |  70.00 |     2 | NULL |
|  5 | tianqi   |  98.00 |     2 | nj   |
|  6 | wangba   |  80.00 |     1 | NULL |
|  7 | zhujiu   |  89.00 |     1 | nj   |
|  8 | tangsi   |  86.00 |     1 | NULL |
+----+----------+--------+-------+------+
8 rows in set (0.00 sec)
mysql> alter table info change habby hoddy int(11);        //更改選項讓habby變成hoddy
mysql> alter table info change scrore score int(11);
mysql> select * from info order by score;          //查詢的時候按成績進行查詢默認升序
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  6 | wangba   | 80.00 |     1 | NULL |
|  8 | tangsi   | 86.00 |     1 | NULL |
|  1 | zhangsan | 88.00 |     1 | NULL |
|  7 | zhujiu   | 89.00 |     1 | nj   |
|  2 | lisi     | 90.00 |     1 |      |
|  3 | wangwu   | 95.00 |     2 | nj   |
|  5 | tianqi   | 98.00 |     2 | nj   |
+----+----------+-------+-------+------+
8 rows in set (0.00 sec)
mysql> select * from info order by score;          //查詢的時候按成績進行降序查詢
mysql> select id,hoddy from info where 1=1 order by hoddy desc,id desc;    //指定多欄位進行查詢優先查考先寫的欄位
+----+-------+
| id | hoddy |
+----+-------+
|  5 |     2 |
|  4 |     2 |
|  3 |     2 |
|  8 |     1 |
|  7 |     1 |
|  6 |     1 |
|  2 |     1 |
|  1 |     1 |
+----+-------+
8 rows in set (0.00 sec)
mysql> select id,hoddy from info where 1=1 order by score;
+----+-------+
| id | hoddy |
+----+-------+
|  4 |     2 |
|  6 |     1 |
|  8 |     1 |
|  1 |     1 |
|  7 |     1 |
|  2 |     1 |
|  3 |     2 |
|  5 |     2 |
+----+-------+
8 rows in set (0.01 sec)

對結果進行分組

使用GROUP BY陳述句來實作分組
通常結合聚合函式一起使用
可以按一個或多個欄位對結果進行分組
GROUP BY的語法結構
select count(選項),選項 from 表名 where 條件 group by 選項

實驗

mysql> select count(name),hoddy from info group by hoddy;     //按興趣進行分組 并統計每個組的個數
+-------------+-------+
| count(name) | hoddy |
+-------------+-------+
|           5 |     1 |
|           3 |     2 |
+-------------+-------+
2 rows in set (0.00 sec)
mysql> update info set hoddy=3 where name='zhangsan';        //將張三的興趣改成3

限制結果條件

只回傳select查詢結果的第一行或者前幾行
使用limit陳述句限制條目
limit語法結構
select * from 表名 limit 選項 【注意若limit后面是 3,5表示的是從第四行開始向后的五行 即從索引位置開始的向下的幾行】

mysql> select * from info limit 3;
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 88.00 |     3 | NULL |
|  2 | lisi     | 90.00 |     1 |      |
|  3 | wangwu   | 95.00 |     2 | nj   |
+----+----------+-------+-------+------+
3 rows in set (0.00 sec)
mysql> select * from info limit 2,5;
+----+---------+-------+-------+------+
| id | name    | score | hoddy | addr |
+----+---------+-------+-------+------+
|  3 | wangwu  | 95.00 |     2 | nj   |
|  4 | zhaoliu | 70.00 |     2 | NULL |
|  5 | tianqi  | 98.00 |     2 | nj   |
|  6 | wangba  | 80.00 |     1 | NULL |
|  7 | zhujiu  | 89.00 |     1 | nj   |
+----+---------+-------+-------+------+
5 rows in set (0.00 sec)

設定別名

使用的是as陳述句并且關鍵字as可以省略
可以針對表和欄位設定別名
語法結構
select 選項 as 別名 from 表名;

mysql> select name as 姓名 from info;
+----------+
| 姓名     |
+----------+
| zhangsan |
| lisi     |
| wangwu   |
| zhaoliu  |
| tianqi   |
| wangba   |
| zhujiu   |
| tangsi   |
+----------+
8 rows in set (0.00 sec)
mysql> select a.name 姓名,a.score as 成績 from info as a;
+----------+--------+
| 姓名     | 成績   |
+----------+--------+
| zhangsan |  88.00 |
| lisi     |  90.00 |
| wangwu   |  95.00 |
| zhaoliu  |  70.00 |
| tianqi   |  98.00 |
| wangba   |  80.00 |
| zhujiu   |  89.00 |
| tangsi   |  86.00 |
+----------+--------+
8 rows in set (0.00 sec)

as也可以做連接陳述句
用法
create table 要連接的表名 as select * from 表名

mysql> create table lapp as select * from info where score >= 90;
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from lapp;
+----+--------+-------+-------+------+
| id | name   | score | hoddy | addr |
+----+--------+-------+-------+------+
|  2 | lisi   | 90.00 |     1 |      |
|  3 | wangwu | 95.00 |     2 | nj   |
|  5 | tianqi | 98.00 |     2 | nj   |
+----+--------+-------+-------+------+
3 rows in set (0.00 sec)
mysql> desc lapp;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(4)       | NO   |     | 0       |       |
| name  | varchar(10)  | NO   |     | NULL    |       |
| score | decimal(5,2) | YES  |     | NULL    |       |
| hoddy | int(11)      | YES  |     | NULL    |       |
| addr  | varchar(50)  | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

注意的是新表的資料型別一樣 但是約束條件沒有了 如主鍵和和擴展屬性沒有了

通配符

用于替換字串中的部分字符
關鍵字like經常和as 一起使用 并協同where完成查詢(常用于模糊查詢)
通配符
%表示0個1個或多個
_(下劃線)表示單個字符
語法結構
select * from 表名 where 選項 like 條件

mysql> select * from info where name like 'z%';
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 88.00 |     3 | NULL |
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  7 | zhujiu   | 89.00 |     1 | nj   |
+----+----------+-------+-------+------+
3 rows in set (0.00 sec)
mysql> select * from info where name like 'l_s_';
+----+------+-------+-------+------+
| id | name | score | hoddy | addr |
+----+------+-------+-------+------+
|  2 | lisi | 90.00 |     1 |      |
+----+------+-------+-------+------+
1 row in set (0.01 sec)

子查詢陳述句

也稱內查詢或嵌套查詢 多層查詢一般從內往外讀
子查詢先于主查詢被執行其結果做外層查詢的條件
IN陳述句是用來 判斷某個值是否在給定的結果集中

mysql> create table tmp (id int(4));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tmp values (1),(3),(5),(7);
mysql> select * from info where id in(select id from tmp);
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 88.00 |     3 | NULL |
|  3 | wangwu   | 95.00 |     2 | nj   |
|  5 | tianqi   | 98.00 |     2 | nj   |
|  7 | zhujiu   | 89.00 |     1 | nj   |
+----+----------+-------+-------+------+
4 rows in set (0.01 sec)

視圖:

資料庫中的虛擬表這張表中不包含任何資料,只是做了資料映射
關鍵字 view

mysql> show table status;
mysql> create view v_score as select * from info where score >=90;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from v_score;
+----+--------+-------+-------+------+
| id | name   | score | hoddy | addr |
+----+--------+-------+-------+------+
|  2 | lisi   | 90.00 |     1 |      |
|  3 | wangwu | 95.00 |     2 | nj   |
|  5 | tianqi | 98.00 |     2 | nj   |
+----+--------+-------+-------+------+
3 rows in set (0.00 sec)

常用子查詢的用法

mysql> select count(*) as number from info where exists (select id from info where name='lisi');
+--------+
| number |
+--------+
|      8 |
+--------+
1 row in set (0.00 sec)

mysql> select count(*) as number from info where exists (select id from info where name='lisigg');  ##判斷結果必須要符合外層才能執行
+--------+
| number |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec)
mysql> mysql> update info set score=score-7 where id in(select a.id from(select id from info where hoddy >= 3) a);

NULL值

表示缺失的值
與數字0或者空白(spaces)是不同的
使用IS NULL或IS NOT NULL進行判斷
NULL值和空值的區別
空值長度為0,不占空間;NULL值的長度為NULL,占用空間
IS NULL無法判斷空值
空值使用“="或者“<>"來處理
OUNTO計算時,NULL會忽略,空值會加入計算

mysql> update info set addr='' where name='lisi';
mysql> SELECT * FROM info;
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 81.00 |     3 | NULL |
|  2 | lisi     | 90.00 |     1 |      |
|  3 | wangwu   | 95.00 |     2 | nj   |
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  5 | tianqi   | 98.00 |     2 | nj   |
|  6 | wangba   | 80.00 |     1 | NULL |
|  7 | zhujiu   | 89.00 |     1 | nj   |
|  8 | tangsi   | 86.00 |     1 | NULL |
+----+----------+-------+-------+------+
8 rows in set (0.00 sec)
mysql> select * from info where addr is not null;
+----+--------+-------+-------+------+
| id | name   | score | hoddy | addr |
+----+--------+-------+-------+------+
|  2 | lisi   | 90.00 |     1 |      |
|  3 | wangwu | 95.00 |     2 | nj   |
|  5 | tianqi | 98.00 |     2 | nj   |
|  7 | zhujiu | 89.00 |     1 | nj   |
+----+--------+-------+-------+------+
4 rows in set (0.00 sec)
mysql> select * from info where addr is null;
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 81.00 |     3 | NULL |
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  6 | wangba   | 80.00 |     1 | NULL |
|  8 | tangsi   | 86.00 |     1 | NULL |
+----+----------+-------+-------+------+
4 rows in set (0.00 sec)
mysql> select count(addr) from info;              ##統計地址為not null的數量
+-------------+
| count(addr) |
+-------------+
|           4 |
+-------------+
1 row in set (0.00 sec)
mysql> update info set addr='' where name='wangba';       ##將王八的地址變成空值
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select count(addr) from info;                   ##說明了沒有東西會被加入到統計
+-------------+
| count(addr) |
+-------------+
|           5 |
+-------------+
1 row in set (0.00 sec)

正則運算式

根據指定的匹配模式匹配記錄中符合要求的特殊字符
使用REGEXP關鍵字指定匹配模式
常用匹配模式
p1lp2 匹配p1或p2
^ 匹配開始字符
[…] 匹配字符集中的任意一個字符
$ 匹配結束字符
. 匹配任意單個字符
[^…] 匹配不在中括號內的任何字符 就是不包含

  • 匹配任意個前面的字符
    {n} 匹配前面的字串n次
    + 匹配前面字符至少1次
    {n,m} 匹配前面的字串至少n次,至多m次
mysql> select * from info where name regexp '[^xy]';
+----+----------+-------+-------+------+
| id | name     | score | hoddy | addr |
+----+----------+-------+-------+------+
|  1 | zhangsan | 81.00 |     3 | NULL |
|  2 | lisi     | 90.00 |     1 |      |
|  3 | wangwu   | 95.00 |     2 | nj   |
|  4 | zhaoliu  | 70.00 |     2 | NULL |
|  5 | tianqi   | 98.00 |     2 | nj   |
|  6 | wangba   | 80.00 |     1 |      |
|  7 | zhujiu   | 89.00 |     1 | nj   |
|  8 | tangsi   | 86.00 |     1 | NULL |
+----+----------+-------+-------+------+
8 rows in set (0.00 sec)
mysql> select id,name,score from info where name regexp '^z';
+----+----------+-------+
| id | name     | score |
+----+----------+-------+
|  1 | zhangsan | 81.00 |
|  4 | zhaoliu  | 70.00 |
|  7 | zhujiu   | 89.00 |
+----+----------+-------+
mysql> select * from info where name regexp 'li';
+----+---------+-------+-------+------+
| id | name    | score | hoddy | addr |
+----+---------+-------+-------+------+
|  2 | lisi    | 90.00 |     1 |      |
|  4 | zhaoliu | 70.00 |     2 | NULL |
+----+---------+-------+-------+------+
2 rows in set (0.00 sec)

運算子

mysql的運算子用于對記錄中的欄位值進行運算 MySQL的運算共有四種,分別是:算術運算子,比較運算子,邏輯運算子和位運算子

算術運算子

在這里插入圖片描述

mysql> select 1+2 as jia,2-1 as jian,2*3 cheng,4/2 as chu, 7%2 as 取余;
+-----+------+-------+--------+--------+
| jia | jian | cheng | chu    | 取余   |
+-----+------+-------+--------+--------+
|   3 |    1 |     6 | 2.0000 |      1 |
+-----+------+-------+--------+--------+
1 row in set (0.01 sec)
mysql> create table mas as select 2+1,2-1,7/2,7%2;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

比較運算子

比較運算子是查詢資料記錄時經常使用的一類運算子,通過使用比較運算子可以判斷出―表
中有哪些記錄是符合條件的,如果比較的結果為真則回傳1,如果為假則回傳O,比較的結
果如果不確定則回傳NULL,其中字串在進行比較的時候默認是不區分大小寫的,如果要
區分大小寫可以通過binary 關鍵字來實作,常用的比較運算子如表5-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)

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 這個關鍵字的區別,同時回傳值不同,

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)

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 比較的引數為數字時, 回傳的是其中最大的值;
當比較的引數為字串時,回傳字母表中順序最靠后的字符,

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)

從以上結果可以看出,IN 和 NOT IN 的回傳值正好相反,

邏輯運算子

邏輯運算子又被稱為布爾運算子,通常用來判斷運算式的真偽,如果為真回傳 1,否則回傳 0,
真和假也可以用 TRUE 和 FALSE 表示,MySQL 中支持使用的邏輯運算子有四種,
運算子 描述
NOT 或 ! 邏輯非
AND 或 && 邏輯與
OR 或 || 邏輯或
XOR 邏輯異或
(1)邏輯非
邏輯運算子中最簡單的運算子就是邏輯非,邏輯非使用 NOT 或!表示,邏輯非將跟在它后面的邏輯測驗取反,
把真變為假,把假變為真,如果 NOT 后面的運算元為 0 時,所得值為 1;如果運算元為非 0 時,所得值為 0;
如果運算元為 NULL 時,所得值為 NULL,
(2)邏輯與
邏輯與通常用于判斷兩個值或多個值的有效性,如果所有值都是真回傳 1,否則回傳 0
邏輯與使用 AND 或者&&表示,例如,對非 0 值、0 值和 NULL 值分別作邏輯與運算,

mysql> select 2&&3,0&&1,0&&null,1 and null;
+------+------+---------+------------+
| 2&&3 | 0&&1 | 0&&null | 1 and null |
+------+------+---------+------------+
|    1 |    0 |       0 |       NULL |
+------+------+---------+------------+
1 row in set (0.00 sec)

(3)邏輯或
邏輯或表示包含的運算元,任意一個為非零值并且不是 NULL 值時,回傳 1,否則回傳0,
邏輯或通常使用 OR 或者||來表示,例如,對非 0 值、0 值和 NULL 值分別作邏輯或運算

mysql> select 2 or 3, 2 or 0;
+--------+--------+
| 2 or 3 | 2 or 0 |
+--------+--------+
|      1 |      1 |
+--------+--------+
1 row in set (0.00 sec)
mysql> select 2 or 3,2 or 0;
+--------+--------+
| 2 or 3 | 2 or 0 |
+--------+--------+
|      1 |      1 |
+--------+--------+
1 row in set (0.01 sec)
mysql> select 2 or 3,'a' || 0;
+--------+----------+
| 2 or 3 | 'a' || 0 |
+--------+----------+
|      1 | a0       |
+--------+----------+
1 row in set (0.06 sec)
mysql> select null or 1;
+-----------+
| null or 1 |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)
mysql> select null or 0;
+-----------+
| null or 0 |
+-----------+
|      NULL |
+-----------+
1 row in set (0.00 sec)

自由理解 :::: 對于與運算和或運算 計算機都是先進行前面的第一運算式 若是前面的運算式成立就不會再進行后面的運算了例如 1 & null 那么結果必定是1 因為前面的運算式1回傳值正確的下面的null就不在進行 在例如null or 1 就認為null 是不成立的結果變是1 在例如0 or null 因為0是空值就執行了null 結果也就是null
另外發現0和null做與運算的時候結果是0理解就是在與運算的時候0是老大 而或運算時1是老大 (null是像常客人一樣 在主人就肯定是主人大咯)
(4)邏輯異或
兩個非 NULL 值的運算元,如果兩者都是 0 或者都是非 0,則回傳 0;如果一個為 0, 另一個為非 0,則回傳結果為 1;
當任意一個值為 NULL 時,回傳值為 NULL,例如,對非0 值、0 值和 NULL 值分別作邏輯異或運算

簡單的鏈接異或 運算的時候僅僅是和或一個不同的就是 1 XOR 1 結果是0
簡單的記憶表:
在這里插入圖片描述

位運算子

位運算子實際上是對二進制數進行計算的運算子,MySQL 內位運算會先將運算元變成二進制格式,然后進行位運算,最后在將計算結果從二進制變回到十進制格式,方便用戶查看,MySQL 支持 6 種位運算子
運算子 描述
在這里插入圖片描述

mysql> select 10 & 15,10 | 15,10 ^ 15,5&~1,15 << 2,15>>2,10<<2,1<<2;
+---------+---------+---------+------+---------+-------+-------+------+
| 10 & 15 | 10 | 15 | 10 ^ 15 | 5&~1 | 15 << 2 | 15>>2 | 10<<2 | 1<<2 |
+---------+---------+---------+------+---------+-------+-------+------+
|      10 |      15 |       5 |    4 |      60 |     3 |    40 |    4 |
+---------+---------+---------+------+---------+-------+-------+------+
1 row in set (0.00 sec)

mysql邏輯運算的優先級

在默認情況下是從左往右依次執行 優先級數值越小越優先 如下圖!優先級最高:=優先級是最低,
在這里插入圖片描述

mysql連接查詢

MySQL 的連接查詢,通常都是將來自兩個或多個表的行結合起來,基于這些表之間的共同欄位,進行資料的拼接,
首先,要確定一個主表作為結果集,然后將其他表的行有選擇性的連接到選定的主表結果集上,使用較多的連接查詢包括:
內連接、左連接和右連接,

1、內連接
MySQL 中的內連接就是兩張或多張表中同時符合某種條件的資料記錄的組合,通常在FROM 子句中使用關鍵字 INNER JOIN 來連接多張表,
并使用 ON 子句設定連接條件,內連接的語法格式如下,
SELECT 選項(s) FROM 表1 INNER JOIN 表2 ON 表1.column_name = 表2.column_name;

mysql> select info.id,info.name from info inner join lapp on info.id=lapp.id;
+----+--------+
| id | name   |
+----+--------+
|  2 | lisi   |
|  3 | wangwu |
|  5 | tianqi |
+----+--------+
3 rows in set (0.00 sec)

2、左連接 和內連接就inner 和left這個區別
MySQL 除了內連接,還可以使用外連接,區別于 MySQL 外連接是將表分為基礎表和參考表,再依據基礎表回傳滿足條件或不滿足條件的記錄,外連接按照連接時表的順序來分, 有左連接和右連接之分,
左連接也可以被稱為左外連接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 關鍵字來表示,左連接以左側表為基礎表,接收左表的所有行,
并用這些行與右側參考表中的記錄進行匹配,也就是說匹配左表中的所有行以及右表中符合條件的行,

mysql> create table Hob (id int(5) not null primary key auto_increment,hob_name varchar(10) not null);
Query OK, 0 rows affected (0.06 sec)
mysql> insert into Hob (hob_name) values ('云計算'),('大資料'),('人工智能');
mysql> select info.id,info.name,Hob.hob_name from info left join Hob on info.hoddy=Hob.id;
+----+----------+--------------+
| id | name     | hob_name     |
+----+----------+--------------+
|  2 | lisi     | 云計算       |
|  6 | wangba   | 云計算       |
|  7 | zhujiu   | 云計算       |
|  8 | tangsi   | 云計算       |
|  3 | wangwu   | 大資料       |
|  4 | zhaoliu  | 大資料       |
|  5 | tianqi   | 大資料       |
|  1 | zhangsan | 人工智能     |
+----+----------+--------------+
8 rows in set (0.01 sec)

3、右連接
右連接也被稱為右外連接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 關鍵字來表示,右連接跟左連接正好相反,它是以右表為基礎表,用于接收右表中的所有行,并用這些記錄與左表中的行進行匹配,也就是說匹配右表中的每一行及左表中符合條件的記錄,

mysql> select info.id,info.name,Hob.hob_name from Hob right join info on info.hoddy=Hob.id;
+----+----------+--------------+
| id | name     | hob_name     |
+----+----------+--------------+
|  2 | lisi     | 云計算       |
|  6 | wangba   | 云計算       |
|  7 | zhujiu   | 云計算       |
|  8 | tangsi   | 云計算       |
|  3 | wangwu   | 大資料       |
|  4 | zhaoliu  | 大資料       |
|  5 | tianqi   | 大資料       |
|  1 | zhangsan | 人工智能     |
+----+----------+--------------+
8 rows in set (0.00 sec)

參考理解:無論左右還是內連接 都是一個是主表如info 另一個是從表如Hob這一點一定要理解;

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/175881.html

標籤:其他

上一篇:Mybatis關聯映射和逆向工程

下一篇:SQL相關指令整理

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

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more