文章目录
约束
约束名称 | 描述 | 关键字 |
---|---|---|
非空约束 | 保证列中所有数据不能有null值 | not null |
唯一约束 | 保证列中所有数据各不相同 | unique |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | primary key |
默认约束 | 保存数据时,未指定值则采用默认值 | default |
外键约束 | 外键用来让两个表的数据之间建立连接,保证数据的一致性,完整性 | foreign key |
数据库设计
一对多实现方式
- 在多的一方建立外键关联低的一方的主键
多对多实现方式
- 建立第三方中间表
- 中间表至少包含两个外键,分别关联双方主键
一对一实现方式
- 在任意一方建立外键,关联对方主键,并设置外键唯一
多表查询
笛卡尔积:取A,B集合所有组合情况
select * from tb_1,tb_2;
分类
连接查询
-
🍎内连接
相当于查询A,B的交集部分
- 🌳隐式内连接
- select 字段列表 from 表1,表2… where 条件;
- 字段列表可以这样写:fg: A.name,B.age…
- 当现实中A,B名字很长的情况下可以给表起别名类似于给字段起别名直接 A a,B b 中间有空格
- 🌳显示内连接
- select 字段列表 from 表1 inner join 表2 on 条件 📕这里的inner可以省略
- 🌳隐式内连接
-
🍎外连接
-
🌳左外连接:A的部分和A与B的交集的部分
-
select 字段列表 from 表1 left outer join 表2 on 条件
-
🌳右外连接:B的部分和A与B交集的部分
-
select 字段列表 from 表1 right outer join 表2 on 条件
-
这里的 outer 也是可以省略的
-
子查询
查询中嵌套查询,称嵌套查询为子查询
Fg:查询工资高于A的员工信息;分两步走:1.先查询A的工资 2.查询工资高于A的员工
- 根据子查询结果不同,作用不同
单行单列(作为条件值)
使用 = != > < 进行条件判断
select 字段列表 from 表名 where 字段名 =(!= > <) (子查询)
多行单列(多为条件值)
使用 in 关键字进行判断
select 字段列表 from 表名 where in (子查询)
多行多列(多为虚拟表)
select 字段列表 from (子查询) where 条件
练习
练习1 ✊
select emp.id,emp.ename,emp.salary,job.jname,job.description from emp,job where emp.job_id=job.id
练习2 ✊
select emp.id,emp.ename,emp.salary,job.jname,job.sescription,dept.dname,dept.loc
from emp,job,dept where emp.job_id=job.id and emp.dept_id=dept.id
练习3 ✊
select emp.ename,emp.salary,t1.grade from emp,salarygrade t1
where emp.salary between t1.losalary and t1.hisalary
练习4 ✊
select emp.ename,emp.salary,job.jname,job.decription,dept.dname,dept.loc,t1.grade
from emp inner
join job on emp.job_id=job.id inner
join dept on emp.dept_id=dept.id inner
join salarygrade t1 on emp.salary between t1.losalary and t1.hisalary
练习5 ✊
select dept.id,dept.dname,dept.loc,t1.count
from dept,(select dept_id,count(*) count from emp group by dept_id ) t1
where t1.dept_id=dept,id