1. 程式人生 > 實用技巧 >四、SQL之單表和多表查詢

四、SQL之單表和多表查詢

一、單表查詢

-- 萬用字元*,查詢整個表
SELECT * FROM `test_zjx`;

-- 過濾條件
SELECT * FROM `test_zjx` WHERE `name`='zhangjx3';

-- 條件 and 且
SELECT * FROM `test_zjx` WHERE `name`='zhangjx3' AND sex=1;

-- 條件 or 或
SELECT * FROM `test_zjx` WHERE `name`='zhangjx3' OR id=9;

-- 條件 and 和 or 同時存在
SELECT * FROM `test_zjx` WHERE
`name`='zhangjx3' AND sex=1 OR id=9; -- 不等於 != SELECT * FROM `test_zjx` WHERE sex!=2; SELECT * FROM `test_zjx` WHERE sex<>2;

二、多表查詢

1)兩張表查詢

注意:不加where過濾條件,就是test_zjx表的5條資訊,test_info表的5條資訊的笛卡兒積。一共25條

卡爾乘積是指在數學中,兩個集合X和Y的笛卡爾積(Cartesian product),又稱直積,表示為X×Y,第一個物件是X的成員而第二個物件是Y的所有可能有序對
的其中一個成員 例如,A={a,b}, B={0,1,2},則 A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)} B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

2)外來鍵

多表關聯使用:外來鍵

test_zjx和test_info兩張表,test_zjx的主鍵是id,test_info的外來鍵是memberID。如下是如何設定外來鍵:

3)多張表查詢

查詢某個老師帶的是哪個班?

select * from S,SC,C where S.S# =SC.S#  and
SC.C# = C.C#

三、連線查詢

1)內連線----》INNER JOIN

select * from member a,info b where a.id = b.memberID;------》是隱性內連線

改成INNER JOIN:兩個表之間加上INNER JOIN ,where 改為on

--內連線INNER JOIN
select * from member a INNER JOIN info b on a.id = b.memberID and `address`='北京'; 

2)左外連線-----LEFT JOIN

左外連線以左表為主表,主表的所有資料都會顯示,右表為從表,從表只有匹配的資料才會顯示

語法:select 欄位1,欄位2 from 表1 LEFT JOIN 表2 on 條件

A、查詢所有欄位*:

--左外連線
select * from member a LEFT JOIN info b on a.id =b.memberID and `address` = '北京';

B、查詢部分欄位

select a.id,a.name,a.address,b.memberID,b.id from member a LEFT JOIN info b on a.id =b.memberID and `address` = '北京'; 

3)右外連線-----RIGHT JOIN

與左連線相反,右外連線以坐表為主表,主表的所有資料都會顯示,左表為從表,從表只有匹配的資料才會顯示

--右外連線
select a.id,a.name,a.address,b.memberID,b.id from member a RIGHT JOIN info b on a.id =b.memberID and `address` = '北京'; 

四、查詢結果排序(order by)

1)升序:asc

--排序 預設時asc,可以不寫
select * from member a LEFT JOIN info b on a.id =b.memberID and `address` = '北京' order by a.id asc;

2) 降序:desc

-- 降序 desc,不可省略
-- 按照前後順序:a.id升序排序完成,有相同序號的,會依據b.id降序(a.id排序的優先順序在前面)
select * from member a LEFT JOIN info b on a.id =b.memberID and `address` = '北京' order by a.id asc,b.id desc;