字段控制查询
去除重复记录:
查询所有学生name信息,去除重复信息
SELECT DISTINCT name FROM students;
把查询字段的结果进行运算,必须都要是数值型.
SELECT *,字段1+字段2 FROM 表名;
注意
列有很多记录的值为null,因为任何东西与NULL相加的结果还是NULL,所以结算结果可能会出现NULL,下面使用了把NULL转化成数值0的函数IFNULL:
SELECT *,age+IFNULL(score,0) FROM students;
对查询结果起别名 在上面的查询中出现列名为sx+IFNULL(yw,0),这很不美观,现在我们给这一列起一个别名,为total:
SELECT *,yw+IFNULL(sx,0) AS total FROM score;
省略
AS SELECT *,yw+IFNULL(sx,0) total FROM score;
聚合函数:
对查询的结果进行统计计算.
常用聚合函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
分组查询1. 什么是分组查询将查询结果按照1个或者多个字段进行分组,字段值相同的为1组(例如:有10个人,女的站一排,男的站一排,把男女进行分组)
SELECT gender FROM employee GROUP BY gender;
对所有部门分组:
SELECT department FROM employee GROUP BY department;
根据gender字段来分组,gender字段的全部值只有两个('男'和'女'),所以分为了两组,当GROUP BY 单独使用时,只显示出每组的第一条记录,所以GROUP BY单独使用意义不大.
- 分组注意事项:在使用分组时,select后面直接跟着的字段一般都在出现在group by后 例子1: 对name和gender同时进行分组
SELECT name,gender FROM employee GROUP BY gender,name;
分组查询-使用1:
GROUP BY+GROUP_CONCAT()
GROUP_CONCAT(字段名)可以作为一个输出字段来使用.
表示分组之后,根据分组结果,使用group_concat()来 放置每一组的某字段的值的集合.
1.1 使用:
在一组里面所有男性名字和女性名字:
SELECT gender,GROUP_CONCAT('name') FROM employee GROUP BY gender;
2.GROUP BY + 聚合函数通过:group_concat()的启发,我们既然可以统计出每个分组的某字段的值的集合,那么我们也可以通过集合函数来对这个'值的集合'做一些操作.
- GROUP BY + having:
用分组查询后指定一些条件来输出查询结果,
having作用和where一样,但是having只能用于GROUP BY.
3.2 HAVING和WHERE的区别:
HAVING是在分组后对数据进行过滤;
WHERE是在分组前对数据进行过滤;
HAVING后面可以使用分组函数(统计函数);
WHERE后面不可以使用分组函数;
WHERE是对分组前记录的条件,如果某行记录没有满足where子语句的条件,那么这行记录不参与分组;而HAVING是对分组后的数据约束;
、数据完整性
- 什么是数据完整性:
保证用户输入的数据保存到数据库中是正确的.
假设给students表输入学号,学号显然不能重复,所以需要我们在创建表的时候添加一个约束,确保学号必须是唯一的,这样我们就必须输入正确的数据,不能输入重复学号。实际上我们在一开始创建表的时候,就可以确定哪些是可以为空哪些不能为空,哪些可以重复哪些不可以重复.
-
如何添加数据完整性:
在创建表的时候给表添加约束. -
完整性分类:
实体完整性
域完整性
引用完整性
约束类型:
主键约束(primary key)
唯一约束(unique)
自动增长(auto_increment)
主键约束3.1.1 特点:
(创建)每个表中要有一个主键,
数据唯一,且不能为null.
唯一约束3.2.1 特点:
指定列的数据不能重复.
可以为空值
添加方式:
CREATE TABLE 表名(字段名1 数据类型 primary key,字段名2 数据类型);
3.2.2 格式:
CREATE TABLE students(
id INT primary key,
name VARCHAR(50) UNIQUE
).
3.3 自动增长列3.3.1 特点:
指定列的数据自动增长,即使数据删除,还是从删除的序号继续往下,一般我们会给主键设置为自动增长列.
3.3.2 格式:
CREATE TABLE 表名(
字段名1 数据类型 primary key AUTO_INCREMENT,
字段2 数据类型 UNIQUE);
四、域完整性:
-
使用:
限制此单元格的数据正确,不对照此列的其他单元格比较
域代表当前的单元格 -
域完整性:
2.1 数据类型
数值类型
日期类型
字符串类型.
2.2 非空约束(NOT NULL)
CREATE TABLE stu(
id int primary key auto_increment,
name varchar(20) unique not null,
gender char(1) default '男'
)
2.3 默认值约束(DEFAULT)CREATE TABLE 表名(字段名1 数据类型 primary key AUTO_INCREMENT,字段2 数据类型 UNIQUE NOT NULL,字段3 数据类型 DEFAULT '默认值');
五、参照完整性介绍:
-
什么是参照完整性:
是指表与表之间的一种对应关系.
通常情况下可以通过设置两表之间的主键、外键关系,或者编写两表的触发器来实现.
有对应参照完整性的两张表格,再对他们进行数据插入,更新,删除的过程中,系统都会将被修改表格与另外一张对应表格进行对照,从而阻止一些不正确的数据的操作. -
数据库的主键和外键类型一定要一致.
-
两个表必须要是InnoDB引擎.
-
设置参照完整性后,外键当中的内值,必须得是主键当中的内容.
-
一个表设置当中的字段设置为主键,设置主键的为主表.
-
创建表时,设置外键,设置外键的为子表.
对已有表添加外键关系:
ALTER TABLE score ADD CONSTRAINT sc_st_fk FOREIGN KEY(sid) REFERENCES student(id);
七、MySQL--数据库设计三范式
(1)、什么是数据库设计三范式设计数据库表的时候所依据的规范,共三个规范:
- 第一范式: 要求每一个字段原子性不可在分.
- 第二范式: 要求所有非主键字段完全依赖主键,不能产生部分依赖.
- 第三范式: 所有非主键字段和主键字段之间不能产生传递依赖.
(2)、第一范式(1NF):数据库表中不能出现重复记录,每个字段是原子性的不能再分.
存在问题:
联系方式字段可以再分,不是原子性的
关于列不可再分,应该根据具体的情况来决定,如联系方式(看公司具体需求)。
(3)、第二范式(2NF):
第二范式是建立在第一范式基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖.
(4)、第三范式建立在第二范式基础上的,非主键字段不能传递依赖主键的字段(不要产生传递依赖).
5、几个经典的设计:
5.1 一对一:
第一种方案:分为两张表存储,共享主键 第二种方案:分为两张表存储,外键唯一.
5.2 一对多:
分两张表存储,在多的一方添加外键,这个外键字段引用一的一方中的主键字段.
5.3 多对多:
分三张表存储,在学生表中存储学生信息,在课程表中存储课程信息,在学生选课表中存储学生和课程的关系信息.
网友评论