好好吃饭,好好休息,听着很简单,实际落实缺失不那么容易。
继续回顾MySql的多表查询之1999语法
#二,SQL1999语法 语法: SELECT 查询列表 FROM 表1 别名 【连接类型】 JOIN 表2 别名 ON 链接条件 【WHERE 筛选条件】 【GROUP BY 分组】 【HAVING 筛选条件】 【ORDER BY 排序列表ASC|DESC】 分类(连接类型): 内连接(★): INNER 外联结 左外(★):LEFT 【OUTER】 右外(★):RIGHT 【OUTER】 全外:FULL 【OUTER】 交叉连接:CROSS
===============================================================================
一、内连接 语法: SELECT 查询列表 FROM 表1 别名 INNER JOIN 表2 别名 ON 连接条件 【WHERE 筛选条件】 【GROUP BY 分组】 【HAVING 筛选分组】 【ORDER BY 排序列表 ASC|DESC】 分类: 等值 非等值 自连接 特点: ①添加排序,分组,筛选 ②INNER可以省略 ③筛选条件放在WHERE后面,连接条件放在ON后面,提高分离性,便于阅 读。 ④INNER JOIN连接和SQL1992语法中的等值连接效果是一样的,都是查 询交集部分。
#1.等值连接 #案例1.查询员工名,部门名。交换连接条件不影响结果。 SELECT last_name AS 员工名,department_name AS 部门名 FROM employees e INNER JOIN departments d ON e.department_id=d.department_id; SELECT last_name AS 员工名,department_name AS 部门名 FROM employees d INNER JOIN departments e ON e.department_id=d.department_id;
#案例2.查询名字中包含e的员工和工种名(筛选) SELECT last_name AS 员工名,job_title AS 工种名 FROM employees e INNER JOIN jobs j ON e.job_id=j.job_id WHERE e.last_name LIKE '%e%';
#案例3.查询部门个数>3的城市名和部门个数。(分组+筛选) 分步:先把每个城市的部门个数查出来,在筛选满足条件的。 SELECT city AS 城市,COUNT(*) AS 个数 FROM locations l INNER JOIN departments d ON l.location_id=d.location_id GROUP BY city HAVING COUNT(*) > 3;
#案例4.查询哪个部门员工个数>3的部门名和员工个数,并按个数降序排序。 分步: 1.查询每个部门的员工个数, 2.在上面的结果上筛选出员工数大于3的记录, 3.把员工数排序 SELECT COUNT(*) AS 员工个数,d.department_name AS 部门名 FROM employees e INNER JOIN departments d ON e.department_id=d.department_id GROUP BY d.department_name HAVING COUNT(*) > 3 ORDER BY 员工个数 DESC;
#案例5.查询员工名,部门名,工种名,并按部门名降序。三表连接注意条件。 SELECT last_name AS 员工名,department_name AS 部门名, job_title AS 工种名 FROM employees e INNER JOIN departments d ON e.department_id=d.department_id INNER JOIN jobs j ON e.job_id=j.job_id ORDER BY d.department_name DESC;
#2.非等值连接。范围(间接) #案例1.查询员工的工资级别。 SELECT salary AS 月薪,grade_level AS 工资等级 FROM employees e INNER JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal;
#案例2.查询每个工资的级别的个数>20,并且按降序排列。 SELECT j.grade_level AS 等级,COUNT(*) 个数 FROM employees e INNER JOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal GROUP BY j.grade_level HAVING COUNT(*) > 20 ORDER BY 个数 DESC;
#3.自连接 #案例1.查询员工的名字,上级的名字。 SELECT e.last_name AS 员工名,m.last_name AS 上级名 FROM employees e INNER JOIN employees m ON e.manager_id=m.employee_id;
#案例2.查询员工的名字,上级的名字,名字中包含字符k。 SELECT e.last_name AS 员工名,m.last_name AS 上级名 FROM employees e INNER JOIN employees m ON e.manager_id=m.employee_id WHERE e.last_name LIKE '%k%';
#二,外连接 应用场景:用于查询一个表中有,另一个表没有的记录。 特点: 1.外连接的查询结果为主表中的所有记录 如果从表中有和它匹配的,则显示匹配的值 如果从表中没有和它匹配的,则显示null 外连接查询结果=内连接结果+主表中有而从表没有的记录 2.左外连接,LEFT JOIN左边的是主表 右外连接,RIGHT JOIN右边的是主表 3.左外和右外交换两个表的顺序,可以实现同样的效果。 4.全外连接=内连接的结果+表1中有但表2中没有的+表2中有但表一没有的(Mysql不支持)
引入: SELECT * FROM beauty; SELECT * FROM boys;
#引入:查询男朋友不在男神表的女神名 SELECT b.NAME,bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.boyfriend_id=bo.id;
#左外连接 SELECT b.NAME,bo.* FROM beauty b LEFT OUTER JOIN boys bo ON b.boyfriend_id=bo.id WHERE bo.id IS NULL; #选从表中的主键列
#右外连接,得到同样的结果。 SELECT b.NAME,bo.* FROM boys bo RIGHT OUTER JOIN beauty b ON b.boyfriend_id=bo.id WHERE bo.id IS NULL;
#把beauty表中的id为10行的boyfriend_id从4改到6.才能查询出如下结果。 SELECT b.*,bo.* FROM boys bo LEFT OUTER JOIN beauty b ON b.boyfriend_id=bo.id WHERE b.id IS NULL;
#案例1.哪个部门没有员工。 #左外写法 SELECT d.*,e.employee_id FROM departments d LEFT OUTER JOIN employees e ON d.department_id=e.department_id WHERE e.department_id IS NULL; ============================== #右外写法 SELECT d.*,e.employee_id FROM employees e RIGHT OUTER JOIN departments d ON d.department_id=e.department_id WHERE e.employee_id IS NULL;
#全外连接查出的结果有三部分组成(举例,Mysql不支持)语法结构演示 先把两张表的交集查出来,在把缺失的填充查出来,在把其他无关联的查出来 语法结构示例 SELECT b.*,bo.* FROM beauty b FULL OUTER JOIN boys bo ON b.boyfriend_id=bo.id
#交叉连接,使用1999的语法标准实现的 笛卡尔乘积 SELECT b.*,bo.* FROM beauty b CROSS JOIN boys bo;
#SQL1992语法 与 SQL 1999语法 相比 功能:SQL1999支持的较多 可读性:SQL1999实现连接条件和筛选条件的分离,可读性提高
总结:
SELECT <select_list> FROM A INNER JOIN B ON A.KEY=B.KEY;
SELECT <select_list> FROM A LEFT JOIN B ON A.KEY=B.KEY;
SELECT <select_list> FROM A RIGHT JOIN B ON A.KEY=B.KEY;
SELECT <select_list> FROM A LEFT JOIN B ON A.KEY=B.KEY WHERE B.KEY IS NULL;
SELECT <select_list> FROM A RIGHT JOIN B ON A.KEY=B.KEY WHERE A.KEY IS NULL;
SELECT <select_list> FROM A FULL JOIN B ON A.KEY=B.KEY;
SELECT <select_list> FROM A FULL JOIN B ON A.KEY=B.KEY WHERE A.KEY IS NULL OR B.KEY IS NULL;
简单的多表查询已结束,相信看到这里的基本对简单多表连接应该手到擒来,至于看不懂的emmm...
用我们杨老师的话就是,自己去写个二三十遍就有感觉了。o(^▽^)o。
高考结束,大学生活的开始,世界是属于你们的倒计时开启了...不管你们选择什么专业,只要是你自己选择的,一定要相信自己会在这个专业留下一笔....。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]