数据库的进阶操作
目录
1、数据库的约束
2、查询操作的进阶
2.1 查询插入
2.2 聚合查询
2.3 运算查询
2.3 分组查询
2.4 联合查询
2.5 内外连接
2.6 子查询
2.7 合并查询
1、数据库的约束
数据库的约束是指:数据库会自动的对数据的合法性进行校验和检查的一系列操作的机制,目的就是为了保证数据库避免被插入或修改了一些非法的数据。
MySQL中提供了以下约束:
not null | 指某列不能存储null值 |
unique | 保证某列的每行必须有唯一的值 |
default | 规定没有给列赋值的默认值 |
primary key | not null和unique的结合,确保某列或多列的结合有唯一标识 |
foreign key | 保证一个表中的数据匹配另一个表中值的参照完整性 |
check | 保证列中的值符合指定的条件 |
例如:
primary key 一行记录的身份标识
一张表中只能有一个primary key,一个表中的记录,只能有一个作为身份标识的数据。
使用自增主键,数据库会自动分配一个主键,会从1开始,依次递增的分配主键的值。如果指定插入,默认值会从最大的值开始继续分配。
create table student (id int primary key auto_increment,name varchar(20));
foreign key 外键 描述两个表之间的关联关系
现在有两个表,其中class表对student表进行了约束
创建约束的过程:
create table 表名( 列,列 foreign key(要约束的列)references 来自的表(来自的列));
注意事项:
1、约束别人的表称为“父表”,被约束的表称为“子表”。2、使用外键约束的时候,要求父表中被关联的这一列,要是主键或者被unique修饰。
2、查询操作的进阶
2.1 查询插入
查询可以搭配插入使用,把查询得到的结果,作为插入的数据。
insert into 表1 select * from 表2;
注意:查询出来的结果集,列的数量和类型要和插入的表相匹配。
2.2 聚合查询
表达式查询:针对列和列之间进行运算的
聚合查询:相当于针对行和行之间运算的
1、查询当前行数
select count(要查询的列)from 表名;
注意:
1、要是查询整个表的行数,null会被算进去,如果是查询具体的一列的行数,null不会被算进去。
2、在查询单独列的行数时,还可以对此列的行进行去重操作,在要查询的列前加上distinct。
2.3 运算查询
可以对这一列的若干行进行算术计算,只能对数字类型进行使用,null不会参与运算。
主要运算方式:
SUM() | 求和 |
AVG() | 求平均值 |
MAX() | 求最大值 |
MIN() | 求最小值 |
例如:
2.3 分组查询
可以使用group by进行分组,再针对分组进行聚合查询。
分组规则:针对指定的列进行分组,把这一列中值相同的行,分成一个组。
分组语句:select 列名 from 表名 group by 要分组的列名;
若分组后一个组中有多个数据,会随机输出一个数据作为代表。
分组加聚合语句:select 列名,聚合运算 from 表名 group by 要分组的列名;
例如:
在使用group by进行分组的时候,还可以使用where来搭配条件。
1、分组前条件:where在group前
select 列名,聚合运算 from 表名 where条件 group by 要分组的列名;
2、分组后条件:使用having来描述条件,having在group by后
select 列名,聚合运算 from 表名 group by 要分组的列名 having 条件;
3、使用where和having还可以同时满足前后都有条件的情况
2.4 联合查询
联合查询又称为多表查询,当我们要查询的结果是多个表配合使用才能得到,就可以使用聚合查询,使用SQL语句将多个表进行笛卡尔积,把有效的结果进行筛选出来。
笛卡尔积本质是通过排列组合的方式,得到一个更大的表,这个表的列数是多个表的列数相加,行数是多个表的行数相乘。
例如:有两个表,一个是学生表,一个是成绩表,要计算某个学生的成绩的时候,就可以通过笛卡尔积,把这两个表组合起来,筛选出要得到的结果。
1、先进行笛卡尔积
2、加上连接条件,筛选有效数据。
3、进一步筛选,得到某个同学的成绩,以zhangsan为例。
4、针对要查询的列进行精简
如果是三个表配合才能得到结果,就需要对这三个表进行笛卡尔积,然后需要两个连接条件,来连接这三个表。
2.5 内外连接
内连接:当我们将多个表进行联合查询的时候,通过条件进行连接筛选,只有匹配成功的数据才能作为结果输出。
内连接语句:select * from student inner join score on student.id=score.id;
外连接:外连接分为左外连接和右外连接,左外连接以左侧表为基准,左侧表中的数据没有找到匹配的数据时,以NULL作为代替,右外连接以右侧表为基准,右侧表中的数据没有找到匹配的数据时,以NULL作为代替。
左外连接:
左外连接语句:select * from student left join score on student.id=score.id;
右外连接:
右外连接语句:select * from student right join score on student.id=score.id;
2.6 子查询
子查询:把多个简单的SQL语句拼成一个复杂的SQL语句
单行子查询:查询出的一行记录的结果,作为另一个查询语句的条件进行再次查询。
语句:select 列名 from 表名 where 列名=(select的查询结果);
多行子查询:查询出的多行记录的结果,作为一个范围类型,让另一个查询语句进行判断。
语句:select 列名 from 表名 where 列名 in(select查询的范围结果);
in 表示在这个范围内
2.7 合并查询
使用union关键字可以将多个SQL查询的结果合并到一起
注意:
1、查询出结果的列名以查询第一个表的列名为准
2、两条语句合并查询时,会进行去重操作,若不进行去重,使用union all关键字。