分页查询
SELECT * FROM student LIMIT 0,3; // 前面的0代表起始页,后面的3代表着一页有多少数据 这是第一页
SELECT * FROM student LIMIT 3,3; // 方程 *起始页=(第几页-1)每页的数据个数
表的一对多关系
在多得一方建立外键指向少的一方的主键
ALTER TABLE department DROP FOREIGN KEY emp_dept_fk
ALTER TABLE department ADD CONSTRAINT emp_dept_fk FOREIGN KEY( dep_id) REFERENCES department1(id) ON UPDATE CASCADE ON DELETE CASCADE
表的多对多关系
多对多的关系需要借助中间表,两个sid和cid 字段为第三张表的外键, 分别指向学生表和课程表的id主键。
表的一对一关系
对外键添加unique,让外键唯一,防止出现问题。
数据库设计的范式
1、第一范式(1NF):
所谓第一范式(1NF)是指在关系模型中,对于添加的一个规范要求,所有的域都应该是***原子性***的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
2 第二范式
也就是说需要把对主码部分依赖(对主码属性组部份依赖,即 只需要依赖属性组中的某一个值就可以)的非主属性(去除主码属性组的属性)分到另外一张表。
3、第三范式(3NF)
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
多表查询
内连接查询:
- 隐式内连接:
SELECT
t1.`name`,
t1.`age`,
t2.`dep_location`
FROM
department t1,
department1 t2
WHERE
t1.`dep_id`=t2.`id`
- 显示内连接
```sql
SELECT
t1.name,
t1.age,
t2.dep_location
FROM
department t1
**INNER** JOIN //inner可以省略
department1 t2
ON
t1.dep_id=t2.id`
3 内连接查询
1.从哪些表中查询数据
2.条件是什么
3查询是哪些字段
4 外连接查询
1 左外连接:
SELECT
t1.name,
t1.age,
t2.dep_location
FROM
department t1
**LEFT OUTER JOIN** // outer可以省略,查询的是左表的所有数据和右表的交集
department1 t2
ON
t1.dep_id=t2.id
2 右外连接:
SELECT
t1.name,
t1.age,
t2.dep_location
FROM
department t1
RIGHT OUTER JOIN
department1 t2
ON
t1.dep_id=t2.id
子查询
SELECT
*
FROM
department
WHERE
department.`age`=(SELECT MAX(age) FROM department)
1子查询的结果单行单列
*子查询可以作为条件,使用运算符去判断。运算符:> = <
2子查询的结果多行单列
SELECT
*
FROM
department
WHERE
department.`dep_id`=(SELECT
id
FROM
department1
WHERE
department1.`dep_name`='销售部')
通过IN字符来获取或的两个不同的数据
SELECT
*
FROM
department
WHERE
department.`dep_id`IN (SELECT
id
FROM
department1
WHERE
department1.`dep_name` IN('销售部','研发部'))
//和department1.`dep_name='销售部' OR department1.`dep_name='研发部'相同
3子查询结果多行多列
子查询可以作为一张虚拟表
```sql
SELECT
*
FROM
department1 t1,
(SELECT
*
FROM
department
WHERE department.`age`>=28) t2
WHERE
t1.id=t2.dep_id
**也可以不使用虚拟表**
```sql
SELECT
*
FROM
department
JOIN
department1
ON
department.`dep_id`=department1.`id`
AND
department.`age`>=28