1. 程式人生 > >mysql筆記整理3.md

mysql筆記整理3.md

多表查詢

primary key; --主鍵 auto_increment int; --型別自增

笛卡爾積

select * from a,b; --直接查詢會造成笛卡爾積 –例如 id name id1 price – 1 蘋果 1 2.3 – 2 橘子 1 2.3 – 3 香蕉 1 2.3 – 1 蘋果 2 3.5 – 2 橘子 2 3.5 – 3 香蕉 2 3.5

–為了把冗餘資料過濾 可以使用內連線查詢 –內連線查詢的結果:兩表的公共部分。 ##內連線查詢

–隱式內連線查詢:

–語法:select 列名 , 列名 … from 表名1,表名2 where 表名1.列名 = 表名2.列名;

例: select * from a, b where a.id = b.id; --只顯示a和b的對應id相同的資料結果

–顯式內連線查詢:

–語法:select * from 表名1 inner join 表名2 on 條件 ;

例:select * from a inner join b on a.id = b.id; 查詢結果: – id name id1 price – 1 蘋果 1 2.3 – 2 橘子 2 3.5

##外連線查詢 外連線:左外連線、右外連線、全外連線。

左外連線:

語法:select * from 表1 left outer join 表2 on 條件;

例:select * from a left outer join b on a.id = b.id; 查詢結果: – id name id1 price – 1 蘋果 1 2.3 – 2 橘子 2 3.5 – 3 香蕉 null null

右外連線:

語法:select * from 表1 right outer join 表2 on 條件;

例:select * from a right join b on a.id = b.id; 查詢結果: – id name id1 price – 1 蘋果 1 2.3 – 2 橘子 2 3.5 – null null 4 null

總結:

– 左外連線以關鍵字左側資料為主,不管右側的資料是否有對應, – 都把左側的資料顯示出來。 – 右外連線以關鍵字右側資料為主,不管左側的資料是否有對應, – 都把右側的資料顯示出來。

全外連線:

​ 左外連線和右外連線的結果合併。

語法:select * from 表1 full outer join 表2 on 條件;

– mysql資料庫不支援此語法。Oracle和DB2及其他資料庫是支援的。 例: select * from a full outer join b on a.id = b.id; –由於mysql不支援該語法,但是我們可以使用union來達到全外連線的查詢效果。 –union :可以將左外連線查詢和右外連線查詢兩條sql語句 – 使用union合併起來進行查詢,去掉重複的資料。 例: select * from a left outer join b on a.id = b.id ​ union ​ select * from a right outer join b on a.id = b.id; 查詢結果: – 1 蘋果 1 2.3 – 2 橘子 2 3.5 – 3 香蕉 null null – null null 4 null 如果不想去掉重複的資料可以使用 union all 語句 例: select * from a left outer join b on a.id = b.id ​ union all ​ select * from a right outer join b on a.id = b.id; 查詢結果: – id name id1 price – 1 蘋果 1 2.3 – 2 橘子 2 3.5 – 3 香蕉 null null – 1 蘋果 1 2.3 – 2 橘子 2 3.5 – null null 4 null

多表查詢總結:

內連線: 1、 隱式內連線: Select * from a,b where a.id = b.id; 結果:C 2、 顯示內連線: Select * from a inner join b on a.id = b.id; 結果:C 外連線: 1、 左外連線 select * from a left outer join b on a.id = b.id; 結果:A+C 2、 右外連線 select * from a right outer join b on a.id = b.id 結果:B+C 3、 union:相當於全外連線 select * from a left outer join b on a.id = b.id union select * from a right outer join b on a.id = b.id; 結果:A+B+C,會自動濾重

select * from a left outer join b on a.id = b.id union all select * from a right outer join b on a.id = b.id; 結果:A+B+C,有重複資料

SQL關聯子查詢

子查詢:把一個sql的查詢結果作為另外一個查詢的引數存在。 庫中有A B兩表分別為: ​ A: B: – id name id name – 1 蘋果 1 2.3 – 2 橘子 2 3.5 – 3 香蕉 4 null – 需求1:查詢價格最貴的水果名稱。

  1. 在B表查詢最高的價格 select max(price) from b;
  2. 在B表查詢最高價格對應的id select b.id from b where b.price = 3.5;
  3. 在A表根據編號找出對應水果名 select a.name from a where a.id in(2); –使用子查詢來完成上述的功能需求: select a.name from a where a.id in( select b.id from b where b.price = ( select max(price) from b));

in的用法

關聯子查詢其他的關鍵字使用: in 表示條件應該是在多個列值中。 in:使用在where後面,經常表示是一個列表中的資料, ​ 只要被查詢的資料在這個列表中存在即可。 – 需求:查詢不及格的學生 – 1)查詢學生表中不及格的學生id select student_id from studentcourse where score < 60; – 2)根據不及格的學生id到學生表中查詢學生 select * from student where id in( select student_id from studentcourse where score < 60);

exists的用法

– 需求:查詢不及格的學生 select * from student where exists( select student_id from studentcourse where score < 60 and studentcourse.student_id = student.id); --不及格的學生id與學生表id對比 – exists的查詢方式:將外表中的資料逐行拿到內表中去判斷條件是否成立, – 如果成立返回該行資料。如果不成立,丟棄該行資料。 – (注意:顯示的是外表中的資料。)

all的用法

– all:表示所有,和union一起使用。如果在查詢時, – 單獨使用union 可以把多個查詢的結果進行合併, – 會過濾掉重複的資料。如果union all 只會簡單的把多個查詢結果合併。 – 不會過濾掉重複的資料。左連線和右連線查詢結果的合集。 舉例: ​ a > all(1,2,3) 等價於a > 1,a > 2and a > 3 ​ 等價於a > 3(a > 3 必然a > 1和2) 等價於a > max(1,2,3) ​ 同理 a < all(1,2,3) 等價於 a < min(1,2,3)

–需求:查詢年齡最大的學生的資訊。 – 1) 查詢最大的年齡 select max(age) from student; – 2) 通過年齡查學生資訊 –查詢(遍歷)學生表(集合) 符合最大年齡條件的學生資訊 select * from student where age = (select max(age) from student); 使用all代替max查詢方法: select * from student where age >= all(select age from student); –相當於select * from student where age >= all(學生表裡的全部age)

any和some的使用方法,以及as的使用方法.

l any:表示任何一個 舉例: ​ a > any(1,2,3) 等價於a > 1或a > 2或a > 3 等價於a > 1 ​ 等價於a > min(1,2,3) a > 1包含a > 2和a > 3 範圍最廣泛 ​ 同理 a < any(1,2,3) 等價於 a < max(1,2,3)

–需求:查詢成績是90的學生的資訊 – 1) 在中間表中查詢成績為90的學生id select student_id from studentcourse where score = 90; – 2) 通過學生id查詢學生資訊 方法一:使用in --(學生可能為多個in不能使用=) select * from student where id in(select student_id from studentcourse where score = 90); 方法二:使用any – id=any(1,4)等價於id=1 or id=4,所以結果為2個; select * from student where id = any(select student_id from studentcourse where score = 90); 方法三:使用some select * from student where id = some(select student_id from studentcourse where score = 90) l some: --表示任何一個,和any的作用相同。 any和some 是沒有區別的,some和any 效果一樣 ,代表一部分記錄。

l as:

不僅可以用來做列的別名,還可以將查詢結果通過as作為一張表來使用。

–需求: 查詢不及格的學生資訊和不及格分數 – 1) 在中間表中查詢不及格學生id和分數 select student_id,score from studentcourse where score < 60; –說明:可以把上述查詢的結果看作為一張資料庫的臨時表。 – 2) 在學生表中通過學生的id查詢學生資訊並顯示分數 select student.*,x.score from student, (select student_id,score from studentcourse where score < 60) as x where student.id = x.student_id; – 解析 – 1.(select student_id,score from studentcourse where score < 60) as x – 把在中間表中查詢不及格學生id和分數設為一個臨時表x – 2.對比x表的student_id 和 student表的id – 3.打印出符合要求的學生的student表內的全部內容

limit的用法

– 作用:限制查詢結果返回的數量。

語法: select * from 表名 limit 索引號, 記錄數量;

– mysql中limit的用法:返回前幾條或者中間某幾行資料 舉例: select * from 表名 limit 1,4。 – 1表示索引,注意這裡的索引從0開始。 – 4表示查詢記錄數 – 上述就表示從第2條記錄開始查詢,一共查詢4條,即到第5條。(2,3,4,5) select * from student limit 1,4;