20231110
数据库
约束
提高数据的正确性,但是减少了效率
1.开发中,两个效率
执行效率
开发效率
通常情况下,我们认为开发效率更重要
主要就是在软件开发过程中,人力成本远远大于硬件成本
数据库设计
1.实体
2.梳理清楚实体之间的关系
一对一
一对多
多对多
新增
(新增和查询操作组合在一起,以查询结果作为插入的值)
insert into表2 select * from 表1
将表2的数据插入到表1
把查询的临时数据 ---> 永久数据
要求列相互对应 列名不以言也无所谓
将多个sql套娃
varchar(n)中的n不要求一致,只要都是字符串即可
聚合查询
查询带表达式
select name ,chinese+math+english from ......
带着三个列进行运算的
聚合查询就是行和行之间的关系,有一定的限制,不像列和列那么方便
可以理解为库函数
count(expr) 查询到数据的数量
select count(*) from exam;
先执行select * from exam
再算 count(*)
如果查询结果带有空值,空值是没有记录的(使用count(*)的时候,即使都是null的行也是计算在内的)
下面的函数都得结合数据进行运算
sum
select sum(chinese) from result; 将这一列的值相加,但是null会忽略掉
show warnings
sql很多时候都会尝试将字符串转成数字
avg
max
min
使用聚合函数的时候列和列之间都已经被打散了,如果查询中包含聚合函数和非聚合的列,各自是各自的
有一个情况例外
group by
我们可以用降序排列再limit
我们这个时候可以使用group by
有的时候要按照岗位进行查询或者统计,就可以使用group by
1.查询每个岗位的平均薪资
select role,avg(salary) from emp group by role;
由于是按照role来group by ,所以列名可以写role,不能写 id 和name
分组查询也有条件
1.分组之前的使用where表示(不必分组就能得到)
select role,avg(salary) from emp where name != '张三' group by role;
2.分组之后使用having表示(分组之后才知道)
select role,avg(salary) from emp group by role having avg(salary) < 20000;
分组操作,往往是和聚合操作配合使用的
联合查询(多表查询)
笛卡尔积是两张表运算
student(id ,name,classid)
1 张三 1
2 李四 1
3 王五 2
4 赵六 2
class (classId name)
1 java100
2 java101
拼接
1 张三 1 1 java100
1 张三 1 2 java101
笛卡尔积得到的是一张更大的表
列数是之前的表的列数之和.行数是表的行数之积
实际开发中多表查询一定要慎重使用
使用之前一定要评估好笛卡尔成绩的规模
笛卡尔积有有意义的也有没意义的
也不是随便两个表都能进行笛卡尔乘积,至少有一列是有关联的
根据上述讨论,只要在笛卡尔积过程中,把classid相同这个事件使用where 条件筛选出来
在SQL中进行笛卡尔积非常简单,只用select 即可
select * from student,class;
保证有效(这种条件称之为连接条件)
select * from student,class where student.classId = class.classId;
多表查询步骤:
1.笛卡尔积
2.连接条件
3.根据需求指定其他条件
4.针对列进行精简/聚合查询