SQL文、pymysqlモジュール、SQLインジェクションの問題

SQLクエリ文の最初に、フルバージョン

select 
    distinct post,avg(salary) 
from 
    table 
where 
    id > 1 
group by
    post`
having 
    avg(salary)>100
order by 
    avg(salary)
limit 5,5

グループ:あなたは追加のメソッドを取得することで間接的にのみ、追加の情報フィールドを取得したい場合は、グループ化した後、グループ化が最小の単位に基づいているが、もはや、他のフィールドに直接情報を得ることはできません、上記の状況があれば、厳密モードを設定する必要があります全体のSQL文は、デフォルトでは何のグループを持たないグループ全体です。

第二に、集約関数

  • 最大
  • 私に
  • 平均
  • カウント

PS:唯一のパケットの後、重合性機能

三、はっきりと限界

データ重複除外を満たさなければならない明確な(デエンファシス)は、主キーのフィールドに含まれるデータをチェックアウトする場合、重量の効果を達成するためには、成功を再することは不可能である、まったく同じケースです。

リミット5、最初のショー5から出発して、唯一つのパラメータを書きます

5,5を制限する; 5を示し、文書Vを除く、第から出発

PS:MySQLは大文字と小文字を区別しません

第四に、ファジー・マッチング、および正規表現の一致

1、ファジーマッチ

  • %:任意の数の文字

  • _:任意の1文字

2、正規表現

どこ名正規表現 "^ J *(N | Y)。$"

jで始まる表し、nはエンドまたはy、中間は任意の文字です

それは、改行以外の任意の文字に一致することを示し

*無限大にoを示します

+無限に1を表し

0または1

^それはで始まるん何

どのような終わり$エクスプレス

reモジュールを想起

findAll:パケットの優先度、括弧は通常の優先順位のリターンにマッチします

マッチ:スクラッチ試合、復帰への一致

検索:全試合、マッチが返されます

RES =マッチ( '^ jは*(nは|。Y)$'、 'ジェイソン')

印刷(res.group())

五、連結とCONCAT_WS

連結およびCONCAT_WSのパケットの前に

  • 連結文字列の連結のための(名前、 ':'、年齢、 ''、給与)

  • CONCAT_WS(「:」、名前、年齢、給与が)上記の結果と一致しています

この方法は、文字列に似て参加しますが、差別化:参加方法は、文字列のみの間で使用することができます。

':'。参加([ '1'、2、3 ''])与えられる、ため数であります

六、存在

キーワードは、そこに存在することを示すキーワードの使用に存在し、内側のクエリはチェックしますが、TrueまたはFalse真または偽の値を返すレコードを返しません。

trueを返した場合、外側のクエリは、クエリを実行します

偽のではなく、外側のクエリのクエリを返すとき

select * from emp where exists (select id from dep where id>203);

七、pymysqlモジュール

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    passwoord='123',
    database='day38',
    charset='utf8'  # 不能加—
)
cursor=conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象,以字典的形式返回查询结果
sql = 'select * from teacher'
res = cursor.execute(sql)  # 执行传入的sql语句
print(res)  # res是执行语句返回的数据条数
print(cursor.fetchone())  # 只获取一条数据
print(cursor.fetchone())  # 只获取一条数据
print(cursor.fetchone())  # 只获取一条数据
cursor.scroll(2,'absolute')  # 控制光标移动 absolute相对于起始位置,往后移动几位
cursor.scroll(1,'relative')  # relative相对于当前位置,往后移动几位
print(cursor.fetchall())  # 获取所有的数据,返回的结果是一个列表

cursor.close()
conn.close()

八、SQLインジェクションの問題

import pymysql


conn = pymysql.connect(
    host = '127.0.0.1',
    port = 3306,
    user = 'root',
    password = '123',
    database = 'day38',
    charset = 'utf8',  # 编码千万不要加- 如果写成了utf-8会直接报错
    autocommit = True  # 这个参数配置完成后  增删改操作都不需要在手动加conn.commit了
)
cursor = conn.cursor(pymysql.cursors.DictCursor)  # 产生一个游标对象  以字典的形式返回查询出来的数据 键是表的字段  值是表的字段对应的信息



# sql = 'insert into user(name,password) values("jerry","666")'
# sql = 'update user set name = "jasonhs" where id = 1'
sql = 'delete from user where id = 6'
cursor.execute(sql)


"""
增删改操作 都必须加一句
conn.commit()操作
"""
# conn.commit()
# username = input('username>>>:')
# password = input('password>>>:')
# sql = "select * from user where name =%s and password = %s"
# print(sql)
# res = cursor.execute(sql,(username,password))  # 能够帮你自动过滤特殊符号 避免sql注入的问题
# # execute 能够自动识别sql语句中的%s 帮你做替换
# if res:
#     print(cursor.fetchall())
# else:
#     print('用户名或密码错误')


"""
sql注入 就是利用注释等具有特殊意义的符号 来完成一些骚操作
后续写sql语句  不要手动拼接关键性的数据
而是让excute帮你去做拼接
"""

# 不要手动去拼接查询的sql语句
username = input(">>>:").strip()
password = input(">>>:").strip()
sql = "select * from user where username='%s' and password='%s'"%(username,password)

# 用户名正确
username >>>: jason' -- jjsakfjjdkjjkjs
# 用户名密码都不对的情况
username >>>: xxx' or 1=1 --asdjkdklqwjdjkjasdljad
password >>>: ''

九、追加および削除

# 增
sql = "insert into user(username,password) values(%s,%s)"
rows = cursor.excute(sql,('jason','123'))

# 修改
sql = "update user set username='jasonDSB' where id=1"
rows = cursor.excute(sql)

"""
增和改单单执行excute并不会真正影响到数据,需要再执行conn.commit()才可以完成真正的增改
"""

# 一次插入多行记录
res = cursor,excutemany(sql,[(),(),()]

おすすめ

転載: www.cnblogs.com/DcentMan/p/11402400.html