前言:本章咱們將學習SQL查詢中的高級部分,如內鏈接、外鏈接和子查詢,經過這些查詢技術咱們將可以解決項目中複雜的查詢問題。mysql
外鍵約束sql
MySQL屬於關係型的數據庫,表之間能夠創建關係,如:學生表和成績表,在成績表中添加學生編號引用學生表中的學生編號,這樣在成績表中就不用添加劇復的學生信息了,這種關係也叫主外鍵關係,能夠經過設置外鍵約束實現。數據庫
能夠在建立表時,添加外鍵約束來保證表和表之間引用完整性,添加外鍵後:學習
在插入外鍵表數據前,必須先插入主表數據spa
在刪除主表數據前,必須先刪除外鍵表數據blog
語法:rem
create table 表名table
(bfc
字段名 類型 約束,select
... ,
constraint 外鍵名稱 foreign key (外鍵列) references 主表(主鍵)
);
代碼示例:
use mysql_db;
-- 建立成績表
drop table if exists tb_score;
create table tb_score
(
score_id int primary key auto_increment,
score_stu_id int,
score int,
score_course varchar(20),
constraint fk_score_stu_id foreign key(score_stu_id) references tb_student(stu_id)
);
內鏈接查詢
在查詢時咱們常常要把相關的多張表的字段,一塊兒查詢出來,如查詢學生成績時,要顯示分數和學生姓名。這個時候咱們就須要鏈接查詢了,鏈接查詢分爲內鏈接和外鏈接,咱們先學習內鏈接查詢。
內鏈接查詢的特色是:會查詢出相關表中都存在的數據。
語法有兩種實現方法:
1)select 字段..... from 表1 inner join 表2
on 表1.主鍵 = 表2.外鍵;
注意:這裏假設表1是主表,內鏈接表的先後順序無關
2)select 字段..... from 表1 , 表2
where 表1.主鍵 = 表2.外鍵;
代碼示例:
-- 查詢學生姓名和成績 方式1
select s.stu_id ,s.stu_name,c.score_course,c.score from tb_score c inner join tb_student s on s.stu_id = c.score_stu_id;
-- 方式2
select s.stu_id ,s.stu_name,c.score_course,c.score from tb_score c , tb_student s where s.stu_id = c.score_stu_id;
效果相同:
外鏈接查詢
外鏈接分爲左外鏈接和右外鏈接:
1) 左外鏈接
鏈接查詢多張表的數據,顯示全部左表的數據,右表存在不相符的數據補null。
語法:
select 字段... from 左表 left join 右表
on 主表.主鍵 = 子表.外鍵;
代碼示例:
-- 左外鏈接,查詢學生姓名和成績
select s.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_score c on s.stu_id = c.score_stu_id;
-- 查詢全部參加過考試的同窗
select s.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_score c on s.stu_id = c.score_stu_id where c.score is not null;
-- 查詢全部沒參加過考試的同窗
select s.stu_id,s.stu_name,c.score_course,c.score from tb_student s left join tb_score c on s.stu_id = c.score_stu_id where c.score is null;
2)右外鏈接
與左鏈接相反,顯示全部右表數據,左表中不相符的數據補null。
語法:
select 字段... from 左表 right join 右表
on 主表.主鍵 = 子表.外鍵;
代碼示例:
select s.stu_id,s.stu_name,c.score_course,c.score from tb_score c right join tb_student s on s.stu_id = c.score_stu_id;
子查詢
在查詢語句中還能夠嵌入查詢語句,嵌入的查詢也叫子查詢,子查詢將先執行,查詢到結果後,父查詢能夠將此結果做爲查詢條件再進行一次查詢,這樣能夠解決比較複雜的查詢問題。
語法:
select ... from 表 where 字段 比較運算符 (select ... from 表 where 條件);
代碼示例:
-- 查詢年齡比李四大的學生
select * from tb_student where stu_age > (select stu_age from tb_student where stu_name = '李四');
-- 查詢李四的老鄉
select * from tb_student where stu_address = (select stu_address from tb_student where stu_name = '李四');
子查詢之IN
有時候當子查詢中查詢結果不止一個的狀況下,使用比較運算符會出現錯誤,這時候咱們就須要使用一些關鍵字來幫助篩選結果。
in關鍵字的做用是在字段和數據列表中任意一個相等,條件就成立。
代碼示例:
-- 查詢語文分數考相同的學生,先用子查詢查語文的成績,在用內鏈接查考過語文的學生姓名和成績,把成績進行比較
select stu_name,score_course,score from tb_student inner join tb_score on tb_student.stu_id = tb_score.score_stu_id where score_course='語文' and score in(select score from tb_score where score_course = '語文');
子查詢之ALL
all和比較運算符配合使用,若是字段和全部的查詢結果都比較成立,結果才成立。
語法:
字段 比較運算 all(查詢結果)
代碼示例:
-- 查詢比全部男學生小的女學生,先查全部男學生的年齡,若是女學生年齡比全部這些年齡大,就查出來
select stu_name,stu_age,stu_gender from tb_student where stu_gender = '女' and stu_age < all(select stu_age from tb_student where stu_gender = '男');
子查詢之ANY
any和比較運算符配合使用,若是字段和任意一個查詢結果比較成立,則結果成立。
語法:
字段 比較運算 any(查詢結果)
代碼示例:
-- 查詢只要比一個南京學生大的武漢學生
select stu_name,stu_address from tb_student where stu_address = '武漢'
and stu_age > any(select stu_age from tb_student where stu_address='南京');
子查詢之Exists
exists表示是否有查詢結果,若是沒有結果,返回false,有結果則返回true
語法:
exists(查詢結果)
-- 查詢考過英語的同窗,在子查詢中須要判斷父查詢中的學生id是否在子查詢中存在
select * from tb_student where
exists(select score_stu_id from tb_score where tb_student.stu_id = tb_score.score_stu_id and score_course = '英語');
總結
本章咱們學習了內鏈接、外鏈接、子查詢等高級查詢方法,有時候這些查詢方法須要綜合運用起來,當咱們熟悉了它們後,查詢數據就不是難事了。
本文由好程序整理上傳。