Day42

今日內容:mysql

  1.子查詢補充正則表達式

  2.正則表達式sql

  3.pymysql數據庫

1、子查詢補充

什麼是子查詢?服務器

    將上一次查詢的結果做爲下一次查詢的條件或原數據fetch

    又稱爲內查詢編碼

    做用:當你的需求,一次查詢沒法知足的時候(也就是一次select找不到你要的數據)es5

    注:子查詢能實現的效果,多表聯查也能夠是實現spa

實例演示:3d

準備數據

員工表:
create table emp (id int,name char(10),sex char,age int,dept_id int,job char(10),salary double);
insert into emp values
(1,"劉備","",26,1,"總監",5800),
(2,"張飛","",24,1,"員工",3000),
(3,"關羽","",30,1,"員工",4000),
(4,"孫權","",25,2,"總監",6000),
(10,"劉備2","",26,2,"總監",5800),
(5,"周瑜","",22,2,"員工",5000),
(6,"小喬","",31,2,"員工",4000),
(7,"曹操","",19,3,"總監",10000),
(8,"司馬懿","",24,3,"員工",6000);
 
部門表:
create table dept(id int primary key,name char(10));
insert into dept values(1,"市場"),(2,"行政"),(3,"財務");

問1:財務部有哪些人?

  第一步咱們須要直到財務部的id

  select id from dept where name ="財務";

第二步咱們用查詢到的id做爲判斷條件來查詢emp實現效果(用關鍵字in來實現子查詢)

問2查詢平均年齡大於25的部門名稱

  第一步先求出每一個部門的平均年齡

  select dept_id from emp group by dept_id having avg(age)>25;

第二步經過獲得的部門id去部門表中查詢

exists關鍵字子查詢

  exists 後跟子查詢 子查詢有結果爲True ,沒有結果爲False(爲True時外層執行,爲False外層不執行)

  select *from emp where exists (select *from emp where salary > 1000);

注:子查詢的語法特色:一個select  a  中 包含另一個select  b(b只能位於a的where後面)

2、正則表達式

正則表達式用於模糊查詢,模糊查詢已經講過了

  like 僅支持 % 和 _遠沒有正則表達式靈活

  固然絕大多數狀況下 like足夠使用

  語法:select *from table where name regexp "正則表達式";

實例示範:

  select * from emp where name regexp "^劉";

select * from emp where name regexp "司+";

select * from emp where name regexp "備$";

3、pymysql模塊

1.連接.執行sql,關閉(遊標)

# 建立連接獲得一個連接對象
conn = pymysql.Connect(
    host="127.0.0.1",  # 數據庫服務器主機地址
    user="root",  # 用戶名
    password="admin",  # 密碼
    database="day42",  # 數據庫名稱
    port=3306,  # 端口號 可選 整型
    charset="utf8"  # 編碼  可選
)
# 獲取遊標對象  pymysql.cursors.DictCursor指定 返回的結果類型 爲字典  默認是元祖類型
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 查詢數據
sql = "select *from emp"

# 執行sql  若是是select 語句返回的是查詢成功的記錄數目
res = cursor.execute(sql)
print(res)

# 關閉連接
cursor.close()
conn.close()

2.execute()之sql注入

  注意:符號"--"會註釋掉它以後的sql,正確的語法:"--"後至少有一個任意字符

  根本原理:就根據程序的字符串拼接name='%s',輸入一個xxx'-- haha,用輸入的xxx加'在程序中拼接成一個判斷條件name='xxx' -- haha'

最後那一個空格,在一條sql語句中若是遇到select * from t1 where id > 3 -- and name='egon';則--以後的條件被註釋掉了

#一、sql注入之:用戶存在,繞過密碼
egon' -- 任意字符

#二、sql注入之:用戶不存在,繞過用戶與密碼
xxx' or 1=1 -- 任意字

解決方法:

# 原來是咱們對sql進行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)

#改寫爲(execute幫咱們作字符串拼接,咱們無需且必定不能再爲%s加引號了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s須要去掉引號,由於pymysql會自動爲咱們加上
res=cursor.execute(sql,[user,pwd]) #pymysql模塊自動幫咱們解決sql注入的問題,只要咱們按照pymysql的規矩來。

3.增.刪.改:conn.commit()

import pymysql
#連接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
#遊標
cursor=conn.cursor()

#執行sql語句
#part1
# sql='insert into userinfo(name,password) values("root","123456");'
# res=cursor.execute(sql) #執行sql語句,返回sql影響成功的行數
# print(res)

#part2
# sql='insert into userinfo(name,password) values(%s,%s);'
# res=cursor.execute(sql,("root","123456")) #執行sql語句,返回sql影響成功的行數
# print(res)

#part3
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #執行sql語句,返回sql影響成功的行數
print(res)

conn.commit() #提交後才發現表中插入記錄成功
cursor.close()
conn.close()

4.查:fetchone,fetchmany,fetchall

import pymysql
#連接
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
#遊標
cursor=conn.cursor()

#執行sql語句
sql='select * from userinfo;'
rows=cursor.execute(sql) #執行sql語句,返回sql影響成功的行數rows,將結果放入一個集合,等待被查詢

# cursor.scroll(3,mode='absolute') # 相對絕對位置移動
# cursor.scroll(3,mode='relative') # 相對當前位置移動
res1=cursor.fetchone()
res2=cursor.fetchone()
res3=cursor.fetchone()
res4=cursor.fetchmany(2)
res5=cursor.fetchall()
print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
print('%s rows in set (0.00 sec)' %rows)



conn.commit() #提交後才發現表中插入記錄成功
cursor.close()
conn.close()

'''
(1, 'root', '123456')
(2, 'root', '123456')
(3, 'root', '123456')
((4, 'root', '123456'), (5, 'root', '123456'))
((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))
rows in set (0.00 sec)
'''
相關文章
相關標籤/搜索