1. 程式人生 > >mysql連接查詢

mysql連接查詢

外連接 相同 orderby 開始 bold img 卡爾 info clas

連接查詢 join

SQL中將連接查詢分成四類: 內連接,外連接,自然連接和交叉連接

技術分享圖片

交叉連接: cross join

從一張表中循環取出每一條記錄, 每條記錄都去另外一張表進行匹配: 匹配一定保留(沒有條件匹配), 而連接本身字段就會增加(保留),最終形成的結果叫做: 笛卡爾積。(不常用)

基本語法: 左表 cross join 右表 或 from 左表,右表;

selec *from t1 cross t2; select *from t1,t2;

技術分享圖片技術分享圖片技術分享圖片

內連接: [inner] join

從左表中取出每一條記錄,去右表中與所有的記錄進行匹配: 匹配必須是某個條件在左表中與右表中相同最終才會保留結果

,否則不保留.

基本語法左表 [inner] join 右表 on 左表.字段 = 右表.字段; on表示連接條件: 條件字段就是代表相同的業務含義(如my_student.c_id和my_class.id)

而表名太長, 通常可以使用別名.沒有on之後的內容,這個時候系統會保留所有結果(笛卡爾積)

技術分享圖片技術分享圖片

外連接: left/right join

以某張表為主,取出裏面的所有記錄, 然後每條與另外一張表進行連接: 不管能不能匹配上條件,最終都會保留: 能匹配,正確保留; 不能匹配,其他表的字段都置空NULL.

外連接分為兩種: 是以某張表為主: 有主表

left join: 左外連接(左連接), 以左表為主表

right join: 右外連接(右連接), 以右表為主表

基本語法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;

技術分享圖片技術分享圖片

三者區別:

交叉 結果全保留(無論是否匹配得上)

內連接(匹配不上的舍去)

外鏈接有主表(主表匹配不上的置空)

聯合查詢

聯合查詢的意義:

1. 查詢同一張表,但是需求不同: 如查詢學生信息, 男生身高升序, 女生身高降序.

2. 多表查詢: 多張表的結構是完全一樣的,保存的數據(結構)也是一樣的.

基本語法:多條select語句構成: 每一條select語句獲取的字段數必須嚴格一致(但是字段類型無關)

Select 語句1

Union [union選項]

Select語句2...

Union選項: 與select選項一樣有兩個

All: 保留所有(不管重復)

Distinct: 去重(整個重復): 默認的

技術分享圖片

聯合查詢只要求字段一樣, 跟數據類型無關

技術分享圖片

order by使用

正序 order by 降序 desc asc升序(不寫默認asc)

排序子句語法:order by 列名 asc/desc

limit

LIMIT m,n : 表示從第m+1條開始,取n條數據;

LIMIT n : 表示從第0條開始,取n條數據,是limit(0,n)的縮寫。

本題limit 2,1 表示從第(2+1)條數據開始,取一條數據,即入職員工時間排名倒數第三的員工

在聯合查詢中: order by不能直接使用,需要對查詢語句使用括號才行;另外,要orderby生效: 必須搭配limit: limit使用限定的最大數即可.

技術分享圖片

--(select *from t3 where gender=‘男‘ order by age limit 999999)

union

(select *from t3 where gender= order by age desc limit 999999)

子查詢

子查詢: 查詢是在某個查詢結果之上進行的.(一條select語句內部包含了另外一條select語句).

子查詢結果當做二維表來使用

子查詢分類:2

按位置分類; 和按結果分類

l 按位置分類: 子查詢(select語句)在外部查詢(select語句)中出現的位置

  1. From子查詢: 子查詢跟在from之後
  2. Where子查詢: 子查詢出現where條件中
  3. Exists子查詢: 子查詢出現在exists裏面

l 按結果分類: 根據子查詢得到的數據進行分類(理論上講任何一個查詢得到的結果都可以理解為二維表)

  1. 標量子查詢: 子查詢得到的結果是一行一列
  2. 列子查詢: 子查詢得到的結果是一列多行
  3. 行子查詢: 子查詢得到的結果是多列一行(多行多列) (1,2,3出現的位置都是在where之後)
  4. 表子查詢: 子查詢得到的結果是多行多列(出現的位置是在from之後)

例子:

標量子查詢 (一行一列)

需求: 找到分類為科技的所有文章標題

技術分享圖片

技術分享圖片

技術分享圖片

列子查詢(一列)

一個表,讓我找出語文和數學都及格人的名字。表是這樣的:

技術分享圖片技術分享圖片

行子查詢(一行)

需求:找出年齡最大且身高最高的人

技術分享圖片技術分享圖片技術分享圖片

表子查詢(一個小表)

需求:找出每個人最好的成績

技術分享圖片技術分享圖片

Exists子查詢

Exists: 是否存在的意思, exists子查詢就是用來判斷某些條件是否滿足(跨表), exists是接在where之後:(後面有完整的一條語句) exists返回的結果只有0和1.

需求:如果存在的話身高大於2米的人,列出表中所有數據

技術分享圖片技術分享圖片

一些補充

過濾條件放在on和where的先後順序

這兩種寫法的區別在於,過濾條件放在ON的後面是在聯合之前就進行過濾,放在WHERE後面是在聯合之後的結果集上進行過濾。

mysql連接查詢