SQL語言之查詢

2021-09-24 08:19:34 字數 4102 閱讀 4440

sql語言之查詢(二)

前言本章我們將學習sql查詢中的高階部分,如內連線、外連線和子查詢,通過這些查詢技術我們將能夠解決專案中複雜的查詢問題。

外來鍵約束

mysql屬於關係型的資料庫,表之間可以建立關係,如:學生表和成績表,在成績表中新增學生編號引用學生表中的學生編號,這樣在成績表中就不用新增重複的學生資訊了,這種關係也叫主外來鍵關係,可以通過設定外來鍵約束實現。

可以在建立表時,新增外來鍵約束來保證表和表之間引用完整性,新增外來鍵後:

在插入外來鍵表資料前,必須先插入主表資料

在刪除主表資料前,必須先刪除外來鍵表資料

語法:create table 表名

欄位名 型別 約束,

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 = '英語');

總結本章我們學習了內連線、外連線、子查詢等高階查詢方法,有時候這些查詢方法需要綜合運用起來,當我們熟悉了它們後,查詢資料就不是難事了。

SQL語言之索引

索引的作用 索引的作用就是加快查詢速度,如果把使用了索引的查詢看做是法拉利跑車的話,那麼沒有用索引的查詢就相當於是自行車。目前實際專案中表的資料量越來越大,動輒上百萬上千萬級別,沒有索引的查詢會變得非常緩慢,使用索引成為了查詢優化的必選專案。索引的概念 索引其實是一種特殊的資料,也儲存在資料庫檔案中...

SQL語言之資料定義語言(Oracle)

一 建立表 create table 例 如上圖建立表 create table dept deptno number 2 dname varchar2 14 loc varchar2 13 oracle資料庫中的表 1.使用者表由使用者建立和維護的表的集合 包含使用者資訊 2.資料字典 由orac...

SQL語言之運算元據(Oracle)

當新增 更改或者刪除資料庫中的資料時需要使用dml語句。dml依據的乙個集合構成了乙個被稱之為事務的邏輯單元 當完成以下操作是,dml語句被執行 新增新的行到表中 修改表中的行 刪除表中的行 一 新增乙個新行到表中 insert語法 每次只能插入一行 指定列新增 以hr使用者中的department...