子查询
子查询指的是当一个查询语句被作为另一个查询语句的条件时,该查询语句就称之为子查询(内层查询)
可以将一个大问题 拆分几个小的问题 然后一步一步来查询
需求:财务不有哪些人
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的更多相关文章

  1. MySQL:记录的增删改查、单表查询、约束条件、多表查询、连表、子查询、pymysql模块、MySQL内置功能

    数据操作 插入数据(记录): 用insert: 补充:插入查询结果: insert into 表名(字段1,字段2,...字段n) select (字段1,字段2,...字段n) where ...; ...

  2. python 之 数据库(多表查询之连接查询、子查询、pymysql模块的使用)

    10.10 多表连接查询 10.101 内连接 把两张表有对应关系的记录连接成一张虚拟表 select * from emp,dep: #连接两张表的笛卡尔积 select * from emp,de ...

  3. 5月11日 python学习总结 子查询、pymysql模块增删改查、防止sql注入问题

    一.子查询 子查询:把一个查询语句用括号括起来,当做另外一条查询语句的条件去用,称为子查询 select emp.name from emp inner join dep on emp.dep_id ...

  4. Mysql基础(五):多表查询、pymysql模块

    目录 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 2. 连表查询 3. 子查询 4. pymysql模块 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 将两表所有的数据一 ...

  5. 数据库04 /多表查询、pymysql模块

    数据库04 /多表查询.pymysql模块 目录 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 2. 连表查询 2.1 inner join 内连接 2.2 left join 左连接 ...

  6. python 全栈开发,Day63(子查询,MySQl创建用户和授权,可视化工具Navicat的使用,pymysql模块的使用)

    昨日内容回顾 外键的变种三种关系: 多对一: 左表的多 对右表一 成立 左边的一 对右表多 不成立 foreign key(从表的id) refreences 主表的(id) 多对多 建立第三张表(f ...

  7. 子查询,用户管理,pymysql使用

    当我们的一条记录 分散不同的表中时,就需要进行多表查询例如 一对一 一对多 多对多 1.笛卡尔积查询 意思就是将两个表中的所有数据 全部关联在一起例如A表有两条 B表有三条 一共有6条会产生大量的错误 ...

  8. mysql之子查询、视图、事务及pymysql等

    数据准备 CREATE TABLE `emp` ( `id` int(0) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, `gender` ...

  9. day43 多表查询和pymysql

    复习 增删改查全语法 # 增 insert into db1.t1(字段2, 字段1, ..., 字段n)|省略 values (值2, 值1, ..., 值n)|(值1, 值2, ..., 值n)[ ...

随机推荐

  1. Luogu 1606 [USACO07FEB]白银莲花池Lilypad Pond

    感觉应当挺简单的,但是弄了好久……菜死了 如果不考虑那些为$1$的点,直接跑个最短路计数就好了,但是我们现在有一些边可以不用付出代价,那么只要在连边的时候先预处理搜一下就好了. 原来的想法是拆点,但是 ...

  2. 2.Border Layout 自定义一个Layout来完成布局。

    目标: 1.添加控件的函数 void QLayout::addWidget ( QWidget * w ) 在这个例子里面我们重载这个函数 void addWidget ( QWidget * w, ...

  3. Laravel Gate 授权方式的使用指南

    参考链接:An Introduction to Laravel Authorization Gates 本文使用 Laravel 的 Gate 授权方式 实现一个基于用户角色的博客发布系统. 在系统包 ...

  4. Linux下为Eclipse安装hadoop插件

    前提条件:在Linux系统中已经安装好了jdk和hadoop 本文的安装环境:1.arch Linux 2. hadoop1.0.1本地伪分布模式安装  3. Eclipse 4.5 1. 下载Ecl ...

  5. C# 中关于汉字与16进制转换的代码

    /// <summary> /// 从汉字转换到16进制 /// </summary> /// <param name="s"></par ...

  6. 分享我的第一个asp.net core开发过程

    .net core 这个东西感觉还是很不错的,学习了一下,并且做了一个微服务(IP地址查询服务) http://vju.cc/ip/ipquery 看上他的跨平台功能,所以就研究一下,中间有不少坑,有 ...

  7. 最小生成树(kruscal算法)

    其实kruscal算法很简单,把边从小到大排一遍,如果加入此边形成环,就不加,知道这棵树有n-1条边. 代码如下(一定要理解): #include<iostream> #include&l ...

  8. 【[APIO/CTSC2007]动物园】状压DP

    题目测评:https://www.luogu.org/problemnew/show/P3622 题目描述 新建的圆形动物园是亚太地区的骄傲.圆形动物园坐落于太平洋的一个小岛上,包含一大圈围栏,每个围 ...

  9. 模拟Springboot二:内置tomcat

    既然要将tomcat内置到项目中,并且能够成功的启动项目就要知道 tomcat  做了哪些事情 ,那么就必须先搞明白 一个 普通的web项目是如何被我们本地配置的tomcat启动并运行的 (1). 先 ...

  10. Linux环境下mysql安装并配置远程访问

    环境:centOS 1.下载mysql安装文件 [root@localhost ~]# wget http://dev.mysql.com/get/mysql-community-release-el ...