1. 程式人生 > >MySql基礎(多表查詢)

MySql基礎(多表查詢)

連線查詢

  1. 交叉查詢
  2. 等值連線
  3. 內連線

交叉查詢

格式
SELECT * FROM TABLE_A CROSS JOIN TABLE_B [WHERE 條件] 
SELECT * FROM TABLE_A JOIN TABLE_B[WHERE 條件]
SELECT * FROM TABLE_A, TABLE_B[WHERE 條件] 

笛卡爾集:
省略連線條件
連線條件無效
所有表中的所有行互相連線

** 為了避免笛卡爾集, 可以在 WHERE 加入有效的連線條件

格式:
    SELECT	table1.column, table2.column
    FROM	table1, table2
    WHERE	table1.column1 = table2.column2;
    在 WHERE 子句中寫入連線條件
   	在表中有相同列時,在列名之前加上表名字首
例:查詢每個學生的所在班級,顯示學生編號,姓名,班級名稱
SELECT stuid,name,cname FROM student,classinfo WHERE student.cid=classinfo.cid;

**注意:**使用表名字首在多個表中區分相同的列
在不同表中具有相同列名的列可以用表的別名加以區分
連線 n個表,至少需要 n-1個連線條件。 例如:連線三個表,至少需要兩個連線條件。

內連線
內連線: 合併具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行

SELECT <列名>
FROM 表1  INNER  JOIN  表2
ON 表1.列名  條件運算子  表2.列名
[WHERE 條件]
[ORDER BY  排序列]

其中“ON 表1.列名 條件運算子 表2.列名” 中,條件運算子常用的是:=、<>,>,<,>=,<=。
表1.列名和表2.列名,分別是兩個表的公共列。

查詢李四所考科目的平均成績,顯示姓名,平均成績。
SELECT name,avg(socre) FROM score
INNER JOIN student           -- 要連線的表
ON score.stuid =student.stuid  -- 連線條件
WHERE name='李四';

外連線
外連線
——左外聯結 (LEFT JOIN)
——右外聯結 (RIGHT JOIN)

外連線與普通連線的區別
普通連線操作只輸出滿足連線條件的元素
外連線操作以指定表為連線主體,將主體表中不滿足連線條件的元組一併輸出

左外連線:左外連線使用LEFT JOIN連線兩表,連線時左表為主表,左表中的每條記錄必定出現在結果集中,而在右表中沒有對應的記錄,將以NULL值進行填充。

SELECT * FROM TABLE_A 
LEFT JOIN TABLE_B 
ON 連線條件
[WHERE 條件]
算符常用的是:=、<>,>,<,>=,<=。

查詢所有學生課程的考試成績,
查詢結果保留學生ID、姓名、性別、課程ID、成績

SELECT student.stuid, `name`, sex, subid, socre
FROM student LEFT JOIN score 
ON student.stuid = score.stuid

右外連線與左外連線相似,不同的是右表為主表,右表中的每條記錄必定出現在結果集中,而在左表中沒有對應的記錄,將以NULL值進行填充。

SELECT * FROM TABLE_A 
RIGHT JOIN TABLE_B 
ON 連線條件
[WHERE 條件]
算符常用的是:=、<>,>,<,>=,<=。

查詢所有學生課程的考試成績,
查詢結果保留學生ID、姓名、性別、課程ID、成績

SELECT student.stuid, `name`, sex, subid, socre
FROM student RIGHT JOIN score 
ON student.stuid = score.stuid

內外連線區別
在這裡插入圖片描述
內連線時,得到的結果是公有資料集C。
左外連線時,得到的是A1+C。
右外連線時,得到的是B1+C。