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

1. 笛卡尔积

将两表所有的数据一一对应,生成一张大表(可能有重复的字段名)
select * from dep,emp; -- 两张表拼在一起
select * from ,emp where dep.id=emp.dep_id; -- 找到两表之间对应的关系记录
select * from dep,mep where dep.id=emp.dep_id and dep.name='技术'; -- 筛选部门名称为技术的大表中的记录
select emp.name from dep,emp where dep.id = emp.dep_id and dep.name='技术'; -- 拿到筛选后的记录的员工姓名字段数据 展示出来是虚拟的表,和平时单表的约束条件不一样,可能有重名,原表可能设置为非空,连表后可能为空

2. 连表查询

2.1 inner join 内连接

第一步:连表
select * from dep inner join emp on dep.id=emp.dep_id;
2.过滤
select * from dep inner join emp on dep.id=emp.dep_id where dep.name = '技术';
3.找对应数据
select emp.name from dep inner join emp on dep.id=emp.dep_id where dep.name = '技术';

2.2 left join 左连接

left join  左连接
-- left join左边的表为主表,主表记录必须全部显示,辅表没办法对应上的,就通过null来补全
-- 左边显示dep,右边显示emp select * from dep left join emp on dep.id=emp.dep_id;

2.3 right join 右连接

right join  右连接
-- right join右边的表为主表,主表记录必须全部显示,辅表没办法对应上的,就通过null来补全
-- 左边显示dep,右边显示emp select * from dep right join emp on dep.id=emp.dep_id;

2.4 union全连接

mysql> select * from dep left join emp on dep.id=emp.dep_id
-> union
-> select * from dep right join emp on dep.id=emp.dep_id; union与union all的区别:
- union会去掉相同的纪录,因为union all是left join 和right join合并,所以有重复的记录,
- 通过union就将重复的记录去重了。

3. 子查询

1.一个查询结果集作为另一个查询的条件
select name from emp where dep_id = (select id from dep where name = '技术');
2、带比较运算符的子查询
比较运算符:=、!=、>、>=、<、<=、<>
如:查询大于所有人平均年龄的员工名与年龄
3、带EXISTS关键字的子查询
  EXISTS关字键字表示存在。在使用EXISTS关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。True或False
  当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询。还可以写not exists,和exists的效果就是反的 3.总结:
- 1:子查询是将一个查询语句嵌套在另一个查询语句中。
- 2:内层查询语句的查询结果,可以为外层查询语句提供查询条件。
- 3:子查询中可以包含:IN、NOT IN、ANY、ALL、EXISTS 和 NOT EXISTS等关键字
- 4:还可以包含比较运算符:= 、 !=、> 、<等

4. pymysql模块

4.1 python代码读取mysql数据库

import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='666',
database='day43',
charset='utf8',
) cursor = conn.cursor(pymysql.cursors.DictCursor)
# 默认游标取出的数据是 ((),)
# DictCursor 对应的数据结构 [{},],如果用的是fetcheone,那么结果是{}.
sql = "select * from dep;" ret = cursor.execute(sql) # ret 受影响的行数 print(ret)
print(cursor.fetchmany()) # 不写参数,默认是一条
print(cursor.fetchone())
print(cursor.fetchall()) print('----------')
cursor.scroll(2,'absolute') # absolute 绝对移动,相对于数据最开始的位置进行光标的移动
cursor.scroll(2,'relative') # relative 相对移动,按照光标当前位置来进行光标的移动 print(cursor.fetchone())

4.2 python代码增删改mysql数据库

import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='666',
database='day43',
charset='utf8',
) cursor = conn.cursor(pymysql.cursors.DictCursor) sql = "insert into t1 values (3,'xx3',18);" ret = cursor.execute(sql) print(ret) # 增删改都必须进行提交操作(commit)
conn.commit() # 提交

4.3 sql注入

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

sql的注释符:--

import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='666',
database='day43',
charset='utf8',
) while 1:
username = input('请输入用户名:')
password = input('请输入密码:') cursor = conn.cursor(pymysql.cursors.DictCursor)
sql = "select * from userinfo where username='%s' and password='%s';" % (username, password) # sql注入
# sql = "select * from userinfo where username='zhangsan '-- ' and password='%s';"% (username, password)
# 知道用户名不知道密码,登录网站(输入张三" -- "即可登录) # sql = "select * from userinfo where username='aaa' or 1=1 -- ' and password='%s';" % (username, password)
# 不知道用户名也不知道密码,登录网站(输入aaa"or 1=1 -- "即可登录) # pymysql解决sql注入问题
sql = "select * from userinfo where username=%s and password=%s;"
ret = cursor.execute(sql,[username,password])
if ret:
print('登录成功')
else:
print('账号或者密码错误,请重新输入!!!') # 增删改都必须进行提交操作(commit)
conn.commit()

4.4 pymysql总结

import pymysql
conn = pymysql.connect(
host='127.0.0.1', # 主机ip
port=3306, # 端口号
user='root', # 用户名
password='666', # 密码
database='day43' # 需要连接的库
charset='utf8'
)
cursor = conn.cursor()
sql = "select * from dep;"
ret = cursor.excute(sql) # ret受影响的行数
print(cursor.fetchall()) # 取出所有的
print(cursor.fetchmany(3)) # 取出多条
print(cursor.fetchone()) # 取出单条 cursor.scroll(3,'absolute') # 绝对移动,按照数据最开始位置往下移动3条
cursor.scroll(3,'relative') # 相对移动,按照当前光标位置往下移动3条 conn.commit() # 增删改操作时,需要进行提交 sql注入:解决方案
cursor.execute(sql,[参数1,参数2...])
两种场景:
知道用户名不知道密码 or 1=1
不知道用户名也不知道密码 ' -- (--后面有一个空格)
不能通过字符串格式化来写
cursor.execute(sql,[参数1,参数2...])相当于是去掉特殊符号去掉

Mysql基础(五):多表查询、pymysql模块的更多相关文章

  1. mysql 基础入门 单表查询

    单表查询 select 表头,表头 as 别名 ,表头(+-*/的运算) from table_a 1.条件查询 where + 条件 <> , != 不等于 = 等于,也可以表示字符串值 ...

  2. 深入学习之mysql(五)连接查询

    深入学习Mysql(五)连接查询 1.准备数据库: CREATE DATABASE IF NOT EXISTS `db_book2` DEFAULT CHARACTER SET UTF8; USE ` ...

  3. mysql 数据操作 单表查询 目录

    mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...

  4. mysql 数据操作 多表查询 目录

    mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...

  5. MySQL数据库语法-多表查询练习一

    MySQL数据库语法-多表查询练习一 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要介绍的多表查询的外键约束,以及如何使用外链接和内连接查询数据信息. 一.数据表和测试 ...

  6. mysql 数据操作 单表查询 where 约束 目录

    mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...

  7. mysql 数据操作 单表查询 group by 分组 目录

    mysql 数据操作 单表查询 group by 介绍 mysql 数据操作 单表查询 group by 聚合函数 mysql 数据操作 单表查询 group by 聚合函数 没有group by情况 ...

  8. MySQL数据库之单表查询中关键字的执行顺序

    目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...

  9. mysql中的回表查询与索引覆盖

    了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...

  10. MySQL数据库语法-单表查询练习

    MySQL数据库语法-单表查询练习 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客主要是对聚合函数和分组的练习. 一.数据表和测试数据准备 /* @author :yinz ...

随机推荐

  1. refs转发 React.forwardRef

    2020-04-01 refs转发 前几天刚总结完ref&DOM之间的关系,并且想通了3种ref的绑定方式 今天总结一下refs转发 这是react中一直困扰我的一个点 示例: 输入: wor ...

  2. SSM-maven 简单整合

    记一次简单的整合了一次SSM框架过程,因为好久不用了在过程中发生了一些问题. 后续我会在继续在此基础上整合其他框架进来. 本次整合用到的框架有: spring & springmvc myba ...

  3. JavaScript转换json

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. <VCC笔记> 关于Assertion

    这篇博客开始介绍VCC的用法,先用简单的例子介绍VCC的基本语法,当然面对更复杂的程序时,VCC也是将他简化然后分析的. 1.Assertion #include <vcc.h> int ...

  5. Android学习笔记主题(Theme)资源文件

    安卓的主题资源文件,可以用于对Android应用的美化. styles文件是主题资源文件. 定义一个主题资源格式如下: <resources> <!-- Base applicati ...

  6. 一起玩转微服务(10)——spring boot介绍

    对于Spring,相信大家都非常熟悉,从出现开始,一直是企业级开发的主流.但是随着软件的发展和应用开发的不断演化,它的一些缺点也逐渐胡暴露了出来,下面,我们就一起看一下Spring的发展历程并且认识一 ...

  7. Elasticsearch、Solr、Lucene、Hermes区别

    Elasticsearch简介 Elasticsearch是一个实时分布式搜索和分析引擎.它让你以前所未有的速度处理大数据成为可能.它用于全文搜索.结构化搜索.分析以及将这三者混合使用:维基百科使用E ...

  8. jvm入门及理解(六)——垃圾回收与算法

    一.jvm垃圾回收要做的事情 哪些内存需要回收 什么时候回收 怎么回收 二.如何判断对象已经死亡,或者说确定为垃圾 引用计数法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加1: ...

  9. SpringBoot--使用socket搭建聊天室

    1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  10. myeclipse集成jad反编译步骤

    (1) 将jad.exe放到java的jdk\bin目录下(2) 将jadeclipse插件net.sf.jadclipse_3.3.0.jar 拷贝到myeclipse安装目\Common\plug ...