Python学习day44-数据库(单表及多表查询)

 

Python学习day44-数据库(单表及多表查询)常用函数单表查询单表数据wheregroup by | having排序order by限制limit多表查询连接多表数据内连接左连接右连接全连接

Python学习day44-数据库(单表及多表查询)

常用函数

表查询中我们常用的函数包括以下几种:

 
 
 
x
 
 
 
 
1
'''
2
拼接:concat() | concat_ws()
3
大小写:upper() | lower()
4
浮点型操作:seil() | floor() | round()
5
整型:可以直接运算
6
'''
7
8
select name,area,port from emp;
9
10
select name as 姓名,concat(area,'-',port) as 地址 from emp;
11
12
select name as 姓名,concat_ws('-',area,port,dep) 信息 from emp;
13
14
select upper(name) 姓名大写 lower(name) 姓名小写 from emp;
15
16
selet id,salary,ceil(salary)上薪资,floor(salary)下薪资,round(salary)四舍五入 from emp;
 
 

 

单表查询

 
 
 
xxxxxxxxxx
24
 
 
 
 
1
# 单表查询的语法如下:
2
select [distinct] 
3
字段1,字段2... 
4
from 表名
5
[where 条件]
6
[group by] 
7
[having]
8
[order by] 
9
[limit]
10
11
'''
12
中括号包裹的都为可选项,即可以有可以没有,关键字执行的优先级为:
13
1. from:找到表
14
2. where:拿着where指定的约束条件,去文件/表中取出一条条记录
15
3. group by:将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
16
4. select:执行select
17
5. distinct:去重,对参与查询的所有字段,整体去重(即所查询的所有字段的值都相同才会认为是重复数据)
18
6. having:将分组的结果进行having过滤
19
7. order by:将结果按条件排序:order by
20
8. limit:限制结果的显示条数
21
22
注意:
23
以上这些关键字的执行顺序要严格执行,可以没有某个关键字,一旦需要用到,就要按照关键字的顺序来使用,乱序会直接导致报错
24
'''
25
26
'''
27
下面我们对以上这些关键字的部分说明并举例.
28
'''
 
 

单表数据

要进行数据查询肯定要有数据,这里我们准备了一些数据,以便于读者来实验一些命令:

 
 
 
xxxxxxxxxx
1
28
 
 
 
 
1
CREATE TABLE `emp`  (
2
  `id` int(0) NOT NULL AUTO_INCREMENT,
3
  `name` varchar(10) NOT NULL,
4
  `gender` enum('男','女','未知') NULL DEFAULT '未知',
5
  `age` int(0) NULL DEFAULT 0,
6
  `salary` float NULL DEFAULT 0,
7
  `area` varchar(20) NULL DEFAULT '中国',
8
  `port` varchar(20) DEFAULT '未知',
9
  `dep` varchar(20),
10
  PRIMARY KEY (`id`)
11
);
12
13
INSERT INTO `emp` VALUES 
14
(1, 'yangsir', '男', 42, 10.5, '上海', '浦东', '教职部'),
15
(2, 'engo', '男', 38, 9.4, '山东', '济南', '教学部'),
16
(3, 'jerry', '女', 30, 3.0, '江苏', '张家港', '教学部'),
17
(4, 'tank', '女', 28, 2.4, '广州', '广东', '教学部'),
18
(5, 'jiboy', '男', 28, 2.4, '江苏', '苏州', '教学部'),
19
(6, 'zero', '男', 18, 8.8, '中国', '黄浦', '咨询部'),
20
(7, 'owen', '男', 18, 8.8, '安徽', '宣城', '教学部'),
21
(8, 'jason', '男', 28, 9.8, '安徽', '巢湖', '教学部'),
22
(9, 'ying', '女', 36, 1.2, '安徽', '芜湖', '咨询部'),
23
(10, 'kevin', '男', 36, 5.8, '山东', '济南', '教学部'),
24
(11, 'monkey', '女', 28, 1.2, '山东', '青岛', '教职部'),
25
(12, 'san', '男', 30, 9.0, '上海', '浦东', '咨询部'),
26
(13, 'san1', '男', 30, 6.0, '上海', '浦东', '咨询部'),
27
(14, 'san2', '男', 30, 6.0, '上海', '浦西', '教学部'),
28
(15, 'ruakei', '男', 35, 6.5, '上海', '浦西', '教学部');
 
 

 

where

 
 
 
xxxxxxxxxx
20
 
 
 
 
1
'''
2
where大概会是我们以后用到的最多的一个词,所以我们需要对where做一个比较详细的了解.
3
 
           
4
where后面的条件判断:
5
比较符合:> | < | >= | <= | = | !=
6
区间符号:between 开始 and 结束 | in(自定义容器)
7
逻辑符号:and | or | not 
8
相思符号:like _|%
9
正则符号:regexp 正则语法
10
'''
11
select * from emp where salary>5;
12
select * from emp where salary between 6 and 9;
13
select * from emp where id in(1,3,7,20);
14
select * from emp where name like '_o%';# _o某o,__o,某某o,_o%,某o*,(*代表全部值,0到n个任意字符)
15
select * from emp where name like '%o%';
16
17
# 正则:只支持部分正则语法
18
select * from emp where name regexp '.*\d';# 不支持\d,会直接识别成字符串
19
20
select * from emp where name regexp '.*[0-9]';# 这样可以匹配数字,支持中括号语法
 
 

group by | having

 
 
 
x
 
 
 
 
1
# 表象: 在没有分组的情况下,where和having结果完全相同
2
# 重点: having可以对聚合结果进行筛选,where不可以,因为执行顺序乱序
3
select * from emp having salary > 5;
4
select * from emp where salary > 5;
5
6
select * from emp where id in (5,10.15,20);
7
select * from emp having id in (5,10.15,20);
8
'''
9
常用聚合函数如下:
10
max():最大值
11
min():最小值
12
avg():平均值
13
sum():和
14
count():记数
15
group_concat():组内字段拼接,用来查看组内其他字段
16
'''
17
18
# 那么在聚合以及分组之后的查询,操作如下:
19
select 
20
dep 部门,
21
group_concat(name)成员,
22
max(salary)最高薪资,
23
min(salary)最低薪资,
24
avg(salary)平均薪资,
25
sum(salary)总薪资,
26
count(gender)人数 
27
from emp group by dep;
28
29
# 最低薪资小于2
30
select 
31
dep 部门,
32
group_concat(name)成员,
33
max(salary)最高薪资,
34
min(salary)最低薪资,
35
avg(salary)平均薪资,
36
sum(salary)总薪资,
37
count(gender)人数 
38
from emp group by dep having min(salary) < 2;# 这里的having不能用where,会乱序报错
39
40
# having 可以对 聚合结果 再进行筛选,但是where不可以
 
 

 

排序order by

 
 
 
xxxxxxxxxx
1
24
 
 
 
 
1
# 排序规则
2
# order by 主排序字段[asc|desc],次排序字段1[asc|desc],...,次排序字段n[asc|desc]
3
4
# 未分组状态下:
5
select * from emp;
6
# 按年龄升序
7
select * from emp order by age asc;
8
# 按薪资降序
9
select * from emp order by salary desc;
10
# 薪资降序,如果相同,再按年龄降序
11
select * from emp order by salary desc,age desc;
12
# 分组状态下:
13
select 
14
dep 部门,
15
group_concat(name)成员,
16
max(salary)最高薪资,
17
min(salary)最低薪资,
18
avg(salary)平均薪资,
19
sum(salary)总薪资,
20
count(gender)人数 
21
from emp group by dep
22
order by 最高薪资 desc;
 
 

 

限制limit

 
 
 
xxxxxxxxxx
1
 
 
 
 
1
# 语法:limit 显示数据条数 
2
#  limit 偏移量,显示数据条数
3
select * from emp where salary<8 order by salary desc limit 1;
4
5
select * from emp limit 5,3;# 先偏移5条满足条件的记录,再查询3条
 
 

 

多表查询

连接

多表查询,顾名思义,就是把多张有联系的表关联起来,作为一张大表来查询,就是多表查询.

所以我们主要需要了解的就是怎么把这些有联系的表连接起来.主要有四种方式:内连接,左连接,右连接,全连接.

多表数据

以下为多表查询准备的一些数据,仅供参考:

 
 
 
xxxxxxxxxx
13
 
 
 
 
1
create table dep(
2
id int primary key auto_increment,
3
name varchar(16),
4
work varchar(16)
5
);
6
create table emp(
7
id int primary key auto_increment,
8
name varchar(16),
9
salary float,
10
dep_id int
11
);
12
insert into dep values(1, '市场部', '销售'), (2, '教学部', '授课'), (3, '管理部', '开车');
13
insert into emp(name, salary, dep_id) values('egon', 3.0, 2),('yanghuhu', 2.0, 2),('sanjiang', 10.0, 1),('owen', 88888.0, 2),('liujie', 8.0, 1),('yingjie', 1.2, 0);
 
 

内连接

 
 
 
x
 
 
 
 
1
# 关键字 :inner join on(内连接的inner关键字通常可以省略,所以直接使用join默认就是内连接)
2
# 语法: from A表 inner join B表 on A表.关联字段=B表.关联字段
3
# 有对应关系都查出来,没有对应关系都忽略.
4
select 
5
emp.id,emp.name,salary,dep.name,work
6
from emp join dep on emp.dep_id =dep.id
7
order by emp.id;
8
9
# 总结:只保留两个表有关联的数据
 
 

左连接

 
 
 
xxxxxxxxxx
10
 
 
 
 
1
# 关键字 :left join on
2
# 语法: from 左表 left join 右表 on 左表.关联字段=B表.关联字段
3
select * from emp left join dep on emo.dep_id=dep.id;
4
5
select 
6
emp.id,emp.name,salary,dep.name,work 
7
from emp left join dep on emp.dep_id=dep.id
8
order by emp.id;
9
10
# 总结:保留左边表的全部数据,右表有对应数据直接连表显示,没有对应关系就空填充
 
 

右连接

 
 
 
xxxxxxxxxx
10
 
 
 
 
1
# 关键字 :right join on
2
# 语法: from 左表 right join 右表 on 左表.关联字段=B表.关联字段
3
select * from emp right join dep on emo.dep_id=dep.id;
4
5
select 
6
emp.id,emp.name,salary,dep.name,work 
7
from emp right join dep on emp.dep_id=dep.id
8
order by emp.id;
9
10
# 总结:保留右边表的全部数据,左表有对应数据直接连表显示,没有对应关系就空填充
 
 

全连接

 
 
 
xxxxxxxxxx
1
14
 
 
1
# 关键字 : join on    union(union可以将左连接和右连接合并起来,作为一个表)
2
# 语法: 将左连接和右连接用union连接起来即可
3
select 
4
emp.id,emp.name,salary,dep.name,work 
5
from emp right join dep on emp.dep_id=dep.id
6
7
union
8
9
select 
10
emp.id,emp.name,salary,dep.name,work 
11
from emp left join dep on emp.dep_id=dep.id
12
order by id;
 
 
13
14
# 总结:左表右表数据都被保留,彼此有对应关系正常显示,彼此没有对应关系均空填充对方
 
 

 

转载于:https://www.cnblogs.com/Xu-PR/p/11585783.html

你可能感兴趣的:(Python学习day44-数据库(单表及多表查询))