内连接(取的是交集)指的是数据相符合的全部信息(两个表中的所有字段,前提是符合 on后面的连接条件)
eg:select e.id,e.name,d.name from emp e inner join dept d on e.dept_id=d.id;
左外连接,右外连接(取得是交集+全集(单个表))
左连接:select emp.name ,dept.name from emp left join dept on
emp.dept_id=dept.id ;
右链接:select emp.name ,dept.name from emp right join dept on emp.dept_id=dept.id ;
一对多关系
如果以多表为主(左连接以左边的表为主,右连接同理)则数据记录与多表的记录条数相同
如果以一表为主,则数据记录条数会发生变化,(eg:学生表共30条记录,占据三个部门,且有一个未分属部门,部门表中有5个部门,则最终的记录为 30-1+2 含义:以谁为主,谁要全出来,所以5个部门要全出来,29条记录占据三个部门,再加两个部门,则为最终的记录结果数) 实际是部门表全出,但是某一个部门有多条数据而已
子查询:
标量 -- 针对是值 用值去匹配
列-- 一列
行- 一行
子表 -- 超过一行一列
count(*) 统计行数,只要存在即可
count(列名) 统计不为null的
in 与between
对比项 |
IN 操作符 |
BETWEEN 操作符 |
操作对象类型 |
值列表(固定值或子查询结果) |
范围(数值范围、日期范围等) |
匹配逻辑 |
判断字段是否等于列表中的 某个值 |
判断字段是否在指定的 闭区间 [min, max] 内 |
语法示例 |
|
|
NULL 处理 |
若列表包含 ,则 时返回 (需显式处理) |
若边界值为 ,则整个表达式返回 |
场景 |
推荐操作符 |
示例 |
筛选离散值(如部门 ID、状态) |
|
|
筛选连续范围(如薪资、日期) |
|
|
子查询结果匹配 |
|
|
in 对应的是离散的值,betwee对应的是范围,c in(a,b) 对应的关系是 c= a or c= b
直接查询:允许结果集存在重复列名,数据库会自动重命名(但可能导致不可预测的列名)。
select tb_emp.*,tb_dept.name from tb_emp , tb_dept where tb_dept.id=tb_emp.dept_id and tb_dept.name='教研部'; 为什么这里没有说列明重复,但是当作为一个子类是却说列明可能重复
带上前缀也不行吗??? 查询时结果是不带表名的 ,只根据字段名匹配
子查询:要求列名必须唯一,否则报错