数据表的约束与关系

数据表的约束与关系

### DQL查询语句

##### *ORDER BY(排序):

降序:desc 表名;
升序(默认):ASC  表名;

##### *聚合函数

count:计算总记录数,一般选择非空列:主键列
max:计算最大值
min:计算最小值
avg:计算平均值
sum:求和
用法: SELECT 聚合函数(列名)  FROM 表名;

##### *GROUP BY(分组)

**group by 分组列 having 过滤条件 ;**
**WHERE 过滤条件 group by 分组列;**
where 与having的区别:
where放在分组之前,对原表的数据过滤,不能使用聚合函数.
having放在分组之后,对分组后的数据过滤,可以使用聚合函数.
-- 按照性别分组,并统计人数个数
SELECT sex, count(*)  FROM student3 GROUP BY sex;

##### *LIMIT(分页查询)

SELECT * FROM 表名 LIMIT 起始索引值,每页显示条数;
公式:起始索引值=(当前页数-1)*每页条数(页数要在两页以上)

##### *备份数据库

mysqldump -uroot -proot db1 > d:/day01.sql      (这是在数据库未登陆状态下DOS窗口操作)

##### *还原数据库

create database db1;(创建数据库)
USE db3;     (使用数据库)
source d:/day01.sql;

### 数据表的约束

##### 非空约束-not null(常用)

1.创建表时添加非空约束
CREATE TABLE st5(id INT not null, NAME VARCHAR(20), age INT)

2.创建表完后,添加非空约束
alter table 表名 modify 字段名  字段类型 not null;

3.删除非空约束
alter table 表  modify  字段名 字段类型;

##### 唯一约束-unipue(常用)
注意:唯一约束,字段数据不能重复,不能为两个null;

1.创建表时添加唯一约束
CREATE TABLE st5(id INT , phone VARCHAR(20) unipue, age INT)

2.创建表完后,添加唯一约束
alert table 表名 modify 字段名  字段类型 unique;

3.删除唯一约束
alter table 表名 drop index 字段名;

##### 主键约束-PRIMARY KEY(常用)

注意:非空且唯一,只有一个字段为主键,一般是id.

1.创建表时添加主键约束
CREATE TABLE 表名( id INT PRIMARY KEY, NAME VARCHAR(20), age INT)

2.创建表完后,添加主键约束
- [ ] alter table 表名 modify 字段名  字段类型 PRIMARY KEY;
- [ ] alter table 表名 add PRIMARY KEY(id);

3.删除主键约束
alter table 表名  drop PRIMARY KEY;

##### 自动增长-AUTO_INCREMENT

注意:自动增长一般和主键一起使用,自动增长只对int类型数据有用.

1.创建表时主键添加自动增长
CREATE TABLE 表名( id INT PRIMARY KEY   AUTO_INCREMENT, NAME VARCHAR(20), age INT)

2.添加自动增长
alter table 表名 modify 字段名  字段类型  AUTO_INCREMENT;

3.删除主键自动增长
alter table 表名 modify 主键字段 字段类型;

##### 外键约束-foreign key

注意:外键就是从表何和主表主键对应的那一列.

1.在创建表的时候,可以添加约束
create table 表名(
... 
外键列 
constraint (外键名称)  foreign key (外键列名称)  references  主表名(主键字段名)
)

2.删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;  

3.创建表之后,添加外键
ALTER TABLE 表名 ADD constraint 外键名称 foreign key (外键列名称)  references  主表名(主键字段名)

##### 级联操作

级联更新:ON UPDATE CASCADE
级联删除:ON DELETE CASCADE
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES  主表名称 (主表键) ON UPDATE CASCADE ON DELETE CASCADE; 

### 数据表关系

##### 多表之间的关系(重点)
**一对一:**人和身份证----可以在任意一方添加外键指向另一方主键.(一般情况下合成一张表)
**一对多(多对一):**员工和部门----在多的一方建立外键,指向一的一方的主键
**多对多:**学生选课程----需要创建第三张中间表,至少包含两个列,这两个字段作为第三张表的外键,分别指向两张表的主键

### 数据表的范式

注意:共有6类范式,常用前三种.
作用:消除冗余数据.

| 范式 | 特点                                                         |
| ---- | ------------------------------------------------------------ |
| 1NF  | 原子性:表中每列不可再拆分。                                 |
| 2NF  | 不产生局部依赖,一张表只描述一件事情                         |
| 3NF  | 不产生传递依赖,表中每一列都直接依赖于主键。而不是通过其它列间接依赖于主键。 |

### ======================================================

### 数据表约束案例:

```
-- 创建(主表)部门表(id,dep_name,dep_location)
CREATE TABLE department( 
 id INT PRIMARY KEY AUTO_INCREMENT, 
 dep_name VARCHAR(20), 
 dep_location VARCHAR(20) 
); 

-- 添加 2 个部门
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳'); 

-- 查询部门表
SELECT * FROM department; 

-- 2)  创建从表 employee 并添加外键约束 emp_depid_fk
CREATE TABLE employee( 
 id INT PRIMARY KEY AUTO_INCREMENT, 
 NAME VARCHAR(20), 
 age INT, 
 dep_id INT,   -- 外键对应主表的主键 
 CONSTRAINT emp_depid_fk FOREIGN KEY (dep_id) REFERENCES department(id) -- 创建外键约束 
) 

-- 3)  添加数据
INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); 
INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2); 

-- 查询员工表
SELECT * FROM employee; 
```

### 数据表关系案例:

```
-- 部门表
CREATE TABLE DEPT(
	DEPTNO INT PRIMARY KEY,
	DNAME VARCHAR(14), -- 部门名称
	LOC VARCHAR(13)-- 部门地址
        );
-- 为部门表添加数据
INSERT INTO DEPT VALUES	(10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES	(30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES	(40,'OPERATIONS','BOSTON');

-- 员工表
CREATE TABLE EMP(
	EMPNO INT  PRIMARY KEY, -- 员工编号
	ENAME VARCHAR(10), -- 员工姓名
	JOB VARCHAR(9), -- 员工工作
	MGR INT, -- 员工直属领导编号
	HIREDATE DATE, -- 入职时间
	SAL DOUBLE, -- 工资
	COMM DOUBLE, -- 奖金
	DEPTNO INT  -- 所在部门
	);
	
-- 为员工表添加数据
INSERT INTO EMP VALUES(7369,'SMITH','职员',7566,"1980-12-17",800,NULL,20);
INSERT INTO EMP VALUES(7499,'ALLEN','销售员',7698,'1981-02-20',1600,300,30);
INSERT INTO EMP VALUES(7521,'WARD','销售员',7698,'1981-02-22',1250,500,30);
INSERT INTO EMP VALUES(7566,'JONES','经理',7839,'1981-04-02',2975,NULL,20);
INSERT INTO EMP VALUES(7654,'MARTIN','销售员',7698,'1981-09-28',1250,1400,30);
INSERT INTO EMP VALUES(7698,'BLAKE','经理',7839,'1981-05-01',2850,NULL,30);
INSERT INTO EMP VALUES(7782,'CLARK','经理',7839,'1981-06-09',2450,NULL,10);
INSERT INTO EMP VALUES(7788,'SCOTT','职员',7566,'1987-07-03',3000,2000,20);
INSERT INTO EMP VALUES(7839,'KING','董事长',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO EMP VALUES(7844,'TURNERS','销售员',7698,'1981-09-08',1500,50,30);
INSERT INTO EMP VALUES(7876,'ADAMS','职员',7566,'1987-07-13',1100,NULL,20);
INSERT INTO EMP VALUES(7900,'JAMES','职员',7698,'1981-12-03',1250,NULL,30);
INSERT INTO EMP VALUES(7902,'FORD','销售员',7566,'1981-12-03',3000,NULL,20);
INSERT INTO EMP VALUES(7934,'MILLER','职员',7782,'1981-01-23',1300,NULL,10);

-- 工资等级表
CREATE TABLE SALGRADE( 
	GRADE INT,-- 等级
	LOSAL DOUBLE, -- 最低工资
	HISAL DOUBLE  -- 最高工资
	);
	
-- 为工资表添加数据	
INSERT INTO SALGRADE VALUES (1,500,1000);
INSERT INTO SALGRADE VALUES (2,1001,1500);
INSERT INTO SALGRADE VALUES (3,1501,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);

-- 查询员工表
SELECT * FROM emp;

-- 查询工资表
SELECT * FROM SALGRADE;

-- 1、查找部门30中员工的详细信息。
SELECT * FROM emp WHERE DEPTNO=30;

-- 2、找出从事职员工作的员工的编号、姓名、部门号。
SELECT EMPNO,ENAME,DEPTNO,job FROM emp WHERE job='职员';

-- 3、检索出奖金多于基本工资的员工信息。
SELECT * FROM emp WHERE COMM>SAL;

-- 4、检索出奖金多于基本工资60%的员工信息。
SELECT * FROM emp WHERE COMM>(SAL*0.6);

-- 5、找出姓名中包含A的员工信息.
SELECT * FROM emp WHERE  ENAME LIKE '%A%';

-- 6、找出姓名以A、B、S开始的员工信息。
SELECT * FROM emp WHERE  ENAME LIKE 'A%' OR 'B%' OR 'S%';

-- 7、找到名字长度为7个字符的员工信息。
SELECT * FROM emp WHERE  ENAME LIKE '_______';

-- 8、名字中不包含R字符的员工信息。
SELECT * FROM emp WHERE  ENAME NOT LIKE 'R%';

-- 9、返回员工的详细信息并按姓名升序排序。
SELECT * FROM emp  ORDER BY ENAME ASC;

-- 10、返回员工的信息并按姓名降序,工资升序排列。
SELECT * FROM emp  ORDER BY ENAME DESC,SAL ASC;

-- 11、计算员工的日薪(按30天)。
SELECT *,round((sal/30),2) AS 日薪 FROM emp; -- round(计算值,取值小数位) 
SELECT *,round(((sal+ IFNULL(comm,0)) /30),2) AS 日薪 FROM emp;

-- 12、找出获得奖金的员工的信息。
SELECT * FROM emp WHERE comm IS NOT NULL;

-- 13、找出奖金少于100或者没有获得奖金的员工的信息。
SELECT * FROM emp WHERE comm IS NULL OR comm<100;

-- 14、找出10部门的经理、20部门的职员 的员工信息。
SELECT * FROM emp WHERE DEPTNO=10  AND job='经理' OR DEPTNO=20 AND job='职员';

-- 查询部门表
SELECT *FROM dept;
```

### DQL查询案例:

##### *条件查询

-- 查询年龄小于20的人
SELECT * FROM student3 WHERE age<20;

-- 查询年龄不等于23的人
SELECT * FROM student3 WHERE age <> 23;
SELECT * FROM student3 WHERE age !=23;

-- 查询年龄在20到30岁之间的人
SELECT * FROM student3 WHERE age BETWEEN 20 AND 30;
SELECT * FROM student3 WHERE age>=20 AND age<=30;

-- 查询年龄是 22和23岁的人
SELECT * FROM student3 WHERE age IN(22,23);
SELECT * FROM student3 WHERE age=22 OR age=23;

-- 查询英语成绩为空的数据
SELECT * FROM student3 WHERE english IS NULL ;

-- 查询英语成绩不为空的数据
SELECT * FROM student3 WHERE english IS NOT NULL ;

##### *模糊查询

-- 查询姓马的人
SELECT * FROM student3 WHERE NAME LIKE '马%';

-- 查询三个字的姓名的人(此处有三个下划线)
SELECT * FROM student3 WHERE NAME LIKE '___';

-- 查询名字中有德字的人(模糊查询)
SELECT * FROM student3 WHERE NAME LIKE '%德%';

##### *排序

-- 按照年龄排序
SELECT * FROM student3	ORDER BY age ASC;

-- 按照年龄排序,如果年龄相同,就按照数学成绩排序
SELECT * FROM student3	ORDER BY age ASC,math DESC;

##### *去重

SELECT DISTINCT address FROM student3;

##### *聚合函数

-- 计算总数据
SELECT COUNT(*) FROM student3;
SELECT COUNT(1) FROM student3; -- 效率高

-- 求最大值
SELECT MAX(math) FROM student3;

-- 求最小值
SELECT MIN(math) FROM student3;

-- 求平均分
SELECT AVG(english) FROM student3;

-- 求和
SELECT SUM(english) FROM student3;

##### *分组查询

-- 按照性别分组,并统计人数个数
SELECT sex, COUNT(*) FROM student3 GROUP BY sex;

-- 按性别分组,分别计算男女同学的平均分和人数
SELECT sex,AVG(math),COUNT(id) FROM student3 GROUP BY sex;

-- 按性别分组,分别计算男女同学的平均分和人数,分数低于80分的人不参与分组
SELECT sex,AVG(math),COUNT(id) FROM student3 WHERE math >80 GROUP BY sex;

-- 按性别分组,分别计算男女同学的平均分和人数,分数低于80分的人不参与分组,分组之后,要求人数大于2个人
SELECT sex,AVG(math),COUNT(id) FROM student3 WHERE math >80 GROUP BY sex HAVING COUNT(id) > 2;

-- 按性别分组,分别计算男女同学的平均分和人数,分数低于80分的人不参与分组,分组之后,要求人数大于2个人
SELECT sex,AVG(math),COUNT(id) AS 人数 FROM student3 WHERE math >80 GROUP BY sex HAVING 人数 >2;

##### *分页查询

-- 从第3条开始显示,显示6条数据
SELECT * FROM student3 LIMIT 2,6;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值