進擊RDC的第三天(3.23)

爬蟲爬呀爬發表於2019-03-24
  • 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')

複製程式碼

相關文章