多表查询 Naricat pymysql
多表查询
笛卡尔积
select * from 表名1,表名2
# 将两表所有的数据一一对应, 生成一张大表
select * from 表名1, 表名2 where 表名1.字段=表名2.字段
# 多表关联 找到对应关系
select * from 表名1, 表名2 where 表名1.字段=表名2.字段 and 表名.字段条件
# 过滤 限定条件
连表查询
内连接
inner join
select * from 表名1 inner join 表名2 on 表名1.字段 = 表名2.字段
# 连表, 自动过滤无关联数据, 只显示有对应关系的数据
select * from 表名1 inner join 表名2 on 表名1.字段 = 表名2.字段 where 条件sql句
# 筛选, 条件sql句筛选数据范围
select 表名.字段 from 表名1 inner join 表名2 on 表名1.字段 = 表名2.字段 where 条件sql句
# 找对应字段, 将 * 换成具体对应的字段
左连接
left join
基本同内连接用法一样, 但是以左表为主表, 右表为副表, 左表字段必须全部显示, 即使右表无对应字段也要以null补全
右连接
right join
同左连接, 但是相反
全连接
union
同左右连接一样, 并且两边的无对应字段都以null补全
左连接语句 union 右连接语句
子查询
select 字段(*) from 表名1 where 条件sql语句 = (select 字段(*) from 表名2 where 条件)
# 一个查询结果, 作为另一个查询的查询条件
select 字段(*) from 表名1 where 条件sql语句 in (select 字段(*) from 表名2 where 条件 or 条件)
# 关键字 in, 查询多个条件时, 用 in 替换 = 号
select 字段(*) from 表名1 where exits (select * from 表名2)
# 关键字 exits, 判断exits后是否有返回值, 如果有执行where前的查询语句, 如果没有不执行
Naricat
掌握:
#1. 测试+链接数据库
#2. 新建库
#3. 新建表,新增字段+类型+约束
#4. 设计表:外键
#5. 新建查询
#6. 备份库/表
#注意:
批量加注释:ctrl+?键
批量去注释:ctrl+shift+?键
pymysql
pymysql 是用来在python程序中操作mysql, 本质上是一个socket(套接字)客户端
import pymysql
# user = input('用户名:').strip()
# pwd = input('密码:').strip()
conn = pymysql.connect(host='localhost',
port=3306,
user='root',
password='123',
database='test',
charset='utf8')
# cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 读取出来的是字典
cursor = conn.cursor()
# 读取出来是元组
sql = 'select * from t1'
res = cursor.execute(sql)
print(res)
# res 返回的是影响表记录的数量
# if res:
# print("登录成功")
# else:
# print("登录失败")
one_data = cursor.fetchone()
# 取一条数据
cursor.scroll(2,'absolute')
# 绝对移动 从初始位置向后移动一行
many_data = cursor.fetchmany(2)
# 取两条数据
cursor.scroll(1,'relative')
# 相对移动 从上一次取的数据后, 向后移动1行
all_data = cursor.fetchall()
# 取全部数据
print(one_data)
print(many_data)
print(all_data)
# cursor.close() #关闭游标
# conn.close() #关闭连接
execute()
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123',
database='database',
charset='utf8'
)
cursor = conn.cursor()
uname = input('请输入用户名:')
pword = input('请输入密码:')
sql = "select * from userinfo where username='%s' and password='%s';"%(uname,pword)
res = cursor.execute(sql,[uname,pword]) #res我们说是得到的行数,如果这个行数不为零,说明用户输入的用户名和密码存在,如果为0说名存在
print(res) #如果输入的用户名和密码错误,这个结果为0,如果正确,这个结果为1
if res:
print('登陆成功')
else:
print('用户名和密码错误!')
增删改
import pymysql
#链接
conn=pymysql.connect(host='localhost',port='3306',user='root',password='123',database='crm',charset='utf8')
#游标
cursor=conn.cursor()
#执行sql语句
#part1
# sql='insert into userinfo(name,password) values("root","123456");'
# res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
# print(res)
# print(cursor.lastrowid) #返回的是你插入的这条记录是到了第几条了
#part2
# sql='insert into userinfo(name,password) values(%s,%s);'
# res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
# print(res)
#还可以进行更改操作:
#res=cursor.excute("update userinfo set username='taibaisb' where id=2")
#print(res) #结果为1
#part3
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #执行sql语句,返回sql影响成功的行数,一次插多条记录
print(res)
#上面的几步,虽然都有返回结果,也就是那个受影响的函数res,但是你去数据库里面一看,并没有保存到数据库里面,
conn.commit() #必须执行conn.commit,注意是conn,不是cursor,执行这句提交后才发现表中插入记录成功,没有这句,上面的这几步操作其实都没有成功保存。
cursor.close()
conn.close()