我们可以根据实际的需求场景,明确当前要创建几个表,每个表内部有什么,这些表之中哪些表是存在着一定联系的.
先梳理清楚需求看需要哪些表,表里面需要哪些内容
再确定好表与表之间的"关系"
表与表之间的关系有:
一对一
一个学生只能拥有一个账号.一个账号也只能披一个学生拥有
student-account(studentld, name,)
一对多
一个学生,只能在一个班级中,一个班级,可以包含多个学生
class (id, name)
1 一班
student(id, name, classld)
1 张三 1
2 李四 1
3 王五 1
多对多
一个学生,可以选择多门课程.—门课程,也可以包含多个学生.
student-course(studentld, courseld,name)
1 1 张三选了语文课
1 2 张三选了数学课
2 1 李四选了语文课
2 3 李四选了英语课
上述都属于设计数据库表结构的固定套路.
聚合查询
增加数据
查询可以搭配插入使用,把查询语句的查询结果,作为插入的数值
总和查询
表达式查询,是针对列和列之间进行运算的
聚合查询,相当于是在行和行之间进行运算了.
注:
sql中可以通过--表示注释--后头至少要有一个空格.
另外也支持#开头作为注释
先执行select*,再针对结果集合进行统计(看看具体有几行)
直接查询时也可以查看具体有多少行,为什么还要使用count(*)???
因为这是mysql客户端内置的功能,
如果你是通过代码来操作mysql服务器可就没有这个功能
count(*)得到的结果还可以参与各种算术运算,还可以搭配其他sql使用.
1)如果当前的列里面有null
两种方式计算的count就不同了.
select count(*) from 表名;
2)指定具体列,是可以进行去重的
select count(distinct 列名) from 表名;
.
求合查询
把这一列的若干行,给进行求和.(算术运算)只能针对数字类型使用.
1.select chinese + math 把对应的列相加,得到一个临时表
2.在把这个临时表的结果进行行和行相加.
分组查询
使用group by进行分组,针对每个分组,再分别进行聚合查询.
针对指定的列进行分组,把这一列中,值相同的行,分成到一组中,得到若干个组,针对这些组,分别使用聚合函数
统计同名的人有多少
使用group by还可以搭配其他条件
需要区分清楚,该条件是分组之前的条件,还是分组之后的条件
分组之前的where一般都是在分组之前的,并且其在gruop by之前
分组之后的条件使用having 描述条件.having子句一般写在group by 的后面
联合查询
联合查询是同时对多个针对多个表来进行的查询。
要想明白联合查询就要先理清笛卡尔积在这的作用。
class (id,name) student ( id, name, class_ld)
1 1班 1 张三 1
2 2班 2 李四 2
3 3班 3 王五 3
将这两个表进行笛卡尔积,会得到一个更大的表。
笛卡尔积的列数,是这两个表的列数相加.笛卡尔积的行数,是这两个表的行数相乘.
id, name id , name, class_ld
1 1班 1 张三 1
1 1班 2 李四 2
1 1班 3 王五 3
类似不完全的表(只写出了class表的第一行于student表的组合 )
从上表中可以看出,数据有一些不符合实际情况的数据,比如第二行和第三行数据无法使用,因为他两不可能同时是两个班的学生。
所以进行多表查询的时候,就需要把有意义的数据筛选出来,无意义的数据,排除掉
如何通过 sql的条件筛选出来呢??
就需要将两个表中数据相关联的数据进行连接如下
where班级表的id =学生表的class_ld
建议使用表明.列名 可读性强
还可以只查询张三的信息
只查询张三部分信息
上面这些操作都是基于"内连接"
mysql来说,进行联合查询,还可以使用"外连接"(左外连接,右外连接)
如果这两个表,里面的记录都是存在对应关系,内连接和外连接的结果是一致的.如果存在不对应的记录,内连接和外连接就会出现差别.
内连接
逗号换成 join一样
左外连接
left join
左外连接,就是以左侧表为基准,保证左侧表的每个数据
都会出现在最终结果里.如果在右侧表中不存在,对应的列就填成null
-
右外连接
right join
右外连接,是以右侧表为基准,保证右侧表的每个数据
都会出现在最终结果里.如果左侧表中不存在,对应的列就填成null
自连接.一张表,自己和自己进行笛卡尔积.
有的时候,需要去进行行和行之间的比较
而sql只能进行列和列之间比较
sql里写个条件,都是列和列之间进行比较
但是有的时候可能会涉及到需求是进行行和行比较.
就可以使用自连接,把行的关系转换成列的关系
查找出谁的1课程的成绩高于3课程的成绩
注:自连接必修要进行起别名。
子查询
子查询:本质上是在"套娃"
把多个简单的SQL拼成一个复杂的SQL
现在查找和躺平的同班同学中想考研的人
中间括号是必修返回一行数据否则会报错
这就是单行子查询。
现在查找和考研的同班同学中不想考研的人
这就是多行子查询。
合并查询
把多个sql查询的结果集合,合并到一起.
union关键字
允许把两个不同的表,查询结果合并在一起.合并的两个sql的结果集的列,需要匹配.
列的个数和类型,是要一致的(列名不需要一致)
合并的时候,是会去重的
要是不想去重,可以使用union all