Python之旅.第十章.mysql.
一、 上節課復習
select concat_ws(":",name,age,sex,post) as info from emp; # egon:male:18
二、 子查詢(一個問題一個問題解決)
把一個查詢語句用括號括起來,當做另外一條查詢語句的條件去用,稱為子查詢
select name from emp where dep_id = (select id from dep where name="技術"); #子查詢
select emp.name from emp inner join dep on emp.dep_id = dep.id where dep.name="技術"; #鏈表
#查詢平均年齡在25歲以上的部門名
select name from dep where id in (select dep_id from emp group by dep_id having avg(age) > 25); #子查詢
select dep.name from emp inner join dep on emp.dep_id = dep.id group by dep.name having avg(age) > 25; #鏈表
#查看不足2人的部門名(子查詢得到的是有人的部門id)
select * from emp where exists (select id from dep where id > 3); #exists用法,當()返回True時,外層查詢語句將進行查詢;當返回值為False時,外層查詢語句不進行查詢(empty set)
#查詢每個部門最新入職的那位員工
select t1.id,t1.name,t1.post,t1.hire_date,t2.post,t2.max_date from emp as t1 inner join (select post,max(hire_date) as max_date from emp group by post) as t2 on t1.post = t2.post where t1.hire_date = t2.max_date;
三、 IDE工具(navicat)介紹
1、 ER圖表(Entity-Relationship)
2、 模型;導出sql
3、 查詢; 格式美化sql
四、 pymysql模塊(安裝與查詢)
1、安裝pymysql(python專用的mysql客戶端套接字)
pip3 install pymysql
2、mysql 查詢
import pymysql
conn=pymysql.connect(
host=‘127.0.0.1‘,
port=3306,
user=‘root‘,
password=‘jxtz0927‘,
database=‘db40‘,
charset=‘utf8‘ #防止亂碼
)
cursor=conn.cursor(pymysql.cursors.DictCursor) #將產生的結果以字典的形式顯示 [{‘Tables_in_db40‘: ‘department‘}, {‘Tables_in_db40‘: ‘employee‘}]
# cursor=conn.cursor() # ((‘department‘,), (‘employee‘,))
# rows=cursor.execute(‘show tables;‘) #rows 為受影響的行數
rows=cursor.execute(‘select * from class;‘)
print(rows) #2
print(cursor.fetchone()) #一條
print(cursor.fetchmany(2)) #幾條
print(cursor.fetchall()) #全部
cursor.scroll(3,‘absolute‘) #mode=‘absolute‘,絕對模式,從最開始位置向後移三條
cursor.scroll(1,‘relative‘) #mode=‘relative‘,相對模式,從當前位置向後移一條
cursor.close()
conn.close()
五、 pymysql模塊(防止sql註入問題)
1、錯誤做法, 自行對字符串進行拼接,引發sql註入問題 (name= egon‘ --asdfg; name=xxxx‘or 1=1--asdfg)
import pymysql
conn=pymysql.connect(
host=‘127.0.0.1‘,
port=3306,
user=‘root‘,
password=‘123‘,
database=‘db42‘,
charset=‘utf8‘
)
cursor=conn.cursor(pymysql.cursors.DictCursor)
inp_user=input(‘用戶名>>:‘).strip() #inp_user=""
inp_pwd=input(‘密碼>>:‘).strip() #inp_pwd=""
sql="select * from user where username=‘%s‘ and password=‘%s‘" %(inp_user,inp_pwd) #自行拼接,引發sql註入問題
print(sql)
rows=cursor.execute(sql)
if rows:
print(‘登錄成功‘)
else:
print(‘登錄失敗‘)
cursor.close()
conn.close()
2、在服務端防止sql註入問題:不要自己拼接字符串,讓pymysql模塊去拼接
import pymysql
conn=pymysql.connect(
host=‘127.0.0.1‘,
port=3306,
user=‘root‘,
password=‘123‘,
database=‘db42‘,
charset=‘utf8‘
)
cursor=conn.cursor(pymysql.cursors.DictCursor)
inp_user=input(‘用戶名>>:‘).strip() #inp_user=""
inp_pwd=input(‘密碼>>:‘).strip() #inp_pwd=""
sql="select * from user where username=%s and password=%s"
print(sql)
rows=cursor.execute(sql,(inp_user,inp_pwd))
if rows:
print(‘登錄成功‘)
else:
print(‘登錄失敗‘)
cursor.close()
conn.close()
六、 pymysql模塊(增刪改)
import pymysql
conn=pymysql.connect(
host=‘127.0.0.1‘,
port=3306,
user=‘root‘,
password=‘123‘,
database=‘db42‘,
charset=‘utf8‘
)
cursor=conn.cursor(pymysql.cursors.DictCursor)
sql=‘update user set username="alexSB" where id=2‘
rows=cursor.execute(sql) #改數據
print(rows)
print(cursor.lastrowid)
sql=‘insert into user(username,password) values(%s,%s)‘
rows=cursor.executemany(sql,[(‘lwz‘,‘123‘),(‘evia‘,‘455‘),(‘lsd‘,‘333‘)]) #一次插入多行記錄
print(rows)
print(cursor.lastrowid) #顯示插到哪行了(id)
conn.commit() # 只有commit提交才會完成真正的修改
cursor.close()
conn.close()
Python之旅.第十章.mysql.