日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL笔记——多表查询

發布時間:2023/12/10 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL笔记——多表查询 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多表查詢不能使用 SELECT * from emp, dept; 會產生笛卡爾積。 笛卡爾積,有A,B兩個集合,A中有5條信息,B中有4條信息,那么查詢結果就是5*4=20條

一、內連接查詢

-- 隱式內連接SELECT 字段列表 FROM 表1,表2,… WHERE 條件;例:select emp.name,emp.age,dept.dep_name from emp,dept where emp.dep_id = dept.id;可以給表起別名將上面的語句轉換成下面這種。select t1.name,t1.age,t2.dep_name from emp t1,dept t2 where t1.dep_id = t2.id;

-- 顯示內連接SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 條件;如:select emp.name,dept.dep_name from emp inner join dept on emp.dep_id = dept.id;可以給表起別名將上面的語句轉換成下面這種。select t1.name,t2.dep_name from emp t1 inner join dept t2 on t1.dep_id = t2.id;

二、外連接查詢

(1)左外連接:相當于查詢A表所有數據和交集部分數據左外連接:SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 條件;select * from emp left join dept on emp.dep_id = dept.id;

(2)右外連接:相當于查詢B表所有數據和交集部分數據右外連接:SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 條件;select * from emp right join dept on emp.dep_id = dept.id;

三、子查詢

(1)子查詢概念查詢中嵌套查詢,稱嵌套查詢為子查詢;(2)子查詢根據查詢結果不同,作用不同:①單行單列:作為條件值,使用 '=' '!=' '>' '<'等進行條件判斷SELECT 字段列表 FROM 表 WHERE 字段名 = (子查詢);查詢年齡大于周八的select * from emp where age>(select age from emp where name = '周八');

②多行單列:作為條件值,使用in關鍵字進行條件判斷SELECT 字段列表 FROM 表 WHERE 字段名 in (子查詢);查詢研發和銷售的所有員工信息select * from emp where dep_id in (select id from dept where dep_name = '研發部' or dep_name = '銷售部' );

③多行多列:作為虛擬表SELECT 字段列表 FROM (子查詢) WHERE 條件;-- 查詢入職日期是‘1998-08-01’之后的員工信息和部門信息把(SELECT * from emp WHERE join_date>'1998-08-01')這個多行多列表作為虛擬表查詢放到from后面SELECT * FROM (SELECT * from emp WHERE join_date>'1998-08-01') t1,dept WHERE t1.dep_id = dept.id;

四、練習

新建員工表,部門表,職務表,工資等級表 1.查詢所有員工信息。查詢員工編號id,員工姓名ename,工資salary,職務名稱jname,職務描述description 2.查詢員工編號,員工姓名,工資,職務名稱,職務描述,部門名稱,部門位置 3.查詢員工姓名,工資,工資等級 4.查詢員工姓名,工資,職務名稱,職務描述,部門名稱,部門位置,工資等級 5.查詢出部門編號、部門名稱、部門位置、部門人數具體步驟如下:首先新建四張表: -- 部門表 CREATE TABLE dept ( id INT PRIMARY KEY auto_increment, -- 部門iddname VARCHAR ( 50 ), -- 部門名稱loc VARCHAR ( 50 ) -- 部門所在地 ); -- 職務表,職務名稱,職務描述 CREATE TABLE job ( id INT PRIMARY KEY, -- 職務idjname VARCHAR ( 20 ), -- 職務名稱description VARCHAR ( 50 ) -- 職務描述 ); -- 員工表 CREATE TABLE emp (id INT PRIMARY KEY,-- 員工idename VARCHAR ( 50 ),-- 員工姓名job_id INT,-- 工作編號mgr INT,-- 上級領導joindate DATE, -- 入職日期salary DECIMAL ( 7, 2 ), -- 工資bonus DECIMAL ( 7, 2 ),-- 獎金dept_id INT, -- 所在部門編號CONSTRAINT fk_emp_jobid_job_id FOREIGN KEY ( job_id ) REFERENCES job ( id ),CONSTRAINT fl_emp_deptid_dept_id FOREIGN KEY ( dept_id ) REFERENCES dept ( id ) ); -- 工資等級表 CREATE TABLE salarygrade ( grade INT PRIMARY KEY, -- 界別losalary INT, -- 最低工資hisalary INT -- 最高工資 ); 添加數據: -- 添加4個部門 INSERT INTO dept ( id, dname, loc ) VALUES( 10, '教研部', '北京' ),( 20, '學工部', '上海' ),( 30, '銷售部', '廣州' ),( 40, '財務部', '深圳' ); -- 添加4個職務 INSERT INTO job ( id, jname, description ) VALUES( 1, '董事長', '管理整個公司,接單' ),( 2, '經理', '管理部門員工' ),( 3, '銷售員', '向客人推銷產品' ),( 4, '文員', '使用辦公軟件' ); -- 添加員工 INSERT INTO emp ( id, ename, job_id, mgr, joindate, salary, bonus, dept_id ) VALUES( 1001, '孫悟空', 4, 1004, '2000-12-17', '8000.00', NULL, 20 ),( 1002, '盧俊義', 3, 1006, '2001-02-10', '16000.00', 3000.00, 30 ),( 1003, '林沖', 3, 1006, '2001-02-22', '12500.00', 5000.00, 30 ),( 1004, '唐僧', 2, 1009, '2001-04-02', '29750.00', NULL, 20 ),( 1005, '李逵', 4, 1006, '2001-09-17', '12500.00', 14000.00, 30 ),( 1006, '宋江', 2, 1009, '2001-05-17', '28500.00', NULL, 30 ),( 1007, '劉備', 2, 1009, '2001-09-17', '24500.00', NULL, 10 ),( 1008, '豬八戒', 4, 1004, '2007-12-17', '30000.00', NULL, 20 ),( 1009, '羅貫中', 1, NULL, '2000-12-17', '50000.00', NULL, 10 ),( 1010, '吳用', 3, 1006, '2001-09-17', '15000.00', '0.00', 30 ),( 1011, '沙僧', 4, 1004, '2007-05-17', '11000.00', NULL, 20 ),( 1012, '李逵', 4, 1006, '2001-12-03', '9500.00', NULL, 30 ),( 1013, '小白龍', 4, 1004, '2001-12-03', '30000.00', NULL, 20 ),( 1014, '關羽', 4, 1007, '2002-01-12', '13000.00', NULL, 10 ); -- 添加工資等級 INSERT INTO salarygrade ( grade, losalary, hisalary ) VALUES( 1, 7000, 12000 ),( 2, 12010, 14000 ),( 3, 14010, 20000 ),( 4, 20010, 30000 ),( 5, 30010, 99990 ); 1.查詢所有員工信息。查詢員工編號id,員工姓名ename,工資salary,職務名稱jname,職務描述description -- 1.查詢所有員工信息。查詢員工編號id,員工姓名ename,工資salary,職務名稱jname,職務描述description /* 分析: 1.員工編號id,員工姓名ename,工資salary 在emp表中 2.職務名稱jname,職務描述description,在職務表中 3.職務表和員工表是一對多的關系 e.job_id = j.id 通過內連接可完成 */ -- 隱式內連接 SELECTemp.id,emp.ename,emp.salary,job.jname,job.description FROMemp,job WHEREemp.job_id = job.id; -- 顯示內連接 SELECTemp.id,emp.ename,emp.salary,job.jname,job.description FROMempINNER JOIN job ON emp.job_id = job.id; 2.查詢員工編號,員工姓名,工資,職務名稱,職務描述,部門名稱,部門位置 -- 2.查詢員工編號,員工姓名,工資,職務名稱,職務描述,部門名稱,部門位置 /* 分析: 1.員工編號,員工姓名,工資,在emp表中 2.職務名稱,職務描述,在job表中 3.部門名稱,部門位置,在dept表中 4.職務表和員工表是一對多的關系 e.job_id = j.id 5.部門表和員工表是一對多的關系 e.dept_id = d.id */ -- 隱式內連接 SELECTemp.id,emp.ename,emp.salary,job.jname,job.description,dept.dname,dept.loc FROMemp,job,dept WHEREemp.job_id = job.id AND emp.dept_id = dept.id;-- 顯示內連接 SELECTemp.id,emp.ename,emp.salary,job.jname,job.description,dept.dname,dept.loc FROMempINNER JOIN job ON emp.job_id = job.idINNER JOIN dept ON emp.dept_id = dept.id; 3.查詢員工姓名,工資,工資等級 -- 3.查詢員工姓名,工資,工資等級 /*1.員工姓名,工資,emp2.工資等級,salarygrade3. salarygrade.losalary < emp.salary AND salarygrade.hisalary > emp.salary */SELECTemp.ename,emp.salary,s.grade FROMemp,salarygrade s WHEREemp.salary >= s.losalary AND emp.salary <= s.hisalary; 4.查詢員工姓名,工資,職務名稱,職務描述,部門名稱,部門位置,工資等級 -- 4.查詢員工姓名,工資,職務名稱,職務描述,部門名稱,部門位置,工資等級 /*1.員工姓名,工資,emp2.職務名稱,職務描述,job3.部門名稱,部門位置,dept4.工資等級,salarygrade5.職務表和員工表是一對多的關系 e.job_id = j.id6.部門表和員工表是一對多的關系 e.dept_id = d.id7.salarygrade.losalary < emp.salary AND salarygrade.hisalary > emp.salary */ -- 隱式內連接 SELECTemp.ename,emp.salary,job.jname,job.description,dept.dname,dept.loc,s.grade FROMemp,job,dept,salarygrade s WHEREemp.job_id = job.id AND emp.dept_id = dept.id AND emp.salary >= s.losalary AND emp.salary <= s.hisalary;-- 顯式內連接 SELECTemp.id,emp.ename,emp.salary,job.jname,job.description,dept.dname,dept.loc FROM empINNER JOIN job ON emp.job_id = job.idINNER JOIN dept ON emp.dept_id = dept.idINNER JOIN salarygrade s ON emp.salary >= s.losalary AND emp.salary <= s.hisalary; 5.查詢出部門編號、部門名稱、部門位置、部門人數 -- 5.查詢出部門編號、部門名稱、部門位置、部門人數 /*1.部門編號、部門名稱、部門位置,dept2.部門人數,按照dept_id,進行GROUP BY分組,count(*) 統計人數*/ -- 1.先在emp表中分組并統計人數,2.然后將1中產生的表作為子查詢使用 SELECTdept.*,t1.total FROMdept,(SELECT dept_id, count( * ) total FROM emp GROUP BY dept_id ) t1 WHEREt1.dept_id = dept.id;-- 第二種方法,先把員工和部門關聯起來,然后按照部門id分組,并統計人數 SELECTcount( * ),t.* FROM( SELECT dept.* FROM emp, dept WHERE emp.dept_id = dept.id ) t GROUP BYt.id;

總結

以上是生活随笔為你收集整理的MySQL笔记——多表查询的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。