SQL之多表联查

一、数据完整性

数据库的完整性

指数据的有效性和准确性

确保数据的完整性 = 在创建表时给表中添加约束

完整性的分类:

实体完整性(行完整性)、域完整性(列完整性)、引用完整性(关联表完整性)

        主键约束:primary key                                               行完整性

        唯一约束:unique                                                       行完整性

        自动增长:auto_increment                                         行完整性

        非空约束:not null                                                      列完整性

        默认约束:default                                                       列完整性

        数据类型(数值类型、字符串类型、日期类型)             列完整性

        外键约束: foreign key                                                 引用完整性

二、多表查询

多表约束:外键列

在实际开发中,为了数据查询效率,一般不设置表的外键列

2.1.        多表的关系

2.1.1      一对多/多对一关系

        一对多建表原则:在多的一方创建一个字段,字段作为外键指向一的一方的主键

2.1.2      多对多关系

        多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一 方的主键

2.1.3      一对一关系

        在实际的开发中应用不多.因为一对一可以创建成一张表

2.2        多表查询  

分为:

        合并结果集 UNION 、 UNION ALL

        连接查询

                内联  [INNER] JOIN ON

                外联  OUTER JOIN ON

                        左外联 LEFT [OUTER] JOIN ON

                        右外联 RIGHT [OUTER] JOIN ON

                自然连接

        子查询  select的嵌套

2.2.1        合并结果集(用途较少)

        作用:合并结果集就是把两个select语句的查询结果合并到一起! 合并结果集有两种方式:

        UNION:去除重复记录,例如:SELECT* FROM t1 UNION SELECT * FROM t2

        UNION ALL:不去除重复记录,例如:SELECT * FROM t1 UNION ALL SELECT * FROM t2

2.2.2        连接查询(重要!!!!)

        连接查询会出现笛卡尔积现象,即表1的每一条数据会去匹配表2的每一条数据,得到个乘积

        1.内连接

                92版语句:

                select 表1.列名,表2.列名 from 表1,表2 where 表1.列名=表2.列名 and......

                99版语句:

                select 表1.列名,表2.列名 from 表1 inner join 表2 on 表1.列名=表2.列名 where.....

                inner可省略,尽量以后都使用这版,目的是结构清晰易读

        2.外连接

                左外连接

                语法:

                左外联:select 列名 from 主表 left join 次表 on 主表.列名=次表.列名

                主表数据全部显示,次表数据匹配显示,能匹配到的显示数据,匹配不成功的显示null                 主表和次表不能随意调换位置

                右外连接

                left改成right  主表在后

2.2.3        子查询(重要!!!)

        一个select语句中包含另一个完整的select语句。

        子查询出现的位置:

                a. where后,作为条为被查询的一条件的一部分

                b. from后,作表;

        示例:

                工资高于JONES的员工。

        分析:

                查询条件:工资>JONES工资,其中JONES工资需要一条子查询

                第一步:查询JONES的工资

                SELECT sal FROM emp WHERE ename='JONES';

                第二步:拿所有人的工资和jones的工资比

                SELECT * FROM emp WHERE sal > (第一步结果);        

                结果:

                SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE

ename='JONES');

                

### SQL 多表联查概述 SQL 中的 `JOIN` 是一种用于从多个中检索数据的技术。通过指定两个或更多之间的关系,可以实现复杂的查询操作。以下是几种常见的多表联查方式及其语法: #### 左外连接 (LEFT JOIN) 左外连接返回左中的所有记录以及匹配右中的记录。如果右中不存在匹配项,则结果集中对应的字段显示为 NULL。 ```sql SELECT 列名 FROM 主 LEFT JOIN 次 ON 主.列名 = 次.列名; ``` 此语法适用于两或多间的结情况[^2]。 #### 右外连接 (RIGHT JOIN) 右外连接与左外连接相反,它会返回右中的所有记录以及匹配左中的记录。如果没有找到匹配项,则左侧对应的部分填充为 NULL。 ```sql SELECT 列名 FROM 1 RIGHT JOIN 2 ON 1.列名 = 2.列名; ``` 这是执行右侧为主导时使用的标准形式[^1]。 #### 三查询 当涉及三个格的数据提取需求时,可以通过连续两次应用二元 `JOIN` 来完成任务。下面展示了一个具体的例子,其中包含了员工信息 (`employees`)、部门详情 (`departments`) 和职位描述 (`positions`) 的合检索过程。 ```sql SELECT e.*, d.*, p.* FROM employees AS e LEFT JOIN departments AS d ON e.department_id = d.id LEFT JOIN positions AS p ON e.position_id = p.id; ``` 上述脚本展示了如何利用双重 `LEFT JOIN` 将三个独立存储实体的信息整合到单一的结果集里[^3]。 #### 综合实例分析 假设我们有如下几个基础结构化数据库对象定义: - 员工(`employees`) - id INT PRIMARY KEY, - name VARCHAR(50), - department_id INT FOREIGN KEY REFERENCES departments(id) - 部门(`departments`) - id INT PRIMARY KEY, - department_name VARCHAR(100) 为了获取每位雇员的名字连同他们所属的具体分组名称,我们可以编写这样的查询命令: ```sql SELECT employees.name, departments.department_name FROM employees LEFT JOIN departments ON employees.department_id = departments.id; ``` 这段代码片段清楚地体现了基本的一对一映射场景下的资料读取逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值