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相關指令整理
