- LIMIT:用於規定要返回的記錄的數目
LIMIT的語法結構:
SELECT column_name(s)
FROM table_name
LIMIT number;
複製程式碼
- LIKE:用於在 WHERE 子句中搜尋列中的指定模式
LIKE的語法結構:
SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;
複製程式碼
其中pattern可能用到以下萬用字元:
-
% :替代 0 個或多個字元
-
_ :替代一個字元
-
[charlist]: 字元列中的任何單一字元
-
[^charlist]:不在字元列中的任何單一字元
-
除了上述萬用字元,REGEXP 或 NOT REGEXP也是用來操作正規表示式的萬用字元,只是不用LIKE引出,例如:
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';
複製程式碼
選取 name 以 "G"、"F" 或 "s" 開始的所有網站
- IN VS BETWEEN:
IN的語法結構:#允許在 WHERE 子句中規定多個值
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);
BETWEEN的語法結構:#選取介於兩個值之間的資料範圍內的值。這些值可以是數值、文字或者日期
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
複製程式碼
二者可以結合使用,例如選取 alexa 介於 1 和 20 之間但 country 不為 USA 和 IND 的所有網站:
SELECT * FROM Websites
WHERE (alexa BETWEEN 1 AND 20)
AND country NOT IN ('USA', 'IND');
複製程式碼
-
注意,在MYSQL中,BETWEEN語句搜尋結果包括兩個邊界值
-
JOIN:把來自兩個或多個表的行結合起來
JOIN的語法結構:
SELECT column_name(s) #選擇要顯示的行或列
FROM table1 #左表
INNER/LEFT/RIGHT JOIN table2 #右表
ON table1.column_name=table2.column_name
複製程式碼
-
INNER JOIN只返回兩個表中均有匹配的行,如果 "Websites" 表中的行在 "access_log" 中沒有匹配,則不會列出這些行
-
LEFT JOIN 關鍵字從左表(Websites)返回所有的行,即使右表(access_log)中沒有匹配
-
RIGHT JOIN 關鍵字從右表(Websites)返回所有的行,即使左表(access_log)中沒有匹配
-
UNION:在多個表格中搜尋匹配的結果
UNION的語法結構:
SELECT column_name(s) FROM table1
UNION (ALL) #無ALL時返回不重複的值,有ALL時返回所有值
SELECT column_name(s) FROM table2;
複製程式碼
可以與WHERE結合使用:
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
複製程式碼
-
使用UNION命令時需要注意,只能在最後使用一個ORDER BY命令,是將兩個查詢結果合在一起之後,再進行排序。
-
UNION 內部的每個 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每個 SELECT 語句中的列的順序必須相同
-
CREATE DATABASE VS CREATE TABLE:
CREATE DATABASE的語法結構:
CREATE DATABASE dbname
CREATE TABLE的語法結構:
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
)
複製程式碼
-
約束(暫時簡單瞭解):
-
NOT NULL - 指示某列不能儲存 NULL 值。
-
UNIQUE - 保證某列的每行必須有唯一的值。
-
PRIMARY KEY - NOT NULL 和 UNIQUE 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助於更容易更快速地找到表中的一個特定的記錄。
-
FOREIGN KEY - 保證一個表中的資料匹配另一個表中的值的參照完整性。
-
CHECK - 保證列中的值符合指定的條件。
-
DEFAULT - 規定沒有給列賦值時的預設值。
接下來是pymysql:
- 1.建立資料庫:
import pymysql
#建立資料庫
db=pymysql.connect(host='localhost',user='root',password='password',port=3306)
cursor=db.cursor()
cursor.execute('select version()')
print(cursor.fetchone())
cursor.execute('create database spiders default character set utf8')
db.close()
複製程式碼
- 2.建立表:
#建立表
db=pymysql.connect(host='localhost',user='root',password='password',port=3306,db='spiders')
cursor=db.cursor()
sql='create table if not exists students (my_id varchar(255)not null,my_name varchar(255)not null,my_age int not null,primary key (my_id))'
cursor.execute(sql)
db.close()
複製程式碼
-
3.插入資料:
-
對於資料的插入,更新,刪除,都需要commit()方法
#低配版插入資料
id='20120001'
user='mike'
age=20
db=pymysql.connect(host='localhost',user='root',password='password',port=3306,db='spiders')
cursor=db.cursor()
sql='insert into students(my_id,my_name,my_age) values(%s,%s,%s)'
try:
cursor.execute(sql,(id,user,age))
db.commit()
except:
db.rollback() #若插入失敗,回滾資料
db.close()
#中配版插入資料(比低配版更方便)
db=pymysql.connect(host='localhost',user='root',password='password',port=3306,db='spiders')
cursor=db.cursor()
data={
'my_id':'19990702',
'my_name':'Bob',
'my_age':20
}
table='students'
keys=','.join(data.keys())
values=','.join(['%s']*len(data))
sql='insert into {table}({keys}) values({values})'.format(table=table,keys=keys,values=values)
print(sql)
try:
if cursor.execute(sql,tuple(data.values())):
print('插入成功')
db.commit()
except:
print('插入失敗')
db.rollback()
db.close()
#高配版插入資料(若主鍵存在則更新資料,若主鍵不存在則插入資料)
db=pymysql.connect(host='localhost',user='root',password='password',port=3306,db='spiders')
cursor=db.cursor()
data={
'my_id':'19990202',
'my_name':'Bob',
'my_age':25
}
table='students'
keys=','.join(data.keys())
values=','.join(['%s']*len(data))
sql='insert into {table}({keys}) values({values}) on duplicate key update'.format(table=table,keys=keys,values=values)
updata= ','.join(['{key}=%s'.format(key=key) for key in data])
sql=sql+' '+updata #注意空格的新增問題
try:
if cursor.execute(sql,tuple(data.values())*2):
print('成功')
db.commit()
except:
print('失敗')
db.rollback()
db.close()
複製程式碼
- 4.更新資料:
#更新資料
db=pymysql.connect(host='localhost',user='root',password='password',port=3306,db='spiders')
cursor=db.cursor()
sql='update students set my_age=%s where my_name=%s'
try:
print('更新成功')
cursor.execute(sql,(25,'Bob'))
db.commit()
except:
print('更新失敗')
db.rollback()
db.close()
複製程式碼
建議用高配版插入資料的方法
- 5.刪除資料:
#刪除資料
db=pymysql.connect(host='localhost',user='root',password='password',port=3306,db='spiders')
cursor=db.cursor()
table='students'
condition='my_age>25'
sql='delete from {table} where {condition}'.format(table=table,condition=condition)
try:
cursor.execute(sql)
db.commit()
except:
print('失敗')
db.rollback()
db.close()
複製程式碼
- 6.查詢資料:
db=pymysql.connect(host='localhost',user='root',password='password',port=3306,db='spiders')
cursor=db.cursor()
sql='select * from students where my_age>=20'
try:
cursor.execute(sql)
print('count:',cursor.rowcount) #輸出匹配sql的行數
one=cursor.fetchone() #返回第一行資料,元組型別
print(one)
results=cursor.fetchall() #返回指標偏移後的所有資料,元組型別
print(results)
# 一般如果資料量很大,不建議用cursor.fetchall()獲取全部資料,用迭代
# row=cursor.fetchone()
# while row:
# print('Row:',row)
# row=cursor.fetchone()
except:
print('ERROR')
複製程式碼