查詢
1岖寞、子查詢
子查詢:允許把一個查詢嵌套在另一個查詢當中的查詢
Table: student
+----+-----------+-----+-----+
| id | name | age | sex |
+----+-----------+-----+-----+
| 1 | 小明 | 18 | 男 |
| 2 | 李四 | 20 | 女 |
| 3 | 王五 | 30 | 男 |
| 4 | 王明剛 | 40 | 男 |
+----+-----------+-----+-----+
Table: score
+------+------------+---------+-------+
| id | student_id | subject | score |
+------+------------+---------+-------+
| 1 | 1 | 語文 | 80 |
| 2 | 2 | 語文 | 70 |
+------+------------+---------+-------+
舉個例子:查詢小明的語文成績
SELECT score FROM score WHERE subject = '語文' AND student_id = (
SELECT id FROM student_info WHERE name = '小明'
);
2、聯(lián)結(jié)查詢
聯(lián)結(jié)就是一種機制柜蜈,用來在一條SELECT語句中關(guān)聯(lián)表仗谆,因此稱之為聯(lián)結(jié)。 其意義在于:在用戶查看數(shù)據(jù)的時候, 需要顯示的數(shù)據(jù)來自多張表淑履。
1. 內(nèi)聯(lián)結(jié)
又叫等值聯(lián)結(jié)隶垮,基于兩個表之間的相等測試,返回兩個或者多個表之間相等關(guān)系的數(shù)據(jù)鳖谈,用數(shù)學關(guān)系來看岁疼,相當于求交集。
語法:
SELECT * FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.column = t2.column;
舉個例子:查詢學生表中有成績的學生
mysql> SELECT s1.name, s2.subject, s2.score FROM student_info AS s1 INNER JOIN score AS s2 ON s1.id = s2.student_id;
+--------+---------+-------+
| name | subject | score |
+--------+---------+-------+
| 小明 | 語文 | 80 |
| 李四 | 語文 | 70 |
+--------+---------+-------+
2 rows in set (0.00 sec)
2. 外聯(lián)結(jié)
外聯(lián)結(jié)又可以分為左外聯(lián)結(jié)和右外聯(lián)結(jié)
左外聯(lián)結(jié):以左表為主表缆娃,返回左表中的所有數(shù)據(jù)
語法:
SELECT * FROM table1 AS t1 LEFT JOIN table2 AS t2 ON t1.column = t2.column;
舉個例子:返回所有學生的成績
mysql> SELECT s1.name, s2.subject, s2.score FROM student_info AS s1 LEFT JOIN score AS s2 ON s1.id = s2.student_id;
+-----------+---------+-------+
| name | subject | score |
+-----------+---------+-------+
| 小明 | 語文 | 80 |
| 李四 | 語文 | 70 |
| 王五 | NULL | NULL |
| 王明剛 | NULL | NULL |
+-----------+---------+-------+
4 rows in set (0.00 sec)
右外聯(lián)結(jié):以右邊為主表,返回右表中的所有數(shù)據(jù)
語法:
SELECT * FROM table1 AS t1 RIGHT JOIN table2 AS t2 ON t1.column = t2.column;
舉個例子:返回有成績的學生
select t1.name,t2.subject,t2.score from student as t1 right join score as t2 on t1.id=t2.student_id;
+-----------+---------+-------+
| name | subject | score |
+-----------+---------+-------+
| 小明 | 語文 | 80 |
| 李四 | 語文 | 70 |
+-----------+---------+-------+
3瑰排、組合查詢
MySQL允許執(zhí)行多個查詢(多條SELECT語句)贯要,并將結(jié)果作為單個查詢結(jié)果集返回。這些組合查詢通常稱為并(union)或符合查詢(compound query)椭住。
語法:
SELECT * FROM table1 WHERE condition
UNION
SELECT * FROM table2 WHERE condition;
舉個例子:查詢學生表中年齡超過20歲或者是男生的
mysql> SELECT * FROM student_info WHERE age > 20
-> UNION
-> SELECT * FROM student_info WHERE sex = '男';
+----+-----------+-----+-----+
| id | name | age | sex |
+----+-----------+-----+-----+
| 3 | 王五 | 30 | 男 |
| 4 | 王明剛 | 40 | 男 |
| 1 | 小明 | 18 | 男 |
+----+-----------+-----+-----+
3 rows in set (0.05 sec)
三種查詢方式的區(qū)別:
1崇渗、查詢過程的區(qū)別:
子查詢是由內(nèi)到外的查詢;聯(lián)結(jié)查詢是從多張表中取出信息進行匹配京郑;組合查詢是同時執(zhí)行多條查詢語句宅广,并將查詢結(jié)果一起返回
2、查詢效率的區(qū)別:
子查詢是從里到外的查詢些举,效率比較低跟狱;
3、使用場景的區(qū)別:
- 查詢的表過多時户魏,子查詢嵌套結(jié)構(gòu)復雜驶臊,可讀性低挪挤;
- 聯(lián)結(jié)查詢用于從多張表中獲取數(shù)據(jù);
- 在單個查詢中关翎,從不同表中返回類似結(jié)構(gòu)的數(shù)據(jù)以及對單個表執(zhí)行多個查詢扛门,按照單個查詢返回數(shù)據(jù)時,使用組合查詢