子查询及pymysql
子查询
子查询指的是当一个查询语句被作为另一个查询语句的条件时,该查询语句就称之为子查询(内层查询)
可以将一个大问题 拆分几个小的问题 然后一步一步来查询
需求:财务不有哪些人
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); create table dept(id int primary key,name char(10)); insert into dept values(1,"市场"),(2,"行政"),(3,"财务");
表的创建与添加数据
select *from emp join dept
on emp.dept_id = dept.id
where dept.name = "财务";
连接查询
子查询的语法:将子查询(内层查询)用括号包裹即可
子查询的实现思路
1.通过部门名称拿到部门的id
select id from dept where name='财务';
2.通过部门id取员工表查询对应的员工
select * from emp where dept_id =(select id from dept where name='财务');
子查询
查询平均年龄大于25的部门名称
1.先查询出一堆平均年龄大于25的部门id
2.在通过id 查询部门的名称
select name from dept where id in(select dept_id from emp group by dept_id having avg(age)>25)
子查询
查询平均年龄大于25的部门
使用连接查询完成
1.先连接在一起
2.on 筛选正确匹配关系
3.where 条件
select dept.name from emp join dept
on emp.dept_id =dept.id
group by dept.name
having avg(age)>25;
连接查询
查询每个部门工资最高的员工信息
1.查询出每个部门的最高工资是多少
select dept_id,max(salary)from emp group by dept_id;
2.拿着最高工资查询员工信息
select *from emp join
(select dept_id,max(salary) as maxs from emp group by dept_id) as t1
on emp.dept_id = t1.dept_id
where emp.salary = t1.maxs;
Code
#查询语句无论多长 其实都是一步一步做出来的 先写一段测试一下没问题 再接着写
create table test(day_id date,result char(10));
insert test values("2018-10-01","success");
insert test values("2018-10-01","fail");
insert test values("2018-10-01","fail");
insert test values("2018-10-01","success");
insert test values("2018-10-02","success");
insert test values("2018-10-02","fail");
insert test values("2018-10-02","fail");
面试题
查询出以下结果:
day_id success fail
2018-10-01 2 2
2018-10-02 1 2
select t1.day_id,success,fail from
(select day_id,count(*) as success from test group by day_id,result having result = "success") as t1
join
(select day_id,count(*) as fail from test group by day_id,result having result = "fail") as t2
on t1.day_id = t2.day_id;
答案
用户管理
mysql用户指的是客户端连接服务器时使用的账户
在一些公司中,很多项目的数据 可能会放在同一个服务器
那就必须要为每一个用户明确其所拥有的权限
通常到公司之后都会给你一个账号名称和密码 并且 为你制定你可以访问哪些数据库或表
对用户账号增删改查以及权限的增删改查
mysql与权限相关的表:
user columns_priv tables_priv db
select * from user \G;#当字段太多 一行显示不了可以\G
create user 用户名@主机名称 indentfied by '密码';
该语句只是单纯创建一个用户后续还要分配权限稍微麻烦
推荐使用grant语句可以在创建账户的同时分配权限
grant all on *.* to用户名@主机名 indentfied by '密码';
grant all on *.* to用户名@loaclhost indentfied by '密码';
#授予所有库的所有表的所有权限给用户名这个账户然后密码只允许在127.0.0.1上登录
主机地址可以是%意味着这个用户可以在任何主机上登录服务器 需要加上双引号
#这个用户不能其他用户授权 默认只有root可以为其他账户授权
grant all on day45.* to jerry@localhost identified by "123"; # day45所有表
grant all on day45.dept to tom@localhost identified by "123"; # day45的dept表
mysql的权限可以精确到列(某个字段的某种权限)
但是不能精确到某一行(需要使用视图)
可以将权限授予其他账户
grant all on day45.dept to bgon@localhost identified by "123" with grant option;
回收权限
revoke all privileges [column] on db.table from user@"host";
revoke all privileges on day45.dept from bgon@"localhost"; 删除用户
drop user username@host;
刷新权限
flush privileges
正常开发时我们的数据库服务器也会运行在云服务器上,经常需要从本地远程操作数据库
但是默认请款root只能在服务器本机上登录
所以我们可以grant语句来授权所有主机
grant all on *.* to root@192.168.111 identified by "123321" with grant option; PYMYSQL
pymysql是由mysql提供的一个模块 需要单独安装
pymysql的作用就是可以使用python代码来操作数据库上的数据
本质上还是一个CS的客户端
1.连接数据库
2.发送sql指令给服务器
3.接收服务器返回的结果
import pymysql try:
# 1.conn是一个表示连接的对象
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='',
database='day44'
) print('连接服务器成功!')
# 2.查询数据 需要借助cursor类 游标 默认游标返回值类型为元组
# pymysql.cursors.DictCursor 可以将结果转换为字典
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 3.执行sql语句
sql = 'select *from dept;'
res = cursor.execute(sql) # res为本次查询得到的记录条数
print(res)
# 4.提取数据
# print(cursor.fetchall()) #获取本次查询所有结果
# print(cursor.fetchone())#提起本次查询的第一条记录
print(cursor.fetchmany(2)) # 指定提取记录的条数
# 如果游标已经到达最后 将无法再读取数据 可以使用scroll来移动游标位置
cursor.scroll(-1, mode='relative')
# mode参数表示 是相对位置relative 还是绝对位置absolute
# cursor.scroll()
except Exception:
print(type(Exception), Exception)
finally:
# 无论石是否执行成功 最后都需要关闭连接
if cursor:
cursor.close() # 关闭游标
if conn:
conn.close() # 关闭连接
pymysql模块
登录 客户端再网页输入用户和密码 浏览器要把接收的数据传给后台服务器
再由后台服务器交给数据库服务器
可能会遇到sql注入攻击
什么是sql注入攻击 一些不法分子可能会在输入的数据中添加一系列sql语句来跳过认证环节
甚至直接删除数据
解决方案
1.在客户端接收数据时做一个re的判断 如果包含sql相关的字符就直接报错
2.在服务器收到某一个客户端发送的数据时做一个判断
其实pymysql已经封装好了相关的判断逻辑 只要将参数交给pymysql来拼接即可 pymysql使用
1.用pymysql.connect(参数)建立连接 得到连接对象
2.通过连接对象拿到游标对象conn.cursor(pymysql.cursors.DictCursor)
3.通过调用游标对象的excute或者excutemany 来执行sql
4.调用游标的fetch(one/many/all)相关函数来提取执行结果
强调:pymysql默认不会提交修改需要手动调用conn.commit或是在创建时指定自动提交
scroll移动游标不常用
import pymysql # 1.conn是一个表示连接的对象
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='',
database='day44',
autocommit=True
)
print('连接服务器成功!') # 增加数据
# sql = "insert into user values(null,'tom','123')" # 删除
# sql = "delete from user where name = 'tom'" # 更新
# sql = "update user set id = 10000 where id = 1" cursor = conn.cursor(pymysql.cursors.DictCursor)
# 返回的是 本次sql语句执行后 受到影响行数
# count = cursor.execute(sql) # 用来批量添加数据 可提高效率
count = cursor.executemany("insert into user values (null,%s,%s)", [("tom1", ""), ("tom2", ""), ("tom3", "")]) if count:
print("修改成功!")
else:
print("修改失败!") # 需要调用commit来提交修改 或者在创建连接时 指定自动提交修改
# conn.commit()
pymysql增删改查
子查询及pymysql的更多相关文章
- MySQL:记录的增删改查、单表查询、约束条件、多表查询、连表、子查询、pymysql模块、MySQL内置功能
数据操作 插入数据(记录): 用insert: 补充:插入查询结果: insert into 表名(字段1,字段2,...字段n) select (字段1,字段2,...字段n) where ...; ...
- python 之 数据库(多表查询之连接查询、子查询、pymysql模块的使用)
10.10 多表连接查询 10.101 内连接 把两张表有对应关系的记录连接成一张虚拟表 select * from emp,dep: #连接两张表的笛卡尔积 select * from emp,de ...
- 5月11日 python学习总结 子查询、pymysql模块增删改查、防止sql注入问题
一.子查询 子查询:把一个查询语句用括号括起来,当做另外一条查询语句的条件去用,称为子查询 select emp.name from emp inner join dep on emp.dep_id ...
- Mysql基础(五):多表查询、pymysql模块
目录 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 2. 连表查询 3. 子查询 4. pymysql模块 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 将两表所有的数据一 ...
- 数据库04 /多表查询、pymysql模块
数据库04 /多表查询.pymysql模块 目录 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 2. 连表查询 2.1 inner join 内连接 2.2 left join 左连接 ...
- python 全栈开发,Day63(子查询,MySQl创建用户和授权,可视化工具Navicat的使用,pymysql模块的使用)
昨日内容回顾 外键的变种三种关系: 多对一: 左表的多 对右表一 成立 左边的一 对右表多 不成立 foreign key(从表的id) refreences 主表的(id) 多对多 建立第三张表(f ...
- 子查询,用户管理,pymysql使用
当我们的一条记录 分散不同的表中时,就需要进行多表查询例如 一对一 一对多 多对多 1.笛卡尔积查询 意思就是将两个表中的所有数据 全部关联在一起例如A表有两条 B表有三条 一共有6条会产生大量的错误 ...
- mysql之子查询、视图、事务及pymysql等
数据准备 CREATE TABLE `emp` ( `id` int(0) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, `gender` ...
- day43 多表查询和pymysql
复习 增删改查全语法 # 增 insert into db1.t1(字段2, 字段1, ..., 字段n)|省略 values (值2, 值1, ..., 值n)|(值1, 值2, ..., 值n)[ ...
随机推荐
- 内存中DataTable去除重复行
删除内存中DataTable表的重复行 假设在内存中(不是数据库中)有两个表: 表一:TableA Name Phone 张三 123456 李四 123457 王五 1234568 表二:Table ...
- 专题2-通过按键玩中断\2440按键中断编程lesson2
1.程序优化 修改Makefile 把main.c里面的mmu代码复制到mmu.c并修改如下 main.c的修改 由于在bootloader当中一般不会使用MMU,所以 main.c 加入led.c文 ...
- razor自定义函数 @helper 和@functions小结
from:http://www.cnblogs.com/jiagoushi/p/3904995.html asp.net Razor 视图具有.cshtml后缀,可以轻松的实现c#代码和html标签的 ...
- css总结17:HTML块级元素&行内元素之分: <div> 和<span>
1 HTML 区块元素: 大多数 HTML 元素被定义为块级元素或内联元素. 1.1 块级元素实例: <div> <h1>, <p>, <ul>, &l ...
- APP压力稳定性测试
转自:https://www.cnblogs.com/nuonuozhou/p/8643735.html 1.android系统自带monkey程序,模拟用户触摸屏幕,滑动track ball,按键等 ...
- Linux简单部署svn服务
最近需要练习一下svn的命令行使用方法,以便编写自动化部署的脚本,但是不敢用正式的svn库进行练习,所以自己部署了一个svn服务,用来练习 1.安装svn server 我用的是ubuntu $apt ...
- [Swift实际操作]九、完整实例-(4)在项目中使用CocoaPod管理类库和插件
本文将为你演示,如何使用CocoaPod第三方类库管理工具,在项目中安装未来需要使用的类库.首先创建一份文本文件.可以使用一个脚本创建文件,你可以采用自己的方式是创建一份文本文件,接着在文件名称上点击 ...
- centos7 docker 安装 mysql5.7.24 导入12G的sql
先在CentOS7里面安装docker Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker .通过 uname - ...
- logback&slf4j学习笔记
1.Slf4j 1.1.Slf4j简介 SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.实际上,SLF ...
- The server of Apache (一)——apache服务的基本安装过程
一.为了避免端口冲突,需要卸载linux系统中以RPM方式安装的httpd ~] # rpm -qa | grep httpd ~] # rpm -e httpd --nodeps (此处nodeps ...