mysql連接查詢

進(jìn)階6:連接查詢

/*
含義:又稱多表查詢,當(dāng)查詢的字段來(lái)自于多個(gè)表時(shí),就會(huì)用到連接查詢

笛卡爾乘積現(xiàn)象:表1 有m行,表2有n行,結(jié)果=m*n行

發(fā)生原因:沒(méi)有有效的連接條件
如何避免:添加有效的連接條件

分類:

按年代分類:
sql92標(biāo)準(zhǔn):僅僅支持內(nèi)連接
sql99標(biāo)準(zhǔn)【推薦】:支持內(nèi)連接+外連接(左外和右外)+交叉連接

按功能分類:
    內(nèi)連接:
        等值連接
        非等值連接
        自連接
    外連接:
        左外連接
        右外連接
        全外連接
    
    交叉連接

*/

SELECT * FROM beauty;

SELECT * FROM boys;

SELECT NAME,boyName FROM boys,beauty
WHERE beauty.boyfriend_id= boys.id;

一、sql92標(biāo)準(zhǔn)

1、等值連接

/*

① 多表等值連接的結(jié)果為多表的交集部分
②n表連接,至少需要n-1個(gè)連接條件
③ 多表的順序沒(méi)有要求
④一般需要為表起別名
⑤可以搭配前面介紹的所有子句使用,比如排序、分組、篩選

*/

案例1:查詢女神名和對(duì)應(yīng)的男神名

SELECT NAME,boyName
FROM boys,beauty
WHERE beauty.boyfriend_id= boys.id;

案例2:查詢員工名和對(duì)應(yīng)的部門名

SELECT last_name,department_name
FROM employees,departments
WHERE employees.department_id=departments.department_id;

2、為表起別名

/*
①提高語(yǔ)句的簡(jiǎn)潔度
②區(qū)分多個(gè)重名的字段

注意:如果為表起了別名,則查詢的字段就不能使用原來(lái)的表名去限定

*/

查詢員工名、工種號(hào)、工種名

SELECT e.last_name,e.job_id,j.job_title
FROM employees e,jobs j
WHERE e.job_id=j.job_id;

3、兩個(gè)表的順序是否可以調(diào)換

查詢員工名、工種號(hào)、工種名

SELECT e.last_name,e.job_id,j.job_title
FROM jobs j,employees e
WHERE e.job_id=j.job_id;

4、可以加篩選

案例:查詢有獎(jiǎng)金的員工名、部門名

SELECT last_name,department_name,commission_pct

FROM employees e,departments d
WHERE e.department_id=d.department_id
AND e.commission_pct IS NOT NULL;

案例2:查詢城市名中第二個(gè)字符為o的部門名和城市名

SELECT department_name,city
FROM departments d,locations l
WHERE d.location_id = l.location_id
AND city LIKE '_o%';

5、可以加分組

案例1:查詢每個(gè)城市的部門個(gè)數(shù)

SELECT COUNT(*) 個(gè)數(shù),city
FROM departments d,locations l
WHERE d.location_id=l.location_id
GROUP BY city;

案例2:查詢有獎(jiǎng)金的每個(gè)部門的部門名和部門的領(lǐng)導(dǎo)編號(hào)和該部門的最低工資

SELECT department_name,d.manager_id,MIN(salary)
FROM departments d,employees e
WHERE d.department_id=e.department_id
AND commission_pct IS NOT NULL
GROUP BY department_name,d.manager_id;

6、可以加排序

案例:查詢每個(gè)工種的工種名和員工的個(gè)數(shù),并且按員工個(gè)數(shù)降序

SELECT job_title,COUNT()
FROM employees e,jobs j
WHERE e.job_id=j.job_id
GROUP BY job_title
ORDER BY COUNT(
) DESC;

7、可以實(shí)現(xiàn)三表連接?

案例:查詢員工名、部門名和所在的城市

SELECT last_name,department_name,city
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id
AND d.location_id=l.location_id
AND city LIKE 's%'

ORDER BY department_name DESC;

2、非等值連接

案例1:查詢員工的工資和工資級(jí)別

SELECT salary,grade_level
FROM employees e,job_grades g
WHERE salary BETWEEN g.lowest_sal AND g.highest_sal
AND g.grade_level='A';

/*
select salary,employee_id from employees;
select * from job_grades;
CREATE TABLE job_grades
(grade_level VARCHAR(3),
lowest_sal int,
highest_sal int);

INSERT INTO job_grades
VALUES ('A', 1000, 2999);

INSERT INTO job_grades
VALUES ('B', 3000, 5999);

INSERT INTO job_grades
VALUES('C', 6000, 9999);

INSERT INTO job_grades
VALUES('D', 10000, 14999);

INSERT INTO job_grades
VALUES('E', 15000, 24999);

INSERT INTO job_grades
VALUES('F', 25000, 40000);

*/

3、自連接

案例:查詢 員工名和上級(jí)的名稱

SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.manager_id=m.employee_id;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容