Python 41 完整查询语句 和 一堆关键字
一:完整查询语句
1、拷贝表 ***
create table copy_table select *from customer ; 拷贝结构 与数据
create table copy_table select *from customer where 0 > 1; 仅拷贝结构
共同点: 索引 不能拷贝 描述不能拷贝(自增)
[ ] 表示可选的
{ }表示必选的
增
insert [into] 表名[字段名] value|values(字段值....);
into 可省略 [字段名] 可选 如果写了,你后面的值必须与写的字段匹配;不写,后面的值必须和表的结构完全匹配
value 插入一条记录
values 插入多条记录
改
update 表名 set 字段名 = 新的值[,字段n = 新值n] [where 条件] 可以同时修改多个字段用逗号隔开,注意最后一个字段不能加逗号
where 可选 有就修改满足条件的记录,没有就全部修改
删
delete from 表名 [where 条件]
where 可选 有就删除满足条件的记录,没有就全部删除,如果你需要全部删除 请使用truncate table 表名,
delete 是逐行比对 删除 效率低
delete删除的行号会保留
查询:完整的查询语句
select [distinct] {* | 字段名 | 聚合函数 | 表达式} from 表名
[where 条件
group by 字段名
having 条件
order by 字段名
limit 显示的条数]
注意: 关键字的顺序必须与上述语法一致
简单查询 ******
1.* 表示所有列 都显示
2.也可以手动指定要显示的列 可以是多个
3.distinct 用于去除重复的记录,只取出完全相同的记录,当然,也可以手动指定要显示的列 从而来去重
4.表达式 支持四则运算
执行顺序
def select()
from() 打开文件
where() 读取每一行并判断是否满足条件
group() 对数据进行分组
having() 再分组之后进行过滤
having不单独出现 仅用于分组之后进行过滤
distinct() 去重
order() 用于对筛选后的数据 进行排序
limit() 限制显示的条数
最后根据select后制定的字段来显示数据
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
准备数据: create table stu(id int primary key auto_increment,name char(10),math float,english float); insert into stu values(null,"赵云",90,30); insert into stu values(null,"小乔",90,60); insert into stu values(null,"小乔",90,60); insert into stu values(null,"大乔",10,70); insert into stu values(null,"李清照",100,100); insert into stu values(null,"铁拐李",20,55); insert into stu values(null,"小李子",20,55); 查询所有人的总成绩 select name,english+math 总分 from stu; select name,english+10 英语 from stu; 需要 在字段的数据前加上字段名: name:赵云 english:90 math:30 需要使用字符串拼接函数 concat(字符串) 案列: select concat("name:",name), concat("english:",english), concat("math:",math) from stu;
观光代码 **
select (case
when english + math < 150 then
concat(name," shit")
when english + math >= 150 then
concat(name," nice")
end) 评语 from stu;
二:一堆关键字
where 条件 ******
group by 字段名 ***
having 条件 ***
order by 字段名 *****
limit 显示的条数] *******
where
从硬盘上读取数据时的一个过滤条件
where 的筛选过程 在没有索引的情况下,挨个比较效率低,所以我们应该给表添加索引
group by
作用 用于给数据分组
为什么要分组? 思考生活为什么要分组
1.在生活中是为了方便管理
2.在数据库中是为了 方便统计
按照部门给数据分组 select *from emp group by dept;
有两种情况
1.sql_mode中 没有设置 ONLY_FULL_GROUP_BY 显示每个组的第一条记录 没有意义 所以新版中 自带ONLY_FULL_GROUP_BY
2.sql_mode中有设置 ONLY_FULL_GROUP_BY 直接报错
原因是: * 表示所有字段都要显示 但是 分组后 记录的细节被隐藏 只留下了
这意味着:只有出现在group by 后面的字段才能被显示
分组是为了统计分组数据 如何统计?
需要使用到聚合函数
聚合函数:
将一堆数据经过计算,得到一个数据
sum() 求和
avg() 求平均数
max()/min() 求最大值 / 最小值
count() 个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
准备数据 create table emp (id int,name char(10),sex char,dept char(10),job char(10),salary double); insert into emp values (1,"刘备","男","市场","总监",5800), (2,"张飞","男","市场","员工",3000), (3,"关羽","男","市场","员工",4000), (4,"孙权","男","行政","总监",6000), (5,"周瑜","男","行政","员工",5000), (6,"小乔","女","行政","员工",4000), (7,"曹操","男","财务","总监",10000), (8,"司马懿","男","财务","员工",6000);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
查询每个部⻔门有⼏几个⼈人 select dept,count(*) from emp group by dept; 计算每个部⻔门的平均⼯工资 select avg(salary) from emp group by dept; 5.查询平均⼯工资⼤大于5000的部⻔ select avg(salary) from emp where avg(salary) > 5000 group by dept; where 语句后面 不能使用聚合函数 select avg(salary) from emp;
练习一:
总结 :什么时候需要使用分组 只要你的需求中 带有 每个这样的字眼 就需要分组 每个岗位 每个部门 每个性别
练习二:
总结 :where 条件不能用于筛选分组后的数据
group_concat 用于分组后 将组中的某些字段拼接成字符串
select dept,group_concat(name) from emp group by dept;
having
用于对分组后的数据进行过滤
having不会单独出现 都是和group by 一起出现
与where的区别
相同点: 都用于过滤数据
不同点:
1.where是最先执行 用于读取硬盘数据;having 要等到数据读取完之后 才能进过滤 比where晚执行
2.where中不能使用聚合函数;having中可以
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
需求: 5.查询平均⼯工资⼤大于5000的部⻔ select dept,avg(salary) from emp group by dept h0aving avg(salary) > 500; 6.查询工资最高的人的姓名和他的工资 需要用到子查询
order by [desc,asc]
用于对记录进行 排序
desc为降序 asc为升序
按照工资的从低到高顺序 显示所有的员工 select *from emp order by salary; 默认为升序
修改为降序 select *from emp order by salary desc;
按照每个部门的平均工资 降序排序 select dept,avg(salary) from emp group by dept order by avg(salary) desc;
limit *******
用于限制显示的条数 limit [start,]count
看看表里前三条数据 select *from emp limit 3;
看看表里的3-5条 select * from emp limit 2,3;
看工资最高的那个人的信息 select *from emp order by salary desc limit 1;
limit 常用于 数据的分页展示 比如腾讯新闻 的上拉加载新的而一页
select *from emp limit 0,10; 第一页 页数 减1 乘以条数 得到起始位置
select *from emp limit 10,10; 第2页
select *from emp limit 20,10; 第3页