Python学习之数据库
9.6 表的查询
【结构】select distinct 字段1,字段2 from 表名 where 条件 group by 字段 having 筛选 order by 字段 limit 限制条数
【关键字优先级】from > where > group by > having > select/ distinct > order by > limit
【执行顺序】从from这里找到待检索的表格 --》拿着where指定的约束条件,去表中取数据 --》 将取出的记录通过group by进行分组 --》 如果没有group by则整体作为一组 --》 将分组数据进行having过滤 --》执行select 并 distinct去重 --》 将结果按照条件order by 排序 --》 限制结果的显示条数
单表查询
以例为实,我招聘了一堆LOL英雄为我打工,来看一下
# 建表
create table employee(
id int not null unique auto_increment,
emp_name varchar(20) not null,
sex enum('male','female') not null default 'male', #默认是male
age int(3) unsigned not null default 24, # 默认24
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15,2),
office int, # 一个部门的一个办公室
depart_id int
);
# 插入数据
insert into employee(emp_name,sex,age,hire_date,post,salary,office,depart_id) values
('泰达米尔','male',18,'20170301','院长',7300.33,401,1), #以下是教学部
('德鲁伊','male',78,'20150302','实战教练',1000000.31,401,1),
('塞恩','male',81,'20130305','实战教练',8300,401,1),
('乌迪尔','male',73,'20140701','实战教练',3500,401,1),
('布里茨','male',28,'20121101','实战教练',2100,401,1),
('迦娜','female',18,'20110211','实战教练',9000,401,1),
('潘森','male',18,'19000301','实战教练',30000,401,1),
('凯南','male',48,'20101111','实战教练',10000,401,1),
('索拉卡','female',48,'20150311','商务',3000.13,402,2),#以下是商务部
('莎娜','female',38,'20101101','商务',2000.35,402,2),
('卡尔玛','female',18,'20110312','商务',1000.37,402,2),
('艾希','female',18,'20160513','商务',3000.29,402,2),
('艾瑞莉娅','female',28,'20170127','商务',4000.33,402,2),
('金属大师','male',28,'20160311','教学顾问',10000.13,403,3), #以下是教学顾问
('武器大师','male',18,'19970312','教学顾问',20000,403,3),
('月光女神','female',18,'20130311','教学顾问',19000,403,3),
('太阳女神','male',18,'20150411','教学顾问',18000,403,3),
('战争女神','female',18,'20140512','教学顾问',17000,403,3)
简单查询
# 常规查询
select * from 表名; # 显示表中所有数据
select 字段名 from 表名; # 显示表中某一列的数据
select 字段1,字段2... from 表名; # 显示表中某几列的数据
【注意】select与from是单独的语句
# 去重查询
select distinct 字段名 from 表名;
# 联合去重
select distinct 字段1,字段2 from 表名;
mysql> select distinct post from employee;
mysql> select distinct sex,post from employee;
# 添加四则运算
select 字段1,字段2*12 from 表名; # 四则运算还是数值类型较多
mysql> select emp_name,salary*12 from employee;
# 添加显示元素,字符串相加
select concat('姓名:',字段名) from 表名;
# 添加显示元素,字符串拼接,对字段中间以|分隔
select concat_ws('分隔符',字段1,字段2....) from 表名;
# as重命名,as可以省略
select concat('姓名:',字段名) as 新命名 from 表名 ;
mysql> select concat ('name',emp_name) as name from employee;
mysql> select concat_ws('|',emp_name,salary*12) as annual_salary from employee;
as用的挺多
# case语句 一定是有一个开始case和一个结束end
select(
case
when 字段的条件 then concat(字段)
when 条件 then 字段
else
字段
end
) as 新的命名
mysql> select (
-> case
-> when post = '院长 ' then concat ('院长是',emp_name,'!')
-> when post = '实战教练' then concat (emp_name,'是',post)
-> when post = '商务' then concat (emp_name,'是可爱的知心小姐姐')
-> else concat (emp_name,'是大神')
-> end
-> ) as infomation from employee;
select 之后可以跟字段(一个、多个、*)、调用函数、四则运算、去重、条件的判断
where 条件
条件名称 | 表达式 | 备注 |
---|---|---|
范围条件 | > < < > <= >= = != | |
包含条件 | between A and B | AB都包含在内 |
包含条件 | in/not in (A,B,C ) | 值是A或B或C |
模糊查询 | like/not like 表达式 | 通配符% _ |
正则匹配 | regexp 表达式 | ^a以a开头 \d+ 纯数字 |
身份判断 | is 、 is not | null用is来判断 |
逻辑判断 | and or not |
【正则知识】
模式 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 |
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 |
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 |
[...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 |
[^...] | 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
【特殊强调】like 模糊查询中 'A%' ---以A开头 '%A'---以A结尾 '%A%'---包含A
'_A'---是_A %表示人一多的字符 _表示一个字符
mysql> select emp_name from employee where emp_name like '%大师';
mysql> select emp_name,age,salary from employee where salary in (10000 ,9000 ,30000 );
mysql> select * from employee where post_comment is null;
【实战练习】
# 查出所有员工的名字,薪资,格式为 <名字:德鲁伊> <薪资:10000000000>
mysql> select concat('姓名:',emp_name,'> <','薪资:',salary) from employee;
# 查出所有的岗位(去掉重复)
mysql> select distinct post from employee;
# 查出所有员工名字,以及他们的年薪,年薪的字段名为annual_year
mysql> select emp_name,salary*12 as annual_year from employee;
# 查看岗位是 实战教练 的员工姓名、年龄
mysql> select emp_name,age from employee where post = '实战教练';
# 查看岗位是 实战教练 且年龄大于30岁的员工姓名、年龄
mysql> select emp_name,age from employee where post = '实战教练' and age>30;
# 查看岗位是 实战教练 且薪资在9000-10000范围内的员工姓名、年龄、薪资
mysql> select emp_name,age,salary from employee where post = '实战教练' and salary between 9000 and 10000;
# 查看岗位描述不为NULL的员工信息
mysql> select * from employee where post is not null;
# 查看岗位是 实战教练 且薪资是10000或9000或30000的员工姓名、年龄、薪资
mysql> select emp_name,age,salary from employee where post = '实战教练' and salary in (10000,9000,30000);
# 查看岗位是 实战教练 且薪资不是10000或9000或30000的员工姓名、年龄、薪资
mysql> select emp_name,age,salary from employee where post = '实战教练' and salary not in (10000,9000,30000);
# 查看岗位是 教学顾问 且名字是大师结尾的员工姓名、年薪
mysql> select emp_name,salary*12 from employee where post = '教学顾问' and emp_name like '%大师';
分组Group By
- 根据某一个重复率比较高的字段进行的分组,顺便数据去重;
- 对于字段是unique的字段,使用分组是没有意义的
group_concat()
SELECT 字段1 GROUP_CONCAT (字段2) FROM 表名 GROUP BY 字段1
group_concat(字段2)显示组内详情信息 只用来显示最后结果,不做他用,非必选项
【实例】
# 通过post进行分组,查看学校一共多少个部门
mysql> select post from employee group by post;
+--------------+
| post |
+--------------+
| 商务 |
| 实战教练 |
| 教学顾问 |
| 院长 |
+--------------+
# 按post进行分组,查看所有信息
mysql> select * from employee group by post;
+----+--------------+--------+-----+------------+--------------+--------------+------------+--------+-----------+
| id | emp_name | sex | age | hire_date | post | post_comment | salary | office | depart_id |
+----+--------------+--------+-----+------------+--------------+--------------+------------+--------+-----------+
| 9 | 索拉卡 | female | 48 | 2015-03-11 | 商务 | NULL | 3000.13 | 402 | 2 |
| 2 | 德鲁伊 | male | 78 | 2015-03-02 | 实战教练 | NULL | 1000000.31 | 401 | 1 |
| 14 | 金属大师 | male | 28 | 2016-03-11 | 教学顾问 | NULL | 10000.13 | 403 | 3 |
| 1 | 泰达米尔 | male | 18 | 2017-03-01 | 院长 | NULL | 7300.33 | 401 | 1 |
+----+--------------+--------+-----+------------+--------------+--------------+------------+--------+-----------+
# 【注意】虽然是按post进行的分组但是,显示的是不同post组的第一条记录
# 按post进行分组,查看姓名
mysql> select post,emp_name from employee group by post;
+--------------+--------------+
| post | emp_name |
+--------------+--------------+
| 商务 | 索拉卡 |
| 实战教练 | 德鲁伊 |
| 教学顾问 | 金属大师 |
| 院长 | 泰达米尔 |
+--------------+--------------+
# 如果想要显示组内的成员情况,就需要借助 group_concat()来实现
# 按post进行分组,查看组内成员姓名
mysql> select post,group_concat(emp_name) from employee group by post;
+--------------+------------------------------------------------------------------+
| post | group_concat(emp_name) |
+--------------+------------------------------------------------------------------+
| 商务 | 莎娜,艾瑞莉娅,艾希,卡尔玛,索拉卡 |
| 实战教练 | 凯南,潘森,迦娜,布里茨,乌迪尔,塞恩,德鲁伊 |
| 教学顾问 | 太阳女神,月光女神,武器大师,金属大师,战争女神 |
| 院长 | 泰达米尔 |
+--------------+------------------------------------------------------------------+
聚合函数
分组之后就不能对某一条数据进行操作,对数据的操作要以组为单位,可以使用聚合函数:
聚合函数 | 功能 | |
---|---|---|
count | 组内计数 | |
max | 求组内最大值 | |
min | 求组内最小值 | |
avg | 求组内平均值 | |
sum | 组内求和 |
【实例】
# 以post进行分组,并显示每组有多少个成员
mysql> select post,count(id) from employee group by post;
+--------------+-----------+
| post | count(id) |
+--------------+-----------+
| 商务 | 5 |
| 实战教练 | 7 |
| 教学顾问 | 5 |
| 院长 | 1 |
+--------------+-----------+
# 查看每组的平均工资
mysql> select post,avg(salary) from employee group by post;
+--------------+---------------+
| post | avg(salary) |
+--------------+---------------+
| 商务 | 2600.294000 |
| 实战教练 | 151842.901429 |
| 教学顾问 | 16800.026000 |
| 院长 | 7300.330000 |
+--------------+---------------+
# 查看每组的工资最大值
mysql> select post,max(salary) from employee group by post;
having 过滤
对分组后的数据进行筛选,条件是限制在组内成员的
与where的区别是,where在分组之前对记录进行筛选,不能使用聚合函数;having是在分组之后对组进行筛选,可以使用聚合函数。
【实例】
# 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数
mysql> select post,group_concat(emp_name),count(id) from employee group by post having count(id)<2;
# 查询各岗位平均薪资大于10000的岗位名、平均工资
mysql> select post,avg(salary) from employee group by post having avg(salary) > 10000;
# 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资
mysql> select post,avg(salary) from employee group by post having avg(salary) between 10000 and 20000;
order by 排序
【常用套路】
ORDER BY 字段A; 按照A字段升序排序
ORDER BY 字段A ASC; 按照A字段升序排序
ORDER BY 字段A DESC; 按照A字段降序排序
ORDER BY 字段A ,字段B; 按照A字段升序排序,如遇到重复,按照B升序排序
ORDER BY 字段A ,字段B DESC; 按照A字段升序排序,如遇到重复,按照B降序排序
ORDER BY 字段A DESC,字段B DESC; 按照A字段降序排序,如遇到重复,按照B降序排序
【实例】
# 查询所有员工信息,先按照age升序排序,如果age相同则按照hire_date降序排序
mysql> select * from employee order by age asc,hire_date desc;
# 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列
mysql> select post,avg(salary) from employee group by post having avg(salary)>10000 order by avg(salary) asc;
# 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资降序排列
mysql> select post,avg(salary) from employee group by post having avg(salary)>10000 order by avg(salary) desc;
limit
- 取前N条记录;
- 与order by 联合使用取前n名;
- 分页显示
【用法】
- LIMIT m,n 表示从m+1项开始查询,取n条记录,当m没有赋值默认为0
- LIMIT n offset m 是上式的另一种表达方式
【实例】
# 查看工资排名前五的员工
mysql> select * from employee order by salary desc limit 0,5;
9.7 表的修改
# 修改表名
# alter table 表名 rename 新表明
# 添加新段
# alter table 表名 add 新字段 类型(宽度) 约束;
# add 新字段 类型(宽度) 约束 after 字段A # 在字段A后插入一列
# add 新字段 类型(宽度) 约束 first
# 删除段
# alter table 表名 drop 字段名;
# 修改段名
# alter table 表名 change 旧段名 新段名 类型(宽度) 约束;
# change name username char(12) not null
# change name name char(12) not null # 只修改段属性
# change name name varchar(255) after id; # 修改段属性和位置
# 修改段属性
# alter table 表名 modify 存在的字段 新类型(新宽度) 新约束;
# modify name char(12) unique;
# modify name char(12) unique after id;
9.8 数据操作
增加
# 增加
# 增加一条数据
# insert into 表名 value (属性1,属性2,...)
# 增加多条数据
# insert into 表名 values (属性1,属性2,..),(属性1,属性2,..);
# 定点插入数据 ******
# insert into 表名(字段1,字段2) values (属性1,属性2);
# 从其他表中复制相应的信息
# insert into 表A(字段1,字段2) select (字段a,字段b) from 表B;
删除
delete from 表名 where 条件
修改
# update 表名 set 字段1=值1 where 条件
# update 表名 set 字段1=值1,字段2=值2 where 条件
Python学习之数据库的更多相关文章
- Python学习之数据库初识
9 数据库 9.1 数据库的初识 数据库是可以独立运行的,并且可以对数据的增删改查提供高效便捷方式的工具. 数据库解决的问题: 解决了操作文件的效率和便捷问题 解决了多个服务同时使用数据时 ...
- [Python] 学习笔记之MySQL数据库操作
1 Python标准数据库接口DB-API介绍 Python标准数据库接口为 Python DB-API,它为开发人员提供了数据库应用编程接口.Python DB-API支持很多种的数据库,你可以选择 ...
- Python学习系列(七)( 数据库编程)
Python学习系列(七)( 数据库编程) Python学习系列(六)(模块) 一,MySQL-Python插件 Python里操作MySQL数据库,需要Python下安装访 ...
- Python学习笔记(五)之Python操作Redis、mysql、mongodb数据库
操作数据库 一.数据库 数据库类型主要有关系型数据库和菲关系型数据库. 数据库:用来存储和管理数的仓库,数据库是通过依据“数据结构”将数据格式化,以记录->表->库的关系存储.因此数据查询 ...
- python学习--python 连接SQLServer数据库(两种方法)
1. python 学习.安装教程参照: http://www.runoob.com/python/python-tutorial.html 2. 集成开发环境 JetBrains PyCharm C ...
- 【Python学习之十】操作数据库
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 操作mysql数据库 1.安装pymysql模块p ...
- Python学习笔记9-Python 链接MySql数据库
Python 链接MySql数据库,方法很简单: 首先需要先 安装一个MySql链接插件:MySQL-python-1.2.3.win-amd64-py2.7.exe 下载地址:http://dev. ...
- Python学习--17 访问数据库
实际开发中,我们会经常用到数据库. Python里对数据库的操作API都很统一. SQLite SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以 ...
- Python学习笔记_02:使用Tkinter连接MySQL数据库实现登陆注册功能
1 环境搭建 1.1 Python安装 1.2 MySQL环境搭建 1.3安装MySQLdb 2 具体实现 2.1 登陆界面 2.2 注册界面 2.3 具体实现部分代码 1 环境搭建 1.1 P ...
随机推荐
- 第二章 Vue快速入门-- 23 品牌案例-根据关键字实现数组的过滤
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- U-Boot Driver Model领域模型设计 (转)
需求分析 在2014年以前,uboot没有一种类似于linux kernel的设备驱动模型,随着uboot支持的设备越来越多,其一直受到如下问题困扰: 设备初始化流程都独立实现,而且为了集成到系统,需 ...
- zabbix监控Nginx模板
前提条件: nginx模块安装了http_stub_status_module和nginx_upstream_check_module: 在nginx的配置文件中配置上: location /stat ...
- Dubbo配置文件详解
为新项目练手,把项目中用到的web service.RMI的服务改用Dubbo+Zookeeper+Spring,网上找到几篇不错的配置详解 1.此篇博文主要从以下几种配置方式来讲 XML 配置文件方 ...
- BeanUtils对象属性copy的性能对比以及源码分析
1. 对象属性拷贝的常见方式及其性能 在日常编码中,经常会遇到DO.DTO对象之间的转换,如果对象本身的属性比较少的时候,那么我们采用硬编码手工setter也还ok,但如果对象的属性比较多的情况下,手 ...
- AcWing:138. 兔子与兔子(字符串Hash)
很久很久以前,森林里住着一群兔子. 有一天,兔子们想要研究自己的 DNA 序列. 我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母). 然后我们每 ...
- ES6 变量的结构赋值
1.数组的解构赋值 a.基本用法:(‘模糊匹配’) let [a, b, c] = [1, 2, 3]; a b c b.嵌套数组结构例子: let [x, , y] = [1, 2, 3]; x y ...
- Running .sh scripts in Git bash
Running .sh scripts in Git bash Let's say you have a script script.sh. To run it (using Git Bash), y ...
- ffmpeg静态库Windows版本
GitHub上面有一个项目 提供了编译环境 以及编译好的静态库 https://github.com/ShiftMediaProject/FFmpeg
- Could not parse configuration: /hibernate.cfg.xml
hibernate需要联网验证dtd,错误原因:未联网或网速不行