day43

多表查询

笛卡尔积——不经常用

将两表所有的数据一一对应,生成一张大表

select * from dep,emp; # 两个表拼一起
select * from dep,emp where dep.id = emp.dep_id; # 找到两表之间对应的关系记录
select * from dep,emp where dep.id = emp.dep_id and dep.name = '技术'; # 筛选部门名称为技术的记录
select emp.name from dep,emp where dep.id = emp.dep_id and dep.name = '技术'; # 拿到筛选后的记录的员工姓名字段数据

连表查询

inner join 内连接
第一步:连表
select * from dep inner join emp on dep.id = emp.dep_id 第二步:过滤
select * from dep inner join emp on dep.id = emp.dep_id where dep.name = '技术'; 第三步:找对应字段数据
select emp.name from dep inner join emp on dep.id=emp.dep_id where dep.name = '技术';
left join 左连接

left join左边的表为主表,主表记录必须全部显示,辅表没办法对应上的就通过null来补全

select * from dep left join emp on dep.id=emp.dep_id;
right join 右连接

right join右边的表为主表,主表记录必须全部显示,辅表没办法对应上的就通过null来补全

select * from dep right join emp on dep.id=emp.dep_id;
union 全连接
select * from dep left emp on dep.id=emp.dep_id union select * from dep right join emp on dep.id=emp.dep_id

子查询

一个查询结果集作为另一个查询的条件

select name from emp where dep_id = (select id from dep where name = '技术');
  • 子查询是将一个查询语句嵌套在另一个查询语句中。
  • 内层查询语句的查询结果,可以为外层查询语句提供查询条件
  • 子查询中可以包含:in、not in、any、all、exists、not exists等关键字
  • 还可以包含比较运算符:=、!=、>、<
带in的查询
select id,name from department where id in (select dep_id from employee group by dep_id having avg(age) > 25);
带any查询
自己尝试:select title from s2 where s2.id = any(select s2_id from s3 where s1_id = (select s1.id from s1 where name = '太白'));

百度:
mysql> CREATE TABLE t(a INT, b INT);
Query OK, 0 rows affected (0.68 sec) mysql> INSERT t VALUES (1, 1),(1, 2),(1, 3),(1, 4);
Query OK, 4 rows affected (0.13 sec)
Records: 4 Duplicates: 0 Warnings: 0 mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| myset |
| s1 |
| s2 |
| s3 |
| shirt |
| stu |
| t |
| t1 |
| t2 |
+---------------+
9 rows in set (0.00 sec) mysql> select * from t;
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
+------+------+
4 rows in set (0.00 sec) mysql> select b from t where b >= 2 and b<= 3;
+------+
| b |
+------+
| 2 |
| 3 |
+------+
2 rows in set (0.00 sec) mysql> select * from t where b >= any (select b from t where b >= 2 and b<= 3); # b>=2 or b>=3
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
+------+------+
3 rows in set (0.00 sec) mysql> select * from t where b <= any (select b from t where b >= 2 and b<= 3); # b<=2 or b<=3
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
+------+------+
带some的查询

与any的效果相同

带all的查询
与上面any实例相同
SELECT * FROM t WHERE
b >= ALL (SELECT b FROM t WHERE b >= 2 AND b <= 3); # b>=2 and b>=3
结果:
1 3
1 4
SELECT * FROM t WHERE
b <= ALL (SELECT b FROM t WHERE b >= 2 AND b <= 3); # b<=2 and b<=3
结果:
1 1
1 2
带比较运算符的查询
select name,age from emp where age > (select avg(age) from emp);
带exists关键字的查询

exists 关键字意思是存在,在使用exists关键字时,内层查询语句不返回查询的记录,而是返回一个真假值。True或False

当返回True时,外层查询语句将进行查询;当返回值为False时,外层查询语句不进行查询。还可以写not exists 和exists的效果是反的

mysql> select * from employee where exists (select id from department where id=200);

Navicat工具自己使用

#1. 测试+链接数据库
#2. 新建库
#3. 新建表,新增字段+类型+约束
#4. 设计表:外键
#5. 新建查询
#6. 备份库/表

公司一般用的创建数据库模型的软件

PowerDesigner是一个做开发设计很常用的工具软件,同时还有Rose也可以,都是当前软件开发最著名的建模设计及软件之一。

pymysql模块

pymysql python连接mysql的客户端

总结:
import pymysql
conn = pymysql.connect(
host='127.0.0.1', # 主机
prot=3306, # 端口号
user='root', # 用户名
password='666', # 密码
database='day43', # 需要连接的库
charset='utf8'
)
cursor = conn.cursor() sql = 'select * from dep;'
ret = cursor.execute(sql) # ret是受影响的行数
print(cursor.fetchall()) # 取出所有的
print(cursor.fetchmany(3)) # 取出3条(多条)
print(cursor.fetchone()) # 取出单条 cursor.scroll(3,'absolute') # 绝对移动,按照数据最开始位置往下移动3条
cursor.scroll(3,'relative') # 相对移动,按照当前光标位置往下移动3条 conn.commit() # 增删改操作时,需要进行提交
cursor.close() #关闭游标
conn.close() #关闭连接 sql注入:解决方案
cursor.execute(sql,[参数1,参数2.。。])
查询元组显示
import pymysql

conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='222',
database='day43',
charset='utf8'
)
cursor = conn.cursor()
# 默认游标取出的数据是((),)
# DictCursor 对应的数据结构[{},],如果用的是fetcheone
,那么结果是{}
sql = 'select * from dep;' ret = cursor.execute(sql) print(ret) # ret 是受影响的行数
# print(cursor.fetchall()) # 打印出所有的数据
print(cursor.fetchmany(4)) # 打印出3条数据,默认一条
# print(cursor.fetchone()) # 打印出一条 # 打印有光标,会随着打印的数据移动
# cursor.scroll(4, 'absolute') # 绝对移动,相对于数据最开始的位置进行光标的移动,不可等于或大于表最的大行数,不然报错
# cursor.scroll(2, 'relative') # 相对移动,按照光标当前位置来进行光标的移动,不可等于或大于表的最大行数,不然报错 # print(cursor.fetchone()) # 打印出一条,如果没有数据会返回None
# print(cursor.fetchmany(4)) # 打印出多条数据,默认一条,里面的个数多余实际个数不会报错,只会全部打印出来,没有返回一个空元组或者空列表
# print(cursor.fetchall()) # 打印出所有的数据,打印多余的数据,没用数据返回一个空元组或者空列表
cursor.close() #关闭游标
conn.close() #关闭连接
查询字典显示
import pymysql

conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='222',
database='day43',
charset='utf8'
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 默认游标取出的数据是((),)
# DictCursor 对应的数据结构[{},],如果用的是fetcheone,那么结果是{}
sql = 'select * from dep;' ret = cursor.execute(sql) print(ret) # ret 是受影响的行数
# print(cursor.fetchall()) # 打印出所有的数据
print(cursor.fetchmany(4)) # 打印出3条数据,默认一条
# print(cursor.fetchone()) # 打印出一条 # 打印有光标,会随着打印的数据移动
# cursor.scroll(4, 'absolute') # 绝对移动,相对于数据最开始的位置进行光标的移动,不可等于或大于表最的大行数,不然报错
# cursor.scroll(2, 'relative') # 相对移动,按照光标当前位置来进行光标的移动,不可等于或大于表最的大行数,不然报错 # print(cursor.fetchone()) # 打印出一条,如果没有数据会返回None
# print(cursor.fetchmany(4)) # 打印出多条数据,默认一条,里面的个数多余实际个数不会报错,只会全部打印出来,没有返回一个空元组或者空列表
# print(cursor.fetchall()) # 打印出所有的数据,打印多余的数据,没用数据返回一个空元组或者空列表
cursor.close() #关闭游标
conn.close() #关闭连接
增删改查操作
import pymysql

conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='222',
database='day43',
charset='utf8'
)
cursor = conn.cursor()
sql = 'insert into t1 values(3,"xx3",18);' ret = cursor.execute(sql) print(ret) # 增删改都必须进行提交操作(commit)
conn.commit()
cursor.close() #关闭游标
conn.close() #关闭连接
sql注入
import pymysql

conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='222',
database='day43',
charset='utf8'
) while 1:
cursor = conn.cursor(pymysql.cursors.DictCursor)
username = input('请输入用户名:')
password = input('请输入密码:') # sql注入问题
# sql = f"select * from t1 where name='{username}' and age='{password}';" # xx3 '-- :xx3(必须是表里的数据)、'(和前面的'号对应使 (-- )在''号外面注释后面的语句)
# sql = f"select * from t1 where name='xx3 '-- ' and age='{password}';" # asdasd' or 1=1 -- :(asdasd)可以不是表里的数据、(or 1=1 -- )or 1=1使mysql以为查到了数据然后再进行注释后面的语句
# sql = f"select * from t1 where name='asdasd' or 1=1 -- ' and age='{password}';" # 解决方法:
sql = "select * from t1 where name=%s and age=%s;"
ret = cursor.execute(sql, [username, password])
if ret:
print('登录成功!')
else:
print('账号或者密码错误,请重新输入!')
cursor.close() #关闭游标
conn.close() #关闭连接

day43——多表查询、Navicat工具的使用、pymysql模块的更多相关文章

  1. day43 多表查询和pymysql

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

  2. day03 mysql外键 表的三种关系 单表查询 navicat

    day03 mysql navicat   一.完整性约束之     外键 foreign key     一个表(关联表: 是从表)设置了外键字段的值, 对应的是另一个表的一条记录(被关联表: 是主 ...

  3. MySQL多表查询,Navicat使用,pymysql模块,sql注入问题

    一.多表查询 #建表 create table dep( id int, name varchar(20) ); create table emp( id int primary key auto_i ...

  4. Navicat的安装和pymysql模块的使用

    内容回顾 select distinct 字段1,字段2,... from 表名 where 分组之前的过滤条件 group by 分组条件 having 分组之后过滤条件 order by 排序字段 ...

  5. 多表查询、可视化工具、pymysql模块

    create table dep( id int primary key auto_increment, name varchar(16), work varchar(16) ); create ta ...

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

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

  7. 不使用left-join等多表关联查询,只用单表查询和Java程序,简便实现“多表查询”效果

    上次我们提到,不使用left-loin关联查询,可能是为了提高效率或者配置缓存,也可以简化一下sql语句的编写.只写单表查询,sql真得太简单了.问题是,查询多个表的数据还是非常需要的. 因此,存在这 ...

  8. Navicat,SQL注入,pymysql模块

    # 关键字exists(了解) 只返回布尔值 True False 返回True的时候外层查询语句执行 返回False的时候外层查询语句不再执行 select * from emp where exi ...

  9. 数据库 --- 4 多表查询 ,Navicat工具 , pymysql模块

    一.多表查询 1.笛卡儿积 查询 2.连接 语法: ①inner    显示可构成连接的数据 mysql> select employee.id,employee.name,department ...

随机推荐

  1. codevs 1814 最长链题解

    codevs 1814 最长链题解 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. 输入描述 Input Descripti ...

  2. linux命令之------Chmod命令

    Chmod命令 1)作用:linux和unix的文件调用权限分为三级:文件拥有者/群组/其他.利用chmod可以控制文件如何被他人所调用.(主要就是修改文件夹,文件的权限) 2)U表示该文件的拥有者, ...

  3. GoCN每日新闻(2019-10-20)

    GoCN每日新闻(2019-10-20) slakc是如何构建共享频道的 https://slack.engineering/how-slack-built-shared-channels-8d42c ...

  4. P1270 “访问”美术馆——不太一样的树形DP

    P1270 “访问”美术馆 dfs读入,存图有点像线段树: 在枚举时间时,要减去走这条边的代价: #include<cstdio> #include<cstring> #inc ...

  5. git下载指定分支到本地

    从网上查了很多方法有很多种,自我感觉下面这种更方便 git clone xxx.git --branch 分支名/dev/...

  6. #C++初学记录(STL容器以及迭代器)

    STL初步 提交ACM会TLE /仅以学习STL与迭代器使用 C. Cards Sorting time limit per test1 second memory limit per test256 ...

  7. docker容器启动后添加端口映射

    DOCKER 给运行中的容器添加映射端口 方法1 1.获得容器IP 将container_name 换成实际环境中的容器名 docker inspect `container_name` | grep ...

  8. Fabric.js canvas 图形库

    1.github地址: https://github.com/fabricjs/fabric.js 2.简述 Fabric.js将canvas的编程变得简单.同时在canvas上添加了交互.交互包括: ...

  9. jmeter 内存溢出原因及解决方法

    jmeter是一个java开发的开源性能测试工具,在性能测试中可支持模拟并发压测,但有时候当模拟并发请求较大或者脚本运行时间较长时,压力机会出现卡顿甚至报异常————内存溢出, 这里就介绍下如何解决内 ...

  10. java正则表达式备忘

    最近框架和爬虫上常要处理字符串匹配和替换的场景,备忘. 非贪婪模式 比如要匹配html文本中的连接,例如a href="www.abc.com/xyz/o"需要替换为a href= ...