一 多表查找方法

 1 交叉连接:不使用任何的判断条件,生成笛卡尔积。第一个表的行数乘以第二个表的行数就等于笛卡尔积结果集的行数。

mysql> select * from student,class;
+-----+--------+--------+----------+-----+----------+
| sid | sname | gender | class_id | cid | caption |
+-----+--------+--------+----------+-----+----------+
| 1 | 钢蛋 | 女 | 1 | 2 | 一年三班 |
| 1 | 钢蛋 | 女 | 1 | 3 | 三年一班 |
| 1 | 钢蛋 | 女 | 1 | 1 | 三年二班 |
| 2 | 铁锤 | 女 | 1 | 2 | 一年三班 |
| 2 | 铁锤 | 女 | 1 | 3 | 三年一班 |
| 2 | 铁锤 | 女 | 1 | 1 | 三年二班 |
| 3 | 山炮 | 男 | 2 | 2 | 一年三班 |
| 3 | 山炮 | 男 | 2 | 3 | 三年一班 |
| 3 | 山炮 | 男 | 2 | 1 | 三年二班 |
| 4 | 方合意 | 男 | 4 | 2 | 一年三班 |
| 4 | 方合意 | 男 | 4 | 3 | 三年一班 |
| 4 | 方合意 | 男 | 4 | 1 | 三年二班 |
+-----+--------+--------+----------+-----+----------+
12 rows in set (0.83 sec)

 2 笛卡儿积的目的:在笛卡尔积表中,根据判断条件找到相应的记录,只筛选两张表的相同部分,这也就是内链接的原理

mysql> select * from student,class where student.class_id=class.cid;
+-----+-------+--------+----------+-----+----------+
| sid | sname | gender | class_id | cid | caption |
+-----+-------+--------+----------+-----+----------+
| 1 | 钢蛋 | 女 | 1 | 1 | 三年二班 |
| 2 | 铁锤 | 女 | 1 | 1 | 三年二班 |
| 3 | 山炮 | 男 | 2 | 2 | 一年三班 |
+-----+-------+--------+----------+-----+----------+
3 rows in set (0.43 sec)

 3 内链接:inner join :取出两张表相对应的记录。

mysql> select * from student INNER JOIN class on student.class_id=class.cid;
+-----+-------+--------+----------+-----+----------+
| sid | sname | gender | class_id | cid | caption |
+-----+-------+--------+----------+-----+----------+
| 1 | 钢蛋 | 女 | 1 | 1 | 三年二班 |
| 2 | 铁锤 | 女 | 1 | 1 | 三年二班 |
| 3 | 山炮 | 男 | 2 | 2 | 一年三班 |
+-----+-------+--------+----------+-----+----------+
3 rows in set (0.00 sec)

 4 左连接: left join  :在内链接的基础上保留左边表的所有记录。如果左边中的某些记录右表中没有,则结果对应右表的字段就是null。

mysql> select * from student LEFT JOIN class on student.class_id=class.cid;
+-----+--------+--------+----------+------+----------+
| sid | sname | gender | class_id | cid | caption |
+-----+--------+--------+----------+------+----------+
| 1 | 钢蛋 | 女 | 1 | 1 | 三年二班 |
| 2 | 铁锤 | 女 | 1 | 1 | 三年二班 |
| 3 | 山炮 | 男 | 2 | 2 | 一年三班 |
| 4 | 方合意 | 男 | 4 | NULL | NULL |
+-----+--------+--------+----------+------+----------+
4 rows in set (0.00 sec)

 5 右连接: right join  :在内连接的基础上保留右边表的所有记录。如果右表中的某些记录左表中没有,则结果对应左表的字段就为null。

mysql> select * from student right join class on student.class_id=class.cid;
+------+-------+--------+----------+-----+----------+
| sid | sname | gender | class_id | cid | caption |
+------+-------+--------+----------+-----+----------+
| 1 | 钢蛋 | 女 | 1 | 1 | 三年二班 |
| 2 | 铁锤 | 女 | 1 | 1 | 三年二班 |
| 3 | 山炮 | 男 | 2 | 2 | 一年三班 |
| NULL | NULL | NULL | NULL | 3 | 三年一班 |
+------+-------+--------+----------+-----+----------+
4 rows in set (0.00 sec)

 6 全外连接: 需要借助于union,将左连接和右连接得到的虚拟表去掉重复的记录。如果左表表的某些记录右边表中没有,则结果对应右表的字段就是null;如果右表中的某些记录左表中没有,则结果对应左表的字段就为null。

mysql> select * from student left join class on student.class_id=class.cid
-> union select * from student right join class on student.class_id=class.cid;
+------+--------+--------+----------+------+----------+
| sid | sname | gender | class_id | cid | caption |
+------+--------+--------+----------+------+----------+
| 1 | 钢蛋 | 女 | 1 | 1 | 三年二班 |
| 2 | 铁锤 | 女 | 1 | 1 | 三年二班 |
| 3 | 山炮 | 男 | 2 | 2 | 一年三班 |
| 4 | 方合意 | 男 | 4 | NULL | NULL |
| NULL | NULL | NULL | NULL | 3 | 三年一班 |
+------+--------+--------+----------+------+----------+
5 rows in set (0.07 sec)

  on 过滤条件:用于join的连接语句后面,用于两张表中,判断两张表连接的字段是否相对应,并且过滤掉不符合条件的记录。

 执行顺序:先找到两张表,生成第一张虚拟表——-》再根据on后面的判断条件得到连接的结果生成第二张虚拟表——》再根据连接的条件得到第三张虚拟表——》where——》group by——》having——》select——》distinct——》order by——》limit。

多表查询就是:也叫做连接查询。首先将多个表链接成一个虚拟表让后在进行查询。

二 子查询方法

 子查询:将一个查询语句嵌套到另一个查询的语句中。

    内层查询语句可以作为外层查询语句的查询条件。

    子查询中剋有包含单表查询的任何关键字。还可以使用运算符号。

mysql> select sid,sname from student where class_id in (select cid from class where caption='三年二班');
+-----+-------+
| sid | sname |
+-----+-------+
| 1 | 钢蛋 |
| 2 | 铁锤 |
+-----+-------+
2 rows in set (0.00 sec)

 exists:存在,判断条件成不成立或者某个字段存不存在。当结果为True,外层的查询语句才会执行,当结果为False,外层的查询语句就不会执行。

mysql> select * from student where exists (select cid from class where caption='三年二班');
+-----+--------+--------+----------+
| sid | sname | gender | class_id |
+-----+--------+--------+----------+
| 1 | 钢蛋 | 女 | 1 |
| 2 | 铁锤 | 女 | 1 |
| 3 | 山炮 | 男 | 2 |
| 4 | 方合意 | 男 | 4 |
+-----+--------+--------+----------+
4 rows in set (0.02 sec)

  source 路径:加上该文件路径,执行该文件里面的命令。

三 pymysql模块

 安装模块:pip3 install pymysql

 pymysql模块,连接MySQL数据库的服务端。

  基本格式:

   conn=pymysql.connect(                                                              发起连接

      host=ip地址,

      port=端口,

      user=用户名,

      password=密码,

      database=库名,

      charset=字符编码

)

 cur=conn.cursor()    :拿到游标

  什么是游标:是系统为用户开设的一个数据缓冲区,存放sql语句执行结果的地方,每一个游标区都有一个名字,用户可以用sql语句逐一从游标中获取记录,并赋值给主变量,叫给主变量进一步的处理

      游标详情:http://blog.csdn.net/dreamllover/article/details/51523887

 execute:插入,一次只能插入一条记录。查看是只能显示几条数据,不能具体的查看到某条数据的信息。

 executemeny:插入,一次可以插入多条记录。

  fetchone:一次只能拿到一个记录

  fetchall:一次可以拿到多条记录,只能拿取一次

  fetchemany:一次可以拿到多条记录,里面需要传入一个数字,这个数字就是控制执行后拿几条数据。

 登陆:输入用户名和密码,然后将用户名和密码发送到服务端进行判断。

# import pymysql
#
#
# #发起连接
# conn=pymysql.connect(
# host='127.0.0.1',
# port=3306,
# user='root',
# password='',
# database='day45',
# charset='utf8'
# )
#
# cur=conn.cursor() #拿到游标
#
# # 增,删,改
# # insert_sql='insert into userinfo(user,password) values("%s","%s");' %('yh','123')
# # print(insert_sql)
# # cur.execute(insert_sql)
#
#
# # insert_sql='insert into userinfo(user,password) values(%s,%s);'
# # cur.execute(insert_sql,('evia1','1234'))
# # cur.executemany(insert_sql,[('evia2','1234'),('evia3','1234'),('evia4','1234')])
#
#
#
# #查
# # rows=cur.execute('select * from userinfo where 1 = 2;')
# rows=cur.execute('select * from userinfo;')
# print(rows)
#
# print(cur.fetchone())
# print(cur.fetchone())
# print(cur.fetchmany(2))
# print(cur.fetchall())
# # print(cur.fetchall())
#
#
# conn.commit()
# cur.close()
# conn.close() import pymysql name=input('user:>> ').strip()
pwd=input('pwd:>> ').strip() #发起连接
conn=pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='',
database='day45',
charset='utf8'
) cur=conn.cursor() #拿到游标
#查
sql='select id from userinfo where user=%s and password=%s;' rows=cur.execute(sql,(name,pwd))
print(rows) conn.commit()
cur.close()
conn.close() if rows:
print('登录成功')
else:
print('登录失败')

--在MySQL中是注释的意思。

 生么叫做sql注入:就是在输入一些特殊的符号或者是输入条件成立了的sql语句,就会直接攻陷我的账号。这样别人就可以直接拿走我的数据。

  解决方法:就是禁止别人输入一些特殊的符号后者无关的sql约束条件。

 pymysql自动将影响mysql语句的符号或者命令检测出来,做以判断。

cursor:以什么格式传入,也就是以什么格式拿到了光标。

 cursor=pymysql.cursors.DictCursor:传入cursor里面的参数。

 scroll:移动光标,哎他前面还有一个整数参数,具体移动几个位置。

  mode='absolate':绝对位置,从第一个位置开始移动光标。

  mode='relative':相对位置,就是从当前位置开始移动光标。

 lastrowid:查看当前表走到哪一条记录。也就是查看有几条记录。

 

import pymysql

conn=pymysql.connect(
host='localhost',
port=3306,
user='root',
password='0410',
database='day46',
charset='utf8'
) # cur=conn.cursor() # sql='select * from userinfo;'
# res=cur.execute(sql)
# print(res) # 直接打印只显示获取道的记录条数 # print(cur.fetchone()) #一次只读取一条数据
# print(cur.fetchall()) # 读取没有读取所有的数据
# print(cur.fetchmany(2)) #自定义读取 几条数据 # cur.scroll(2,mode='absolute') #绝对位置的移动光标
# print(cur.fetchone())
#
# cur.scroll(-1,mode='relative') #相对位置的移动光标,还可以倒着移动。
# print(cur.fetchone())
# cur=conn.cursor(cursor=pymysql.cursors.DictCursor)
cur.execute('insert into userinfo(user,passwd) values ("yan","1314")')
print(cur.lastrowid) # 查看当前表走到了哪一条记录。 conn.commit()
cur.close()
conn.close()

fetch数据类型

 import pymysql

3.1  创建链接

 conn=pymysql.connect(hodt='127.0.0.1',port=3306,user='root',passwd='123',db='t1')

 3.2 创建游标 ,游标设置为字典类型

 cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)

 r=cursor.execute('call p1()')

 3.3 获取数据

 result=cursor.fetchone()

 3.4 提交

 conn.commit()

 3.5 关闭游标

 cursor.close()

 3.6 关闭链接

 conn.close()

 

mysql之多表查询和pymysql模块的更多相关文章

  1. Mysql基础(五):多表查询、pymysql模块

    目录 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 2. 连表查询 3. 子查询 4. pymysql模块 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 将两表所有的数据一 ...

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

    数据库04 /多表查询.pymysql模块 目录 数据库04 /多表查询.pymysql模块 1. 笛卡尔积 2. 连表查询 2.1 inner join 内连接 2.2 left join 左连接 ...

  3. MySQL多表查询,pymysql模块。

    一 多表查询: 首先什么是多表查询: 我们在实际工作中,不可能把数据都存入一个表中,那么又需要这些表之间有一定的关联,因为表与表之间的数据是相关联的,所以就要用到我们的外键将多表连接到一起,那么我们更 ...

  4. Mysql数据多表查询及pymysql的使用

    Exists关键字表示存在,在使用exists关键字时,内增查询语句不返回查询记录,而是返回一个真假值,True或者False,返回True外层语句才会进行查询:返回False时,外层查询语句不会进行 ...

  5. Vc数据库编程基础MySql数据库的表查询功能

    Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...

  6. MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习

    MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...

  7. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  8. day15(mysql 的多表查询,事务)

    mysql之多表查询 1.合并结果集 作用:合并结果集就是把两个select语句查询的结果连接到一起! /*创建表t1*/ CREATE TABLE t1( a INT PRIMARY KEY , b ...

  9. mysql数据库优化课程---11、mysql普通多表查询

    mysql数据库优化课程---11.mysql普通多表查询 一.总结 一句话总结:select user.username,user.age,class.name,class.ctime from u ...

随机推荐

  1. c++ STL模板(一)

    一.sort函数 1.头文件:#include < algorithm>: 2.它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n): 3.Sort函数有三个参数:(第三个参 ...

  2. centos 配置Openssl并创建证书

    具体详情参考:http://wiki.centos.org/HowTos/Https 一.安装软件 yum install mod_ssl openssl 二.创建证书: # Generate pri ...

  3. WAS 添加数据源

    一.创建安全性别名认证 1.资源-全局安全性-JAVA认证和授权服务-J2C认证数据 2.新建 3.输入别名,这里后面加IP末尾.输入用户名.密码. 4.点击确定.保存. 二.创建数据源连接配置 1. ...

  4. 【zipkin】链路追踪

    1,安装zipkin:https://zipkin.io/pages/quickstart.html 推荐使用docker去安装zipkin服务,下载安装执行都有了.缺点是下载要等待一段时间 2,使用 ...

  5. TZOJ 2018 SPF(连通图割点和分成的连通块)

    描述 Consider the two networks shown below. Assuming that data moves around these networks only betwee ...

  6. web项目no such method exception

    昨天更新包后出现这个异常,经过仔细全面排查,项目源码是没问题的. 怀疑jvm被重写了,肉眼也没找到证据.怀疑是操作系统问题,这个也不会没办法排查 于是给客户重新发了个war包,客户运行后出现 异常: ...

  7. 随机数、方法重载和System.out.println()的理解

    1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机数. package testradom; public class testradom { public static void m ...

  8. 小程序 picker 多列选择器 数据动态获取

    需求是将各校区对应各班级的数据 以两列选择器的方式展示出来,并且可以在选择完成之后记录选结果参数. 校区数据 和 班级数据 分别是两个接口,以 校区 teach_area_id 字段关联 其各班级数据 ...

  9. make ;makefile; cmake; qmake的区分

    1. make 是用来执行Makefile的.2. Makefile是类unix环境下(比如Linux)的类似于批处理的"脚本"文件.其基本语法是: 目标+依赖+命令,只有在目标文 ...

  10. go语言使用go-sciter创建桌面应用(四) 固定窗口大小

    有些时候我们需要创建的应用窗口大小不可改变. demo5.go代码如下: package main; import ( "github.com/sciter-sdk/go-sciter/wi ...