1. 数据的增删改
a) 增:insert into t values(值1,…….)
b) 删:delect from t where 字段名=值
c) 改:update t set 字段名=新的值 where 字段名=值
2.关键字的作用
distinct 去除重复数据 所有数据全都重复才算重复
where 在逐行读取数据时的一个判断条件
group by 对数据分组
having 对分组后的数据进行过滤
order by 对结果排序
limit 指定获取数据条数
3.单表查询
无条件查询 :select *|字段名|四则运行|聚合函数 from t;
完整的select 语句 语法
select [distinct] * from 表名
[where
group by
having
order by
limit]
注意 在书写时 必须按照这个顺序来写 但是不代表执行顺序
数据库伪代码
def from():
打开文件
def where():
对读取的数据进行过滤
def group_by():
对数据分组
def having():
对分组后的数据进行过滤
def distinct():
去除重复数据
def order():
排序
def limit():
指定获取条数
select 语句的执行顺序
def select(sql):
data = from()
data = where(data)
data = group by(data)
data = having(data)
data = distinct(data)
data = order_by(data)
data = limit(data)
return data;
简单查询
指定显示格式:
concat()函数用于拼接字符串
select
(
case
when english + math > 120 then
concat(name," nice")
when english + math <= 130 then
concat(name," shit")
end
) ,english,math from stu;
Where 条件:
Select * from t where 条件
group by 分组查询
什么是分组
把一个整体 分割为多个部分
为什么分组
在数据库中分组为了统计
分组后 组里的详细记录就被隐藏起来了 不能直接查看
可以使用group_concat(字段名)把隐藏的数据显示出来
注意: 1.只有出现在group by 后面的字段 才可以被显示 其他都被影藏了
2.聚合函数不能写在where的后面 where最先执行 它的作用硬盘读取数据并
过滤 以为数据还没有读取完 此时不能进行统计
什么样的字段适合用于分组
重复性高的字段
了解:
在mysql 5.6中 分组后会默认显示 每组的第一条记录 这是没有意义的
5.7不显示 因为5.7中 sql_mode中自带 ONLY_FULL_GROUP_BY
group by 后面可以有多个分组与依据 会按照顺序执行
order by 排序用的
asc 表示升序 是默认的
desc 表示降序
by 后面可以有多个排序依据
limit 限制显示条数
limit a,b
limit 1,5
从1开始 到5结束 错误
从1开始 不包含1 取5条
使用场景:
分页查询
3.正表达式匹配(where 条件匹配)
由于like只能使用% 和 _ 不太灵活
可以将like换为 regexp 来使用正则表达式
4.多表查询
1.笛卡尔积查询
select *from 表1,表n
查询结果是:
将坐左表中的每条记录 与右表中的每条记录都关联一遍
a表有m条记录 b表有n条记录
笛卡尔积结果为m * n 记录
需要自己筛选出正确的关联关系
select *from emp,dept where emp.dept_id = dept.id;
2.内连接查询 就是笛卡尔积查询
select *from emp [inner] join dept;
select *from emp inner join dept where emp.dept_id = dept.id;
3.左外链接查询
select *from emp left join dept on emp.dept_id = dept.id;
左表数据全部显示 右表只显示匹配上的
4.右外链接查询
select *from emp right join dept on emp.dept_id = dept.id;
右表数据全部显示 左表只显示匹配上的
内和外的理解 内指的是匹配上的数据 外指的是没匹配上的数据
5.全外连接
select *from emp full join dept on emp.dept_id = dept.id; ##mysql不支持
union 合并查询结果
select *from emp left join dept on emp.dept_id = dept.id
union
select *from emp right join dept on emp.dept_id = dept.id;
union 去除重复数据 只能合并字段数量相同的表
union all 不会去除重复数据
on 关键字 where 都是用于条件过滤 没有本质区别
where用于单表 on 用于多表
三表查询:用多表的理论
例子:
create table stu(id int primary key auto_increment,name char(10));
create table tea(id int primary key auto_increment,name char(10));
create table tsr(id int primary key auto_increment,t_id int,s_id int,
foreign key(s_id) references stu(id),
foreign key(s_id) references stu(id));
insert into stu values(null,"张三"),(null,"李四");
insert into tea values(null,"egon"),(null,"wer");
insert into tsr values(null,1,1),(null,1,2),(null,2,2);
select *from stu join tea join tsr
on stu.id = tsr.s_id and tea.id = tsr.t_id
where tea.name = "egon";
多表查询套路
1.把所有表都连起来
2.加上连接条件
3.如果有别的过滤条件 加上where
5.子查询
当一个查询的结果是另一个查询的条件 这个查询称之为子查询(内层查询)
什么时候使用子查询
当一次查询无法得到想要结果时 需要多次查询
解决问题的思路
是把一个复杂的问题 拆分为多个简单的问题
是把一个复杂的查询 拆分为多个简单的查询