多表查询 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()
posted @ 2019-11-26 17:30  边城bei  阅读(252)  评论(0编辑  收藏  举报