1.多表查询 => 转化为一张联合大表 2.可视化工具 3.pymysql模块
多表数据
create table dep(
id int primary key auto_increment,
name varchar(16),
work varchar(16)
);
create table emp(
id int primary key auto_increment,
name varchar(16),
salary float,
dep_id int
);
insert into dep values(1, '市场部', '销售'), (2, '教学部', '授课'), (3, '管理部', '开车');
insert into emp(name, salary, dep_id) values('egon', 3.0, 2),('yanghuhu', 2.0, 2),('sanjiang', 10.0, 1),('owen', 88888.0, 2),('liujie', 8.0, 1),('yingjie', 1.2, 0);
笛卡尔积 (交叉连接)
'''
# 需求:
# 查看每位员工的部门的所有信息
select * from emp;
select * from dep; # 子查询, 最终结果只能显示单表的信息, 但需求是同时显示两张表的信息 => 先将两张表合成一张表
select * from emp where dep_id in (select id from dep); #只能显示由部门的成员信息 '''
'''
笛卡尔积: 集合 X{a, b} * Y{o, p, q} => Z{{a, o}, {a, p}, {a, q}, {b, o}, {b, p}, {b, q}}
交叉查询: select * from emp, dep; | select * from emp course join dep; 这两个结果一样
''' ''' 下面做了筛选,结果小于等于完整的数据,所以是非笛卡尔积
select * from emp, dep where db2.emp.dep_id = db2.dep.id; # 同sql语句上表现是从两张表拿数据
# 注意: 同时查询两张表形成的新表可以称之为虚拟表, 原表与表之间可能存在重复字段, 同时使用时需要明确所属表,必要时还需明确所属数据库
'''
多表连接(*****) 本质:转换成虚拟的单表
内连接
'''
inner join on 内连接:结果为两张表有对应关系的数据(emp有dep没有,emp没有dep有的记录均不会被虚拟表展示)
语法:左表 inner join 右表 on 两表有关联的字段的条件, on就是产生对于关系的(连接的依据)
eg:select * from emp inner join dep on emp.dep_id = dep.id;
'''
左连接
'''
left join on
左连接:在内连接的基础上还保留左表特有的记录
语法:左表 left join 右表 on 两表有关联的字段的条件
eg:select emp.name '员工', dep.name '部门', dep.work '职责' from emp left join dep on emp.dep_id = dep.id;
'''
右连接
'''
right join on
右连接:在内连接的基础上还保留右表特有的记录
语法:左表 right join 右表 on 两表有关联的字段的条件
eg:select * from emp right join dep on emp.dep_id = dep.id;
''' '''
内连接,左连接,右连接总结:
在连接语法join 前就是左表, 后就是右表
采用的是left关键词就是左连接, right关键词就是右连接, inner关键词就是内连接
'''
全连接
'''
全连接:在内连接的基础上分别保留这左表及右表特有的记录
语法:mysql没有full join on语法,但可以通过去重达到效果
eg:
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;
其中union就是将两个表连接起来并达到去重的效果
'''
练习
'''
1.查询每一位员工对应的工作职责
分析:每一位员工那么员工的信息要被全部保留:左表如果为emp表,那么左表的信息要被全部保留,用左连接
左表如果为dep表,那么右表的信息要被全部保留,用右连接
select emp.name,dep.work from emp left join dep on emp.dep_id=dep.id;
select emp.name,dep.work from dep right join emp on emp.dep_id=dep.id;
2.查询每一个部门下的员工们及员工职责
分析:
每一个部门=>那么部门的信息要被全部保留并且需要分组
员工职责=>dep.work,由于分组不能直接被查询=>需要用聚合函数处理
员工们=>emp.name做拼接=>group_concat(emp.name)
分组的字段=>部门=>emp.dep_id
左表如果为emp表,那么右表的信息要被全部保留,使用右连接
左表如果为dep表,那么左表的信息要被全部保留,使用左连接 select max(dep.name),max(dep.work),group_concat(emp.name) from emp right join dep on emp.dep_id=dep.id group by emp.dep_id;
select max(dep.name),max(dep.work),group_concat(emp.name) from dep left join emp on emp.dep_id=dep.id group by emp.dep_id;
'''
'''
注意:on的优先级高于group by 所以on在group by 的左边
'''
navicat
'''
1. 安装navicat 2.连接数据库,并建库 3.创建表、设置字段、插入数据 4.新建查询
查询在上面点击有新建查询
'''
sql文件注释:单行注释 -- abc; 不会报错,有分号,--后要加空格
多行注释 /*abc*/ 不会报错,没有分号
# abc; 有分号,#后要加空格
python使用mysql
# 模块pymysql # 按照并导入pymysql: pip3 insatll pymysql # 通过pymysql操作数据库分四步:
'''
1.建立连接
conn = pymysql.connect(host="localhost", port=3306, db='db3', user='root', password='root') #user和密码必须加引号,密码是数字也要加引号 2.设置字典类型游标
cursor = conn.cursor(pymysql.cursors.DictCursor) #设置字典类型的游标方便取值 3.执行sql语句并使用执行结果 # 书写sql语句
sql = 'select * from emp'
# 执行sql语句, 有返回值, 返回值为得到的记录行数
line = cursor.execute(sql)
print(line) # 使用执行的结果:
fetchone())当前游标往后获取一行记录
fetchall()当前游标往后所有的记录
#游标移动
scroll(num, mode="relative|absolute")
relative: 游标从当前位置往后移动num行
ablolute: 游标从头往后移动num行, 一般可以结合line来使用能定位到任意位置
tag = cursor.fetchone() # fetch 拿取,第一次执行拿到第一条结果
print(tag)
print(tag['salary'])
tag = cursor.fetchone() # 第二次执行拿到第二条结果
print(tag)
cursor.scroll(1, mode='relative') # 偏移第三条
# cursor.scroll(line - 1, mode='absolute') # 指针绝对, 游标永远从头开始偏移
tags = cursor.fetchall() # 第四条开始拿数据直到最后
print(tags) 4.断开连接
cursor.close()
conn.close()
'''
pymysql处理sql的注入问题
# 什么是sql注入:
# 通过书写sql包含(注释相关的)特殊字符, 让原有的sql执行顺序发生改变, 从而改变执行得到的sql
#sql中的注释:/**/ | -- | #
# 目的:
# 绕过原有的sql安全认证, 达到对数据库攻击的目的 # 没有处理sql注入的写法
'''
import pymysql
conn = pymysql.connect(host='localhost',port=3306,user='root',password='940828',db='db3')
cursor = conn.cursor(pymysql.cursors.DictCursor)
#登录功能 #得到用户输入的账户密码
user = input('请输入用户名:').strip()
pwd = input('请输入密码:').strip() #和数据库的账号密码进行比对
sql = 'select * from user where user="%s" and pwd="%s"' %(user,pwd)
#%s为什么要用双引号????如果后面数据是字符串形式必须加双引号,是数字形式可加可不加.所以必须加上
res=cursor.execute(sql)
if res:
print('登录成功!')
else:
print('登录失败!') cursor.close()
conn.close()
''' # sql注入
# 1.知道用户名: henry" -- hehe | ooo
# select * from user where usr="henry" -- hehe" and pwd="ooo" #这样是把-- 后面的代码当成注释
# 2.不知道用户名 aaa" or 1=1 -- hehe | 000
# select * from user where usr="aaa" or 1=1 -- hehe" and pwd="000" #第一个or判断为真,-- 后面的代码当成注释 # 处理sql注入
# 处理方式
# 对输入的账户密码做完全处理 => 不可能形成达到sql注入的特殊语法 => 正则
sql = 'select * from user where usr=%s and pwd=%s'
res = cursor.execute(sql, (usr, pwd))
#这个%s为什么不用双引号?用双引号会报错!
增删改
# 增
# 增sql语句
sql1 = 'insert into user(user, pwd) values (%s, %s)'
#cursor执行sql语句,在内存中完成了对数据的插入, 但不能将数据存放到硬盘
# 会将id完成自增,如果第一次运行没有将数据放到硬盘,那么接下来运行并将数据写到硬盘id会跳过一位. # 在内存中一次插入一条
cursor.execute(sql1, ("opq", "123")) # 在内存中一次插入多条
cursor.executemany(sql1, [("aaa", "000"), ("bbb", "111")])
# 将内存中的数据提交到硬盘中
conn.commit() #删
sql2 = 'delete from user where user=%s'
cursor.execute(sql2,('lzq'))
conn.commit() #改
sql3 = 'update user set pwd=%s where user=%s'
cursor.execute(sql3,('wade','wade'))
conn.commit()
1.多表查询 => 转化为一张联合大表 2.可视化工具 3.pymysql模块的更多相关文章
- mysql(单表查询,多表查询,MySQl创建用户和授权,可视化工具Navicat的使用)
单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT ...
- 多表查询、可视化工具、pymysql模块
create table dep( id int primary key auto_increment, name varchar(16), work varchar(16) ); create ta ...
- (MYSQL)回表查询原理,利用联合索引实现索引覆盖
一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...
- MyBatis-Plus联表查询的短板,终于有一款工具补齐了
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的 ...
- 数据库 --- 4 多表查询 ,Navicat工具 , pymysql模块
一.多表查询 1.笛卡儿积 查询 2.连接 语法: ①inner 显示可构成连接的数据 mysql> select employee.id,employee.name,department ...
- 两张超级大表join优化
一个简单的两表关联,SQL跑了差不多一天一夜,这两个表都非常巨大,每个表都有几十个G,数据量每个表有20多亿,表的字段也特别多. 相信大家也知道SQL慢在哪里了,单个进程的PGA 是绝对放不下几十个G ...
- MySQL 新增表分区很慢,转移大表数据
问题: MySQL (version 5.7.26) 数据库有一批表 xxx_yyy,由于评估的数据量可能比较大,因此每张表都设置了表分区,把每个月的数据保存在单独的分区里. 那么如果每年年末,没有提 ...
- Mysql多表查询(两张独立表,一张关系表)
一.数据库设计 1.三个数据表长这样 其中user表记录用户信息,cat主要记录男女性别,mete表是用户id和性别id的对应关系 2.具体数据如下 二.查询目标 查询出所有性别为“男”的 ...
- day43 多表查询和pymysql
复习 增删改查全语法 # 增 insert into db1.t1(字段2, 字段1, ..., 字段n)|省略 values (值2, 值1, ..., 值n)|(值1, 值2, ..., 值n)[ ...
随机推荐
- 一群猴子排成一圈,按1,2,...,n依次编号
朋友面试遇到的题,网上大部分都是直接往数组后push的解法,不考虑,下面这个方法看起来很简单,但是我理解不了,有大牛懂得给解释一下 朋友面试遇到的题,网上大部分都是直接往数组后push的解法,不考虑, ...
- HDU 4565 So Easy(矩阵解公式)
So Easy [题目链接]So Easy [题目类型]矩阵解公式 &题解: 感觉这种类型的题都是一个套路,这题和hdu 2256就几乎是一样的. 所以最后2Xn就是答案 [时间复杂度]\(O ...
- python3学习笔记之安装
一.Python安装 1.下载地址: https://www.python.org/downloads/release/python-365/ 2. Linux系统自带Python2.7,如需安装3 ...
- Maven的作用、用途、内涵、愿景
maven被许多人认为是一个构建工具.许多人最初是从熟悉ant而转到maven的,因此很自然地这样认为maven是一个构建工具.但是maven并不仅仅是一个构建工具,也不是ant的一个替代工具.mav ...
- Quick-Cocos2d-x 新建项目
开发工具准备就绪以后,下面我们就可以开始创建我们的项目了. 首先启动 Quick 下的 player3,在这儿的示例标签下你可以看到很多Quick自带的示例,对于初学者来说,看看这些示例的使用方法会对 ...
- MySql语句分类
SQL语言分为四大类:数据定义语言DDL,数据查询语言DQL,数据操作语言DML,数据控制语言DCL [1]数据定义语言DDL 数据定义语言DDL,用于创建.修改.删除数据库内的数据结构.如下: (1 ...
- kalinux 五笔安装
1.输入命令 sudo apt-get install fcitx-table-wubi 2.配置,找到这个fcitx配置,运行,把五笔调到第2个 3.reboot重启系统
- [转载]ORA-01502错误成因和解决方法
检查一下索引状态,我们会注意到索引已经是“UNUSABLE”了.SQL> select index_name,index_type,tablespace_name,table_type,stat ...
- JMX堆栈分析
线程堆栈: 线程堆栈也称线程调用堆栈,是虚拟机中线程(包括锁)状态的一个瞬间快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况.虽然不同的虚拟机打印出来的格式有些不同, ...
- (2018干货系列八)最新VR学习路线整合
怎么学VR 即虚拟现实技术,是一种可以创建和体验虚拟世界的计算机仿真系统,它利用计算机生成一种模拟环境,是一种多源信息融合的.交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中.VR/AR/ ...