内容
一、 DQL 查询语句
1.排序查询
2.聚合函数
3.分组查询
4.分页查询
二、约束
三、多表间关系
四、范式
五、数据库备份与还原DQL 查询语句
排序查询
语法:ORDER BY 子句
eg:
ORDER BY 排序字段1 排序方式1, 排序字段2 排序方式2 ....排序方式:
ASC 升序 默认方式
DESC 降序 注意: 如果有多个排序条件,则当前面的条件值相同时才考虑后面的排序条件
聚合函数
将一列数据作为一个整体,进行纵向计算- count
- max, min
- sum, avg
注:聚合函数的计算排除了 NULL值,
解决方案:
1.一般选择非空的列:主键
2.IFNULL
eg:
SELECT COUNT(english)) FROM student;//排除NULL
SELECT COUNT(IFNULL(english, 0)) FROM student; //有NULL作0分组查询
语法:GROUP BY 子句
注意!:
1.分组之后查询的字段: 分组字段、聚合函数
where 和 having 的区别
a. where 在分组前进行限定,若不满足条件,则不参与分组。having 在分组之后进行线性,若不满足条件,则不会被查询出来。
b. where 后不可以跟聚合函数, having 可以进行聚合函数的判断
eg:
-- 按照性别分组,分别查询男女同学平均分
SELECT sex, AVG(math)
FROM student GROUP BY sex;
-- 按照性别分组,分别查询男女同学平均分,人数
SELECT sex, AVG(math), COUNT(id)
FROM student GROUP BY sex;
-- 按照性别分组,分别查询男女同学平均分,人数 要求:分数低于70分的人,不参与分组(分组前添加限定条件)
SELECT sex, AVG(math), COUNT(id)
FROM student
WHERE math> 70 GROUP BY sex;
-- 按照性别分组,分别查询男女同学平均分,人数 要求:分数低于70分的人,不参与分组,分组之后,人数要大于两个人(分组之后限定条件)
SELECT sex, AVG(math), COUNT(id) number
FROM student
WHERE math>70
GROUP BY SEX
HAVING number >2; //起别名判断更方便分页查询
语法:limit 开始的索引, 每页查询的条数;
公式: 开始的索引 = (当前页码 - 1) *
每页显示的条数
limit 是一个“方言”,不同数据库对应函数不同。
eg:
-- 每页显示三条记录
SELECT *FROM student LIMIT 0,3; --第一页
SELECT *FROM student LIMIT 3,3; --第二页
SELECT *FROM student LIMIT 6,3; --第二页约束
概念:对表中数据进行限定,保证数据的正确性、有效性、完整性
分类:
1.主键约束: primary key
2.非空约束: not null
3.唯一约束: unique
4.外键约束: foreign key
非空约束 NOT NULL
某一列值不能为NULL;1.创建表时添加约束
CRETE TABLE stu{
id INT,
name VARCHAR(20) NOT NULL --name非空
};
-- 删除 name的非空约束
ALTER TABLE stu MODIFY NAME VARCHAR(20);2 . 创建表后,添加约束
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;唯一约束
某一列值不能重复注意:唯一约束可以NULL值,但只能有一条记录为NULL。
1.创建表时添加约束
CRETE TABLE stu{
id INT,
phone_number VARCHAR(20) UNIQUE --name非空
};
-- 删除唯一约束(错误方法 ×),和删除非空约束不太一样
ALTER TABLE stu MODIFY phone_number VARCHAR(20);
-- 删除唯一约束的正确操作
ALTER TABLE stu DROP INDEX phone_numher;2.创建表后添加约束
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;主键约束
1、注意:
1.含义:非空且唯一
2.一张表只能有一个字段为主键
3.主键是表中记录的唯一标识2、创建表时,添加主键约束
CREATE TABLE stu{
id INT PRIMARY KEY, -- 给id 添加主键约束
name VARCHAR(20)
};3、删除主键
-- 错误做法 alter table stu modify id int;
--正确做法,因为只有一个主键,不必指明
ALTER TABLE stu DROP PRIMARY KEY;4、创建表后,添加主键
ALTER TABLE stu MODIFY id INT PRIMARY KEY;5、自动增长(一般配合主键使用)
1.概念:如果某一列为数值类型,使用 auto_increment 可以用来完成值的自动增长
2.在创建表时,添加主键约束,并且完成主键自增长(和上条记录相关)
create table stu{
id int primary key auto_increment, -- 给id 添加主键约束
name varchar(20)
};
3. --删除自动增长
alter table stu modiy id int;
(并不会删除主键)
4. --添加自动增长
alter table stu modiy id int auto_increment;外键约束
让表间产生关系,保证数据的正确性创建表时,可以添加外键
语法:create table 表名{ ... 外键列, constraint 外键名称 foreign key ( 外键列名称) references 主表名称(主表主键名称) };eg:
--部门表 CREATE TBALE department{ id INT PRIMARY KEY AUTO_INCREMENT, dep_name VARCHAR(20), dep_lacation VARCHAR(20) }; --创建员工表 多方、从表 CREATE TBALE employee{ id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), age INT, dep_id INT, -- 外键对应主表的主键 CONSTRAINT emp_dept_fk FOREIGN KEY(dep_id) REFERENCES department(id); };删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名称) REFERENCES 主表名称(主表列名称);
4.级联操作
添加外键时设置级联更新
1.语法:
ALTER TABLE 表名
ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名称)
REFERENCES 主表名称(主表列名称)
ON UPDATE CASCADE; --更新2.分类:
a.级联更新: ON UPDATE CASCADE (谨慎使用级联)
b.级联删除:ON DELETE CASCADE
数据库设计
一.多表之间的关系
A. 分类
1.一对一
2.一对多(多对一)
*分析:部分和员工间
3.多对多
*分析:学生和课程选课关系
B. 实现
1.一对多(多对一)
* 实现方式: 在多的一方(从表)建立外键,指向一(主表)的主键
2.多对多 (学生选课)
* 实现方式: 引入中间表
三种方式图解如下 一对一关系实现
一对多关系实现

多对多关系实现

二.数据库设计范式
1、第一范式(1NF):数据库表的每一列都是不可分割的原子数据项
2、第二范式(2NF)
在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
3、第三范式(3NF)
在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)
对三大范式的通俗理解:
1.第一范式:
原子性,不可分割
2.第二范式:
消除部分依赖(通过表的拆分)
3.第三范式:
消除传递依赖(还是通过表的拆分)
*** 几个概念
1.函数依赖: A-->B ,如果通过A属性的值,可以确定唯一B属性的值,则称B依赖于A
例如: 学号 --> 姓名 (学号,课程名称) -->分数
2.完全函数依赖: A --> B, 如果A 是一个属性组, 则B属性值的确定需要依赖于A属性组中所有属性的值。
例如 (学号, 课程名称) --> 分数
3.部分函数依赖: A --> B, 如果A是一个属性组,则B属性值的确定只需要依赖A属性组中的某一些值即可。
例如: (学号, 课程名称) --> 姓名
4.传递函数依赖: A--> B, B -->C, 如果通过A属性(属性组)的值,可以确定唯一B属性的值,再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于 A.
例如: 学号 --> 系名 --> 系主任
5.码: 如果一张表中,一个属性或者属性组 被 其他所有属性所完全依赖,则称这个属性(属性值)为该笔的码。
例如:该表中为(学号,课程名称)
* 主属性: 码属性组中的所有属性
* 非主属性: 不是码中的属性数据库的备份和还原
1.命令行:
备份语法: mysqldump -u用户名 -p密码 数据库名称 >保存路径
还原:
1.登录数据库
2.创建数据库 create database ***
3.使用数据库 use ***
4.执行文件( source 数据库路径)2.图形界面
导出sql 文件
用Navicat导入时,我发现不能直接导入数据,必须新建数据库,再在表里右键选择导入sql 文件。
总结:
这算是在MySQL 基础上进一步说了一些知识了,关于 范式的内容也明白清晰了不少,还是觉得sql语句应该多用才能孰能生巧,并且应用到实际开发过程中,不能纸上谈兵!!!