首页 > 其他分享 >21.多表查询

21.多表查询

时间:2024-09-09 15:52:37浏览次数:4  
标签:多表 21 查询 dept employee 连接 select name

多表关系

一对多(多对一)
多对多
一对一

一对多

案例:部门与员工
关系:一个部门对应多个员工,一个员工对应一个部门
实现:在多的一方建立外键,指向一的一方的主键

多对多

案例:学生与课程
关系:一个学生可以选多门课程,一门课程也可以供多个学生选修
实现:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

一对一

案例:用户与用户详情
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率
实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

查询
合并查询(笛卡尔积,会展示所有组合结果):

select * from employee, dept;
笛卡尔积:两个集合A集合和B集合的所有组合情况(在多表查询时,需要消除无效的笛卡尔积)
消除无效笛卡尔积:
select * from employee, dept where employee.dept = dept.id;

内连接查询
内连接查询的是两张表交集的部分
隐式内连接:

SELECT 字段列表 FROM 表1, 表2 WHERE 条件 ...;

显式内连接:

SELECT 字段列表 FROM 表1 [ INNER ] JOIN 表2 ON 连接条件 ...;

显式性能比隐式高
例子:

-- 查询员工姓名,及关联的部门的名称
-- 隐式
select e.name, d.name from employee as e, dept as d where e.dept = d.id;
-- 显式
select e.name, d.name from employee as e inner join dept as d on e.dept = d.id;

外连接查询
左外连接:
查询左表所有数据,以及两张表交集部分数据

SELECT 字段列表 FROM 表1 LEFT [ OUTER ] JOIN 表2 ON 条件 ...;
相当于查询表1的所有数据,包含表1和表2交集部分数据

右外连接:
查询右表所有数据,以及两张表交集部分数据

SELECT 字段列表 FROM 表1 RIGHT [ OUTER ] JOIN 表2 ON 条件 ...;

例子:

-- 左
select e.*, d.name from employee as e left outer join dept as d on e.dept = d.id;
select d.name, e.* from dept d left outer join emp e on e.dept = d.id;  -- 这条语句与下面的语句效果一样
-- 右
select d.name, e.* from employee as e right outer join dept as d on e.dept = d.id;

左连接可以查询到没有dept的employee,右连接可以查询到没有employee的dept

自连接查询
当前表与自身的连接查询,自连接必须使用表别名
语法:

SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件 ...;

自连接查询,可以是内连接查询,也可以是外连接查询
例子:

-- 查询员工及其所属领导的名字
select a.name, b.name from employee a, employee b where a.manager = b.id;
-- 没有领导的也查询出来
select a.name, b.name from employee a left join employee b on a.manager = b.id;

联合查询 union, union all
把多次查询的结果合并,形成一个新的查询集
语法:

SELECT 字段列表 FROM 表A ...
UNION [ALL]
SELECT 字段列表 FROM 表B ...

注意事项

UNION ALL 会有重复结果,UNION 不会
联合查询比使用or效率高,不会使索引失效

标签:多表,21,查询,dept,employee,连接,select,name
From: https://www.cnblogs.com/gom-linwei/p/18404715

相关文章

  • CS3214 Fall 2024     Exercise
    CS3214Fall2024       Exercise0DueDate: seewebsiteInthisclass,youarerequiredtohavefamiliaritywithUnixcommandsandUnixpro-grammingenvironments.Thefirstpartofthisexerciseisareviewtomakesureyouarecomfortableinou......
  • 设计模式 21 策略模式
    设计模式21创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式(11):责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者......
  • 常见查询日志
    `cataccess.log|grepnginx|awk'{print$1}'|sort|uniq-c|sort-nr-k1|head-n10|awk-F'''{print$2"次数:"$1}'1、查看有多少个IP访问awk'{print$1}'log_file|sort|uniq|wc-l2、查看某一个页面被访问的次数:grep&qu......
  • 《DNK210使用指南 -CanMV版 V1.0》第二十三章 六轴传感器——姿态解算实验
    第二十三章六轴传感器——姿态解算实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK2......
  • day21
    非递减子序列classSolution{public:voidbacktracking(vector&nums,intstart){if(path.size()>1){ret.push_back(path);}if(start==nums.size()){return;}unordered_setuset;for(inti=start;i<nums.size();++i){if((!path.empty()&......
  • nginx查询日志
    #!/bin/bash日志格式:$remote_addr-$remote_user[$time_local]"$request"$status$body_bytes_sent"$http_referer""$http_user_agent""$http_x_forwarded_for"LOG_FILE=$1echo"统计访问最多的10个IP"awk'{a[$1]+......
  • 3.6 MySQL基本查询大全(select、子查询、Distinct、group by分组,order排序、limit限制
    文章目录3.6.1MySQL的基本查询1.SELECT语句基本语法2.DISTINCT3.指定列,去除重复列4.给列设置别名5.使用WHERE子句查询指定条件比较判断范围判断字符串模式匹配错误判断空值判断6.使用ORDER子句对查询结果排序7.使用LIMIT限制查询结果数量3.6.2分组查询1.聚......
  • 11.DQL(数据查询语言)-分组查询
    语法:SELECT字段列表FROM表名[WHERE条件]GROUPBY分组字段名[HAVING分组后的过滤条件];where和having的区别:执行时机不同:where是分组之前进行过滤,不满足where条件不参与分组;having是分组后对结果进行过滤。判断条件不同:where不能对聚合函数进行判断,而having可......
  • 09.DQL(数据查询语言)-条件查询
    语法:SELECT字段列表FROM表名WHERE条件列表;条件:比较运算符 功能> 大于>= 大于等于< 小于<= 小于等于= 等于<>或!= 不等于BETWEEN…AND… 在某个范围内(含......
  • [LeetCode] 2181. Merge Nodes in Between Zeros
    Youaregiventheheadofalinkedlist,whichcontainsaseriesofintegersseparatedby0's.ThebeginningandendofthelinkedlistwillhaveNode.val==0.Foreverytwoconsecutive0's,mergeallthenodeslyinginbetweenthemintoasing......