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,[(),(),()]