一、多表查询

#建表
create table dep(
id int,
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,'运营'); insert into emp(name,sex,age,dep_id) values
('jason','male',18,200),
('egon','female',48,201),
('kevin','male',38,201),
('nick','female',28,202),
('owen','male',18,200),
('jerry','female',18,204)
;

创建表,插入数据sql语句

当初为什么要分表,就是为了方便管理,在硬盘上确实是多张表,但是到了内存中我们应该把他们再拼成一张表进行查询才合理。

select * from emp,dep;  #左表一条记录与右表所有记录都对应一遍>>>笛卡尔积

将所有的数据都对应了一遍,虽然不合理但是其中有合理的数据,现在我们需要的就是找出合理的数据,所以有了多表查询。

多表查询操作  (有四种)

1.内连接    inner join   只连接两张表相同的数据

select * from emp inner join dep on emp.dep_id = dep.id;   #on后面跟的是条件

2.左连接   left join  在内连接的基础上,保留左边表(emp)没有对应的数据

select * from emp left join dep on emp.dep_id = dep.id;

3.右连接   right join   在内连接的基础上,保留右边表(dep)没有对应的数据

select * from emp right join dep on emp.dep_id=dep.id;

4.全连接   union    就是左连接和右连接用union连起来,不包括重复行

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;

5. union  all     也是将左连接和右连接结果合并起来,包括重复行,即显示所有结果

select * from emp left join dep on emp.dep_id = dep.id
union all
select * from emp right join dep on emp.dep_id = dep.id;

二、子查询

将一张表查询结果作为另一条sql语句的查询条件

查询部门是技术或者是人力资源的员工信息

select * from emp where dep_id in(select id from dep where name = '技术' or name='人力资源');

记住一个规律,表的查询结果可以作为其他表的查询条件,也可以通过取别名的方式把它作为一张虚拟表去跟其他表做关联查询。

三、exists

EXISTS关键字表示存在,在使用EXISTS关键字时,内层查询语句不返回查询的记录,而是返回一个真假值,True或False。当返回True时,外层查询语句将进行查询,当返回值为False时,外层查询语句不进行查询。

select * from emp where exists (select id from dep where id > 203);

四、Navicat使用

掌握:

1.测试+连接数据库

2.新建库

3.新建表,新增字段+类型+约束

4.设计表:外键

5.新建查询

6.建立表模型

注意:批量加注释 ctrl+?键

五、pymysql模块

1.安装:pip install pymysql

2.代码连接

import pymysql
#连接
conn=pymysql.connect(
host='localhost',
 port=3306,
user='root',
password='root',
database='day38',
charset='utf8'
)
#游标
# cursor = conn.cursor() #执行完毕返回的结果默认以元组显示
cursor = conn.cursor(pymysql.cursors.DictCursor) # 产生一个游标对象以字典的形式返回查询出来的数据,键是表的字段,值是表的字段对应的信息
sql = 'select * from teacher'
cursor.execute(sql) #执行传入的sql语句
print(cursor.fetchone()) #只获取一条数据
print(cursor.fetchone()) #只获取一条数据
# cursor.scroll(1,'relative') #relative相当于当前位置 光标往后移动几位
cursor.scroll(1,'absolute') #absolute相当于起始位置 光标往后移动几位
print(cursor.fetchall()) #获取所有数据,结果返回的是一个列表,元素是一个个的字典
# print(cursor.fetchmany(4)) #写入需要查询的数据条数,结果返回的是一个列表

六、sql注入问题

就是利用一些特殊符号巧妙的修改sql语句(比如mysql中的注释是 --,会把--后面的sql全部注释)

后续写sql语句不要手动拼接关键性数据,要让execute帮你去做拼接

username = input(">>>:").strip()
password = input(">>>:").strip()
sql = "select * from user where username='%s' and password='%s'"%(username,password)

正确写法

username = input('username>>>:')
password = input('password>>>:')
sql = "select * from user where name =%s and password = %s"
res = cursor.execute(sql,(username,password)) # 能够帮你自动过滤特殊符号 避免sql注入的问题
# execute 能够自动识别sql语句中的%s 帮你做替换
if res:
print(cursor.fetchall()) #查询所有
else:
print('用户名或密码错误') #一次插入多行记录 res = cursor.executemany(sql,[(),(),()])

增删改问题

做数据库增删改的操作 都必须在设置连接的地方写autocommit = True。

# 增
sql = "insert into user(username,password) values(%s,%s)"
rows = cursor.excute(sql,('jason',''))
# 修改
sql = "update user set username='jasonDSB' where id=1"
rows = cursor.excute(sql) 增删改 单单执行excute并不会真正影响到数据
conn = pymysql.connect(
host = 'localhost',
port = 3306,
user = 'root',
password = 'root',
database = 'day38',
charset = 'utf8', # 编码千万不要加- 如果写成了utf-8会直接报错
autocommit = True # 这个参数配置完成后 增删改操作都不需要在手动加conn.commit了
)

MySQL多表查询,Navicat使用,pymysql模块,sql注入问题的更多相关文章

  1. Navicat工具、pymysql模块 sql注入

    cls超 Navicat工具.pymysql模块 阅读目录 一 IDE工具介绍 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试, ...

  2. day40:python操作mysql:pymysql模块&SQL注入攻击

    目录 part1:用python连接mysql 1.用python连接mysql的基本语法 2.用python 创建&删除表 3.用python操作事务处理 part2:sql注入攻击 1.s ...

  3. navicat工具 pymysql模块

    目录 一 IDE工具介绍(Navicat) 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具,我们使用Navi ...

  4. MySQL多表查询之外键、表连接、子查询、索引

    MySQL多表查询之外键.表连接.子查询.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为 ...

  5. python3 mysql 多表查询

    python3 mysql 多表查询 一.准备表 创建二张表: company.employee company.department #建表 create table department( id ...

  6. 数据库——可视化工具Navicat、pymysql模块、sql注入问题

    数据库--可视化工具Navicat.pymysql模块.sql注入问题 Navicat可视化工具 Navicat是数据库的一个可视化工具,可直接在百度搜索下载安装,它可以通过鼠标"点点点&q ...

  7. 记一次mysql多表查询(left jion)优化案例

    一次mysql多表查询(left jion)优化案例 在新上线的供需模块中,发现某一个查询按钮点击后,出不来结果,找到该按钮对应sql手动执行,发现需要20-30秒才能出结果,所以服务端程序判断超时, ...

  8. Mysql 单表查询 子查询 关联查询

    数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...

  9. (转)Mysql 多表查询详解

    MySQL 多表查询详解 一.前言  二.示例 三.注意事项 一.前言  上篇讲到mysql中关键字执行的顺序,只涉及了一张表:实际应用大部分情况下,查询语句都会涉及到多张表格 : 1.1 多表连接有 ...

随机推荐

  1. pipelinewise 学习一 docker方式安装

    pipelinewise 没有提供基于pip 包的模式进行安装,而且推荐使用docker 以及源码的方式 以下是一个使用docker运行的方式 安装   git clone https://githu ...

  2. GoCN每日新闻(2019-10-27)

    GoCN每日新闻(2019-10-27) 1. Golab(意大利GopherCon)2019见闻 http://fedepaol.github.io/blog/2019/10/23/golab-20 ...

  3. nginx 访问控制之 认证

    安装httpd yum install -y httpd 使用htpasswd生产密码文件 htpasswd -c /usr/local/nginx/conf/htpasswd aming# -c 表 ...

  4. linux高性能服务器编程 (三) --TCP协议详解

    第三章 IP协议详解 TCP协议是TCP/IP协议族中的另外一个重要的协议,与IP协议相比,TCP协议更高进应用层.一些重要的socket选项都和TCP协议相关.这一章主要从如下方面学习: 1)TCP ...

  5. Codeforces1254B2 Send Boxes to Alice (Hard Version)(贪心)

    题意 n个数字的序列a,将i位置向j位置转移x个(a[i]-x,a[j]+x)的花费为\(x\times |i-j|\),最终状态可行的条件为所有a[i]均被K整除(K>1),求最小花费 做法 ...

  6. 【BigData】Java基础_数组

    什么是数组?数据是可以装一组数据的变量 1.定义数组 float[] arr1 = new float[10]; // 可以装10个float数据 int[] arr2 = new int[10]; ...

  7. Pycharm 导入Selenium,出现错误

    问题 导入Selenium,出现红色波浪线. 解决 点击Pycharm左上角File>setting>Project Interpreter,双击PIP,搜索栏搜索Selenium 然后选 ...

  8. Features Track[STL map]

    目录 题目地址 题干 代码和解释 参考 题目地址 Features Track(ACM-ICPC 2018 徐州赛区网络预赛 ) 题干 代码和解释 题意:一个动画有许多 n 帧,每帧有 k 个点,点的 ...

  9. 《微信小程序商城开发实战》唐磊,全网真实评价截图,不吹不黑,全部来自网友的真实评价

    偶尔看了下网友的销量和评价,感觉还不错,因为市面上大多关于小程序的书籍可能写的不够全面,要么只是点到为止的大致罗列,要么就是只简单介绍一下小程序的 界面设计这块.这样很难给学习小程序开发的人一个完成的 ...

  10. Java基础 awt Graphics2D 生成矩形图片并向内写入字符串

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...