昨日内容回顾

  • 外键字段
# 就是用来建立表与表之间的关系的字段
  • 表关系判断
# 一对一

# 一对多

# 多对多

"""通过换位思考判断"""
  • 外键约束
# 级联更新

# 级联删除
  • 查询关键字
# where 筛选

# group by 分组

# having 过滤

# distinct 去重

# order by 排序

# limit 分页

# regexp 正则

今日内容概要

  • 多表查询思路
  • navicat可视化软件
  • 多表查询练习
  • python操作MySQL
  • 其他理论补充

内容详细

1. 多表查询思路

# 准备数据 建表
create table dep(
id int primary key auto_increment,
name varchar(20)
); create table emp(
id int primary key auto_increment,
name varchar(20),
sex enum('male','female') not null default 'male',
age int,
dep_id int
); #插入数据
insert into dep values
(200,'技术'),
(201,'人力资源'),
(202,'销售'),
(203,'运营'),
(205,'保洁')
; insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('egon','female',48,201),
('kevin','male',18,201),
('nick','male',28,202),
('owen','male',18,203),
('jerry','female',18,204); # 例:查询jason所在的部门名称
"""涉及到SQL查询题目 一定要先明确到底需要几张表"""
1.先查询jason所在的部门编号
select dep_id from emp where name='jason'; 2.根据部门编号查询部门名称
select name from dep where id=(select dep_id from emp where name='jason');
"""
一条SQL语句的查询结果:
既可以看成是一张表
也可以看成是查询条件
""" # 多表查询的思路
1.子查询
将SQL语句查询的结果括号括起来当做另外一条SQL语句的条件
大白话:就是我们日常生活中解决问题的方式>>>:分步操作 2.连表操作(重要)
先将需要使用到的表拼接成一张大表 之后基于单表查询完成
inner join 内连接
left join 左连接
right join 右连接
union 全连接 """
涉及到多表查询的时候 字段名称容易冲突 需要使用表名点字段的方式区分
1.inner join:只拼接两张表中共有的部分
select * from emp inner join dep on emp.dep_id = dep.id; 2.left join:以左表为基准展示所有的内容 没有的NULL填充
select * from emp left join dep on emp.dep_id = dep.id; 3.right join:以右表为基准展示所有的内容 没有的NULL填充
select * from emp right join dep on emp.dep_id = dep.id; 4.union:左右表所有的数据都在 没有的NULL填充
select * from emp left join dep on emp.dep_id = dep.id
union
select * from emp right join dep on emp.dep_id = dep.id;
""" # 疑问:上述操作一次只能连接两张表 如何做到多张表?
将两张表的拼接结果当成一张表与跟另外一张表做拼接
依次往复 即可拼接多张表

2. navicat可视化软件

# 作用:
内部封装了很多SQL的操作 用户只需要鼠标点点 自动构建SQL语句并执行 # 下载使用
百度搜破解版 按步骤安装即可
友情链接:https://shimo.im/docs/g9qK9rpcTGWX6Vgh # navicat可以看成是很多数据库软件的客户端 # MySQL的注释语法
# 注释
-- 注释

3. 多表查询练习题

# 1、查询所有的课程的名称以及对应的任课老师姓名
01 select * from teacher inner join course on teacher.tid=course.teacher_id; # 先找出所有课程表与老师表信息 02 select course.cname,teacher.tname from teacher inner join course on teacher.tid=course.teacher_id; # 再根据要求筛选出课程名称与对应任课老师 # 2.查询平均成绩大于八十分的同学的姓名和平均成绩
先确定需要使用到的表
在思考多表查询的方式
# 先按学生编号分组
select student_id from score group by student_id;
# 再求平均成绩
select student_id,avg(num) from score group by student_id;
# 最后筛选出大于80的(针对聚合函数的字段结果 最好起别名防止冲突)
select student_id,avg(num) as avg_num from score group by student_id having(avg(num)>80);
# 整合 将上述SQL的结果与student表拼接
select student.sname,t1.avg_num from student inner join(select student_id,avg(num) as avg_num from score group by student_id having(avg(num)>80)) as t1 on student.sid=t1.student_id; # 3.查询没有报李平老师课的学生姓名
# 先查询李平老师教授的课程编号
select course.cid from course where teacher_id=(select tid from teacher where tname='李平老师'); # 再根据课程id号筛选出所有报了的学生id号
select student_id from score where course_id in (select course.cid from course where teacher_id=(select tid from teacher where tname='李平老师')); # 最后去学生表中根据id号取反筛选学生姓名
select student.sname from student where sid not in(select distinct score.student_id from score where course_id in (select course.cid from course where teacher_id=(select tid from teacher where tname='李平老师'))); # 4.查询没有同时选修物理课程和体育课程的学生姓名(只要了报了一门的 两门和一门没报的都不要)
# 先获取两门课程的id号
select course.cid from course where cname in ('物理','体育'); # 再去分数表中先筛选出所有报了物理和体育的学生id(两门 一门)
select * from score where course_id in (select course.cid from course where cname in ('物理','体育')); # 如何筛选出只报了一门的学生id 按照学生id分组 然后计数 并过滤出计数结果为1的数据
select score.student_id from score where course_id in (select course.cid from course where cname in ('物理','体育')) group by score.student_id having count(score.course_id)=1; # 根据学生id号去student表中筛选学生姓名
select student.sname from student where sid in (select score.student_id from score where course_id in (select course.cid from course where cname in ('物理','体育')) group by score.student_id having count(score.course_id)=1); # 5.查询挂科超过两门(包括两门)的学生姓名和班级
# 先筛选出小于60分的数据
select * from score where num<60; # 按照学生id分组 然后统计挂科数量
select student_id,count(course_id) from score where num<60 group by student_id; # 筛选出挂科超过两门的学生id
select student_id from score where num<60 group by student_id having count(course_id)>=2; # 先将上述结果放在一边 去连接student和class表
select student.sname,class.caption from class inner join student on class.cid=student.class_id where student.sid in(select student_id from score where num<60 group by student_id having count(course_id)>=2); # 更多练习
https://www.cnblogs.com/Dominic-Ji/p/10875493.html

4. python操作MySQL

# pycharm中先下载第三方模块 pymysql

import pymysql

# 连接MySQL服务端
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='db3',
charset='utf8'
)
# 产生一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 编写SQL语句
sql = 'select * from teacher'
affect_rows = cursor.execute(sql) # 结果是表的数据行数
print(affect_rows)
# 获取执行结果
print(cursor.fetchall())
"""以上为基础代码 务必掌握""" print(cursor.fetchall()) # [] 类似于文件光标 拿过的数据就不会再返回去再拿
print(cursor.fetchall()) # [] print(cursor.fetchone()) # {'tid': 1, 'tname': '张磊老师'} 获取单个
print(cursor.fetchone()) # {'tid': 2, 'tname': '李平老师'} print(cursor.fetchmany(3)) # [{'tid': 1, 'tname': '张磊老师'}, {'tid': 2, 'tname': '李平老师'}, {'tid': 3, 'tname': '刘海燕老师'}]
print(cursor.fetchman y(3)) # [{'tid': 4, 'tname': '朱云海老师'}, {'tid': 5, 'tname': '李杰老师'}] 自定义取的数量 print(cursor.fetchone()) # {'tid': 1, 'tname': '张磊老师'}
cursor.scroll(1,"relative") # 以当前位置为起始 向后移动光标一位
print(cursor.fetchone()) # {'tid': 3, 'tname': '刘海燕老师'} print(cursor.fetchone()) # {'tid': 1, 'tname': '张磊老师'}
cursor.scroll(1, "absolute") # 以文件开头位置为起始 向后移动光标一位
print(cursor.fetchone()) # {'tid': 2, 'tname': '李平老师'}

5. SQL注入问题

import pymysql

# 连接MySQL服务端
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='db3',
charset='utf8',
autocommit=True # 针对增 改 删自动二次确认
)
# 产生一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 编写SQL语句
username = input('username>>>:').strip()
password = input('password>>>:').strip()
sql = "select * from userinfo where name=%s and pwd=%s"
cursor.execute(sql,(username,password))
data = cursor.fetchall()
if data:
print(data)
print('登录成功')
else:
print('用户名或密码错误') """
sql = 'insert into userinfo(name,pwd) values("jason","123"),("kevin","321")'
res = cursor.execute(sql)
print(res) 在使用代码进行数据操作的时候 不同操作的级别是不一样的
针对查无所谓
针对增 改 删都需要二次确认
关键字:conn.commit()
推荐使用:
autocommit=True # 针对增 改 删自动二次确认
""" # SQL注入现象
1.只需要用户名也可以登录
2.不需要用户名和密码也可以登录
"""
SQL注入的原因:
是由于特殊符号的组合会产生特殊的效果 实际生活中 尤其是在注册用户名的时候 会非常明显的提示你很多特殊符号不能用 原因也是一样的 结论:
设计到敏感数据部分 不要自己拼接 交给现成的方法拼接即可
"""

6. MySQL补充知识

# 事务(重要)
特性:ACID
A:原子性
C:一致性
I:隔离性
D:持久性 01 原子性(atomicity)
一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做 02 一致性(consistency)
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的 03 隔离性(isolation):
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰 04 持久性(durability)
持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响 # 事务相关操作
start transcation; # 开启事务
诸多SQL操作:
rollback # 回滚到操作之前的状态
commit # 确认事务操作 之后不能回滚 # 1.先介绍事务的三个关键字 再去用表实际展示效果
create table user(
id int primary key auto_increment,
name char(32),
balance int
); insert into user(name,balance)
values
('jason',1000),
('egon',1000),
('tank',1000); # 2.修改数据之前先开启事务操作
start transaction; # 3.修改操作
update user set balance=900 where name='jason'; # 买支付100元
update user set balance=1010 where name='egon'; # 中介拿走10元
update user set balance=1090 where name='tank'; # 卖家拿到90元 # 4.回滚到上一个状态
rollback; # 5.如果确认修改
commit; # 6.查询表数据
select * from user; """
开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘
commit; 开启事务后 要检测操作是否完整,不完整就主动回滚到上一个状态,如果完整就应该执行commit操作
""" # 站在python代码的角度,应该实现的伪代码逻辑,
try:
update user set balance=900 where name='jason'; # 买支付100元
update user set balance=1010 where name='egon'; # 中介拿走10元
update user set balance=1090 where name='tank'; # 卖家拿到90元
except 异常:
rollback;
else:
commit;

多表查询思路、navicat可视化软件、python操作MySQL、SQL注入问题以及其他补充知识的更多相关文章

  1. HAVING,多表查询思路,可视化软件navicat,多表查询练习题,

    HAVING "where"是一个约束声明,在查询数据库的结果返回之前对数据库中的查询条件进行约束,即在结果返回之 前起作用,且"where"后面不能写&quo ...

  2. navicat软件、 python操作MySQL

    查询关键字之having过滤 having与where的功能是一模一样的 都是对数据进行筛选 where用在分组之前的筛选 havng用在分组之后的筛选 为了更好的区分 所以将where说成筛选 ha ...

  3. es的查询、排序查询、分页查询、布尔查询、查询结果过滤、高亮查询、聚合函数、python操作es

    今日内容概要 es的查询 Elasticsearch之排序查询 Elasticsearch之分页查询 Elasticsearch之布尔查询 Elasticsearch之查询结果过滤 Elasticse ...

  4. Python操作Mysql实例代码教程在线版(查询手册)

    本文介绍了Python操作MYSQL.执行SQL语句.获取结果集.遍历结果集.取得某个字段.获取表字段名.将图片插入数据库.执行事务等各种代码实例和详细介绍,代码居多,是一桌丰盛唯美的代码大餐   实 ...

  5. Python操作Mysql实例代码教程在线版(查询手册)_python

    实例1.取得MYSQL的版本 在windows环境下安装mysql模块用于python开发 MySQL-python Windows下EXE安装文件下载 复制代码 代码如下: # -*- coding ...

  6. python 3 mysql sql逻辑查询语句执行顺序

    python 3 mysql sql逻辑查询语句执行顺序 一 .SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_t ...

  7. Python全栈开发之MySQL(二)------navicate和python操作MySQL

    一:Navicate的安装 1.什么是navicate? Navicat是一套快速.可靠并价格相宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设.它的设计符合数据库管理员.开发人员及中小 ...

  8. Python操作MySQL数据库(步骤教程)

    我们经常需要将大量数据保存起来以备后续使用,数据库是一个很好的解决方案.在众多数据库中,MySQL数据库算是入门比较简单.语法比较简单,同时也比较实用的一个.在这篇博客中,将以MySQL数据库为例,介 ...

  9. python接口自动化(三十八)-python操作mysql数据库(详解)

    简介 现在的招聘要求对QA人员的要求越来越高,测试的一些基础知识就不必说了,来说测试知识以外的,会不会一门或者多门开发与语言,能不能读懂代码,会不会Linux,会不会搭建测试系统,会不会常用的数据库, ...

随机推荐

  1. HTML5元素

    1.1结构元素 HTML5定义了一组新的语义化标签,目前主流浏览器均已支持,语义化标签使用标记元素的内容,虽然可以使用原有标签替换,但是它可以简化HTML页面设计,并且也为搜索引擎在抓取和索引网页的时 ...

  2. 【从小白到专家】收官!Istio技术实践之九:路由控制与灰度发布

    本期是Istio技术实践专题的最后一个模块,主题是Istio的路由控制与灰度发布.上一期我们讲到,虚拟服务(Virtual Service)以及目标规则(Destination Rule)是 Isti ...

  3. HashMap原理及源码分析

    HashMap 原理及源码分析 1. 存储结构 HashMap 内部是由 Node 类型的数组实现的.Node 包含着键值对,内部有四个字段,从 next 字段我们可以看出,Node 是一个链表.即数 ...

  4. [WPF] 用 Effect 实现线条光影效果

    1. 前言 几个月前 ChokCoco 大佬发布了一篇文章: CSS 奇技淫巧 | 妙用 drop-shadow 实现线条光影效果 在文章里实现了一个发光的心形线条互相追逐的效果: 现在正好有空就试试 ...

  5. 记一次异步处理导致Jetty Request对象泄漏

    最近排查一个bug,发现了一系列有意思的东西,对「自定义线程池」.「Jetty线程模型」都有了一些新的认识. 本文预计阅读时间10分钟,包括: 问题表现 常见原因筛查 根因与源码分析 最佳实践 一些小 ...

  6. ansible roles实践——服务器初始化

    1.服务器初始化可以做哪些工作 关闭selinux ntp同步时间 修改dns为自建dns 配置ssh互信 修改yum源 设置主机名 内核参数优化 安装jdk 2.roles编写

  7. vue开源项目有点全

    目录 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★31142 - 饿了么出品的Vue2的web UI工具套件 Vux ★14104- 基于Vue和 ...

  8. 为什么 Redis 的查询很快, Redis 如何保证查询的高效

    Redis 如何保证高效的查询效率 为什么 Redis 比较快 Redis 中的数据结构 1.简单动态字符串 SDS 对比 c 字符串的优势 SDS可以常数级别获取字符串的长度 杜绝缓冲区溢出 减少修 ...

  9. 【Azure Developer】Azure Logic App 示例: 解析 Request Body 的 JSON 的表达式? triggerBody()?

    问题描述 通过Azure Logic App(逻辑应用)实现无代码的处理JSON数据.但是如何获取Request Body中的一个属性值呢? 例如:如何来获取以下JSON结构中的 ObjectName ...

  10. Python学习笔记之读取文件、OS模块、异常处理、with as语法示例

    转:https://m.sogou.com/web/id=4c468b90-3f64-418c-acf8-990b5fe2a757/keyword=python%20os%E6%A8%A1%E5%9D ...