基本的查询语句 select (* | 字段名 | 四则运算 | 聚合函数) from 表名称;
取别名 当字段名显示较长时 可以添加别名 select 字段名 as 别名 from 表名称; as可以省略 select 字段名 别名 from 表名称;
计算每个人的总分 计算每个人的各科目平均分
增删改查 增 insert into 表名称(字段,...) values(值,....),(值,....); values中的值的个数 和类型必须与 前方声明的字段一致 insert into 表名称 values(值,....); values中的值的个数 和类型必须与表的字段完全一致
into 可以省略
stu name char(20) default "张三",age int
#insert into table_name values(20),(30),(40);
# 错误name虽然有默认值 但是在这种语法下也必须赋值
删
delete from table_name where 条件;
delete from table_name;
truncate table table_name;
改
update table_name set 字段名称 = 新的值 where 条件;
update table_name set 字段名称 = 新的值[,字段2 = 值2,...];
查
select语句的完整语法:
select [distinct] (*|字段|四则运算|聚合函数) from 表名
where 查询条件
group by 分组
having 分组后的过滤
order by 排序
limit 限制获取的条数
必须的 select 字段 from 表名
distinct 去除重复
强调: 书写顺序必须按照上面的来
执行顺序与书写顺序不一致
# 伪代码 演示执行顺序
def select():
from()
where()
group by()
having()
order by()
limit()
distinct()
# 从文件读取数据
def from():
with open("表名称")
pass
# 过滤从文件读取的数据
def where():
pass
# 分组
def group by()
pass
# 对分组后的数据 进行过滤
def having():
pass
# 排序
def order by():
pass
# 控制获取的条数
def limit():
pass
# 去除重复
def distinct():
pass
where 子查询 = > < >= <= !=(<>) in between and like and or not
select *from stu where not(math != 60); #in(1,2,3,4,5) #math 60 80 90 select *from stu where math in(60,80,90); select *from stu where math = 60 or math = 80 or math = 90;
#英语及格并且 数学也及格 select *from stu where math >= 60 and english >= 60;
#数学 在60-80之间 select *from stu where math between 60 and 90; select *from stu where math >= 60 and math <= 90;
#like 长得像 模糊匹配 #% 任意个任意字符 #_ 一个任意字符
select *from stu where name like "李%"; 所有姓李的 select *from stu where name like "%李%"; 名字带有李的 select *from stu where name like "%李"; 最后一个字是李的
group by 分组查询
什么是分组 把一个整体 按照某个标识分成不同的部分
分组目的 通常分组都为了要统计数据
语法 select *from emp group by 某个字段;
强调: 用于分组的字段 通常应该是重复度高的 例如 部门 性别 而不应该id name.....
语法要求: select 后面的字段 必须是出现在group by后面的字段
一旦分组后 组内的详细数据就被隐藏了 无法直接查看但是要知道 分组不是为了查看 而是为了统计 分组后就只能看到分组的那个字段
聚合函数(统计函数) 给他一堆数据 它统计后 返回一个数据 (1,2,3,4,5) sum = 15
sum 求和
avg 平均数
max 最大值
min 最小值
count 计数
查询每个部门有哪些人
group_concat() # 不常用 select dept,group_concat(name) from emp group by dept;
可以有多个分组依据 比如先按部门 再按工作岗位
select dept,job,avg(salary) from emp group by dept,job;
注意注意: 聚合函数不能用在where后面
如果要对分组数据进行过滤 必须使用having 因为 where在执行时,数据还没有读完 ,必须等到数据读完之后再进行过滤, where 与 having的区别就在于 执行时机不同
select dept,group_concat(name),count() from emp group by dept having count() < 3;
group by where 后不能有聚合函数 select 后面的字段 必须出现在group by的后面 通常聚合函数会与group by 连用 如果要对分组数据进行过滤 必须使用having having与where 都是过滤 但是执行时机不同
伪代码: from 从文件读数据 到内存 datas = [] with open("xxxx") as f: while True: data = f.read() if avg(salary) > 5000;# 数据读取没有完成 不可能统计出结果 datas.append(data)
order by 排序 默认为升序 select *from emp order by salary; 用desc 来指定为降序 select *from emp order by salary desc; 可以义多个字段作为排序依据,并且可以单独设置顺序 select *from emp order by salary desc,id; # 先按照工资降序 如果工资相同则按照id 升序
limit 控制要查询的记录数量 select *from emp limit a,b;
a 表示起始位置 b 要获取的条数 如果只有a 则表示 获取的条数
select *from emp limit 0,3;
分页显示
总共为10页 每一页显示 3条 页数 10 / 3 由余数则 + 1 = 4
page = 1
select *from emp limit 0,3
page = 2
(page - 1) * 3
select *from emp limit 3,3
page = 3 (page - 1) * 3 select *from emp limit 6,3
起始位置的计算公式 limit (页数-1) * 每页的条数,每页条数