MySQL創表--分頁--自關聯--

 
   
  

建立表book

create table t_book( id int unsigned auto_increment primary key, bookName varchar(255) default null, price decimal(6,2) default null, author varchar(255) default null, bookTypeId int(11) default null ); insert into t_book values(1, '追風箏的人', '29.00', '胡賽尼', 1); insert into t_book values(2, '計算機', '45.00', 'Harold', 2); insert into t_book values(3, '代碼大全', '128.00', '史蒂夫', 2); insert into t_book values(4, '哥德爾 ', '88.00', '侯世達', 3); insert into t_book values(5, '呵呵', '4.50', '[中]老子', 4); create table t_bookType( id int(11) auto_increment not null primary key, bookTypeName varchar(10) default null ); insert into t_bookType values(1, '小說類'); insert into t_bookType values(2, '編程類'); insert into t_bookType values(3, '哲學類'); insert into t_bookType values(5, '藝術類');

分頁查詢: limit

# limit 後的參數:第一個表示 起始位置(下標從0開始),第二個參數是顯示的個數(表示本次基於起始位置顯示多少個) select * from t_hero limit 0,3 # 結合where條件:只顯示state不爲null 的結果 select * from t_hero where state is not null limit 0,20 +----+-----------------------------------------------------+--------+----------------------------------------------------------+------------+----+--------------+ | id | bookName | price | author | bookTypeId | id | bookTypeName | +----+-----------------------------------------------------+--------+----------------------------------------------------------+------------+----+--------------+ | 1 | 追風箏的人 | 29.00 | [美] 卡勒德·胡賽尼 | 1 | 1 | 小說類 | | 2 | 計算機程序的構造和解釋 : 原書第2版 | 45.00 | [美]Harold Abelson、Gerald Jay Sussman、Julie Sussman | 2 | 2 | 編程類 | | 3 | 代碼大全(第2版) | 128.00 | [美] 史蒂夫·邁克康奈爾 | 2 | 2 | 編程類 | | 4 | 哥德爾、艾舍爾、巴赫 : 集異璧之大成 | 88.00 | [美] 侯世達 | 3 | 3 | 哲學類 | | 5 | 道德經 | 4.50 | [中]老子 | 4 | 4 | 藝術類 | +----+-----------------------------------------------------+--------+----------------------------------------------------------+------------+----+--------------+ - - - - - - - 鏈接查詢: 表示多個表之間的關聯查詢 1. 內鏈接:INNER JOIN ON #鏈接查詢:表示查詢全部數據的非NULL部分 #默認是內鏈接 SELECT * FROM t_book, t_bookType WHERE t_book.bookTypeId = t_bookType.id; select * from t_book, t_bookType where t_book.bookTypeId = t_bookType.id; # 隱式鏈接中 # 給每張表起別名用:as SELECT tb.bookName, tb.price, tby.bookTypeName FROM t_book as tb, t_bookType as tby WHERE tb.bookTypeId = tby.id; # 顯式鏈接 SELECT tb.bookName, tb.price, tby.bookTypeName FROM t_book as tb INNER JOIN t_bookType as tby ON tb.bookTypeId = tby.id; 交集: 屬於A集合,也 屬於B集合 的數據, A & B 並集: 屬於A集合 和 屬於B 的數據的所有集合, A | B(重複數據只保留一個) 2. 左鏈接 : LEFT JOIN ON # 兩張錶鏈接查詢,不管兩者是否有數據缺失,必定會把左邊的表數據所有顯示出來 SELECT * FROM t_book LEFT JOIN t_bookType ON t_book.bookTypeId = t_bookType.id SELECT tb.bookName, tb.price, tb.author, tby.bookTypeName FROM t_book as tb LEFT JOIN t_bookType as tby ON tb.bookTypeId = tby.id 3. 右鏈接: RIGHT JOIN ON # 兩張錶鏈接查詢,不管兩者是否有數據缺失,必定會把右邊的表數據所有顯示出來 SELECT * FROM t_book RIGHT JOIN t_bookType ON t_book.bookTypeId = t_bookType.id SELECT tb.bookName, tb.price, tb.author, tby.bookTypeName FROM t_book as tb RIGHT JOIN t_bookType as tby ON tb.bookTypeId = tby.id 4. 全鏈接: UNION : # 兩張錶鏈接查詢,不管兩者是否有數據缺失,必定會都顯示錶數據所有顯示出來  SELECT tb.bookName, tb.price, tb.author, tby.bookTypeName FROM t_book as tb LEFT JOIN t_bookType as tby ON tb.bookTypeId = tby.id UNION SELECT tb.bookName, tb.price, tb.author, tby.bookTypeName FROM t_book as tb RIGHT JOIN t_bookType as tby ON tb.bookTypeId = tby.id SELECT tb.bookName,tb.author,tby.bookTypeName FROM t_book tb,t_bookType tby WHERE tb.bookTypeId=tby.id AND tb.price>30; - - - - 子查詢 1. 子查詢: IN #在 select 語句的返回值的集合裏裏查找,複合集合裏的數據的部分,纔會匹配成功。 SELECT * FROM t_book WHERE bookTypeId IN (SELECT id FROM t_bookType); 2. 子查詢: NOT IN: # 和 in相反,不在集合裏的數據,纔會匹配成功 SELECT * FROM t_book WHERE bookTypeId NOT IN (SELECT id FROM t_bookType); 3. 子查詢:EXISTS 返回Bool值,若是子查詢語句裏查詢成功,則返回True,不然返回False SELECT * FROM t_book WHERE EXISTS (SELECT * FROM t_bookType); 4. 子查詢:NOT EXISTS: 對子查詢語句返回的結果取反。 SELECT * FROM t_book WHERE NOT EXISTS (SELECT * FROM t_bookType);

自關聯 查詢

文件名: areas.sql

建立數據庫

mysqlcreate database china charset utf8;

切換數據庫

mysqluse china;

建立表mysql

create table areas ( aid int(11) primary key, atitle varchar(20) default null, pid int(11) default null );

執行指定sql文件的數據插入

mysqlsource ./Desktop/areas.sql

查找 河北省 下面的全部城市

 SELECT city.* FROM areas as city INNER JOIN areas as province ON city.pid = province.aid WHERE province.atitle='河北省' "  SELECT city.* FROM areas as city INNER JOIN areas as province ON city.pid = province.aid WHERE province.atitle='內蒙古自治區';

查找 保定市 下面的全部區縣

select dis.* FROM areas as dis # 別名1:表示區縣 INNER JOIN areas as city # 別名2:表示城市 ON dis.pid=city.aid #內鏈接條件:區縣的pid 和 城市 aid 相同 WHERE city.atitle = "保定市" # 查詢結果條件:城市名爲 "保定市"  select dis.* FROM areas as dis INNER JOIN areas as city ON dis.pid=city.aid WHERE city.atitle = "保定市" 

事務sql

事務(Transaction)是併發控制的基本單位。 所謂事務,它是一個操做序列,這些操做要麼都執行,要麼都不執行, 它是一個不可分割的工做單位。 例如,銀行轉賬工做:從一個賬號扣款並使另外一個賬號增款, 這兩個操做要麼都執行,要麼都不執行。 因此,應該把他們當作一個事務。 事務是數據庫維護數據一致性的單位,在每一個事務結束時,都能保持數據一致性 爲何要有事務 事務普遍的運用於訂單系統、銀行系統等多種場景 例如: A用戶和B用戶是銀行的儲戶, 如今A要給B轉帳500元,那麼須要作如下幾件事: 檢查A的帳戶餘額>500元; A帳戶扣除500元; B帳戶增長500元; 正常的流程走下來,A帳戶扣了500,B帳戶加了500,皆大歡喜。 那若是A帳戶扣了錢以後,系統出故障了呢? A白白損失了500,而B也沒有收到本該屬於他的500。 以上的案例中,隱藏着一個前提條件: A扣錢和B加錢,要麼同時成功,要麼同時失敗。 事務的需求就在於此 事務四大特性(簡稱ACID) 原子性(Atomicity): 事務中的所有操做在數據庫中是不可分割的,要麼所有完成,要麼均不執行 一致性(Consistency): 幾個並行執行的事務,其執行結果必須與按某一順序串行執行的結果相一致 隔離性(Isolation): 事務的執行不受其餘事務的干擾,事務執行的中間結果對其餘事務必須是透明的 持久性(Durability): 對於任意已提交事務,系統必須保證該事務對數據庫的改變不被丟失,即便數據庫出現故障 事務命令 要求:表的引擎類型必須是innodb類型纔可使用事務,這是mysql中表的默認引擎 查看錶的建立語句,能夠看到engine=innodb show create table students; 開啓事務: 執行insert、update、delete語句時,變動會維護到本地緩存中,而不維護到物理表中 begin; 提交事務:將緩存中的數據變動維護到物理表中 commit; 回滾事務:放棄緩存中變動的數據 rollback; 示例1:提交 步驟1:打開兩個終端,鏈接mysql,使用同一個數據庫,操做同一張表 終端1 select * from students; 終端2:開啓事務,插入數據 begin; insert into students(sname) values('張飛'); 步驟2 終端1:查詢數據,發現並無新增的數據 select * from students; 步驟3 終端2:完成提交 commit; 終端1:查詢,發現有新增的數據 select * from students; 示例2:回滾 步驟1:打開兩個終端,鏈接mysql,使用同一個數據庫,操做同一張表 終端1 select * from students; 終端2 begin; insert into students(sname) values('張飛'); 步驟2 終端1:查詢數據,發現並無新增的數據 select * from students; 步驟3 終端2:完成回滾 rollback; 終端1:查詢數據,發現沒有新增的數據 select * from students;

mysql與Python交互

# coding=utf-8 import MySQLdb def insert_data(): # 指定一個SQL語句 # 插入數據 #sql = "INSERT INTO t_book(bookName, price, author, bookTypeId) VALUES ('三體1', 55.60, '[中]劉慈欣', 8)" # 更新數據 #sql = "UPDATE t_book set price = 100.00 where bookTypeId=8" # 刪除數據 sql = "DELETE FROM t_book where bookName like '%三體%'" try: # 建立MySQL數據庫鏈接對象 conn = MySQLdb.connect( host = "localhost", # 指定數據庫所在的ip port = 3306, # 指定數據庫的端口號 user = 'root', # 指定登陸數據庫的用戶 passwd = 'mysql', # 登陸數據庫的用戶密碼 db = 'db_book', # 指定的操做的數據庫名稱 charset = 'utf8' # 指定字符集,和數據庫字符集相同  ) # 建立數據庫操做遊標,能夠用來執行SQL語句 cursor = conn.cursor() # 使用遊標執行SQL語句  cursor.execute(sql) # 由於在MySQL和Python交互,都是事務,因此要用commit()提交事務  conn.commit() except Exception, e: print e # 若是出錯,則回滾以前的操做  conn.rollback() finally: # 先關閉遊標  cursor.close() # 再關閉數據庫鏈接  conn.close() print "LOG: 執行結束!" if __name__ == "__main__": insert_data() fetchall()執行查詢時,獲取結果集的全部行,一行構成一個元組,再將這些元組裝入一個元組返回 fetchone()執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組 reCount=cur.execute('select * from admin')#返回本次操做影響的記錄數  print reCount data=cur.fetchall()#得到 'select * from admin'語句 返回的結果集  print data cur.scroll(0,mode='absolute')#光標回到初始位置0處(絕對定位)  print cur.fetchone()#此時,光標位置爲0;返回位置爲0的記錄  print cur.fetchone()#返回位置爲1的記錄  cur.scroll(1,mode='absolute')#光標回到1處(絕對定位)  print cur.fetchone()#返回位置爲1的記錄  cur.scroll(-2,mode='relative')#光標回退2步(相對定位)  print cur.fetchmany(3)#從光標所在的位置(此時,光標位於0處),連續讀取3條記錄  cur.scroll(1,mode='relative')#光標前進1步(相對定位)  print cur.fetchone()#返回光標(位於4處)指向的那一條記錄  # coding=utf-8 import MySQLdb def main(): sql = "select * from t_hero;" try: conn = MySQLdb.connect( host = "localhost", port = 3306, user = 'root', passwd = 'mysql', db = 'db_sanguo', charset = 'utf8' ) cursor = conn.cursor() cursor.execute(sql) data = cursor.fetchall() for i in data: if list(i)[0] == 6: print list(i)[0],list(i)[1] # cursor.scroll(6,mode='absolute') # cursor.scroll(2,mode='relative') # wer = cursor.fetchone() # print list(wer)[0],list(wer)[1],list(wer)[2],list(wer)[3] # cursor.scroll(-2,mode='relative') # print cursor.fetchmany(3) # cur.scroll(1,mode='relative')  conn.commit() except Exception, e: print e # 若是出錯,則回滾以前的操做  conn.rollback() finally: # 先關閉遊標  cursor.close() # 再關閉數據庫鏈接  conn.close() print "LOG: 執行結束!" if __name__ == "__main__": main()  

傳參的方式

# coding=utf-8
import MySQLdb def insert_data(): try: # 建立MySQL數據庫鏈接對象
        conn = MySQLdb.connect( host = "localhost", # 指定數據庫所在的ip
            port = 3306,       # 指定數據庫的端口號
            user = 'root',      # 指定登陸數據庫的用戶
            passwd = 'mysql', # 登陸數據庫的用戶密碼
            db = 'db_sanguo',     # 指定的操做的數據庫名稱
            charset = 'utf8'    # 指定字符集,和數據庫字符集相同
 ) name = raw_input("請輸入英雄的大名:") age = raw_input("請輸入英雄的年齡:") wer = [name,age] # 建立數據庫操做遊標,能夠用來執行SQL語句
        cursor = conn.cursor() # 使用遊標執行SQL語句
        qw = cursor.execute("insert into t_hero(name,age) values(%s,%s)",wer) print qw # 由於在MySQL和Python交互,都是事務,因此要用commit()提交事務
        if qw = 1: conn.commit() except Exception, e: print e # 若是出錯,則回滾以前的操做
 conn.rollback() finally: # 先關閉遊標
 cursor.close() # 再關閉數據庫鏈接
 conn.close() print "執行結束!ok"


if __name__ == "__main__": insert_data()

私有化數據庫

# coding = utf-8 class Test(): def __init__(self): self.num = 10 self.__string = "hello world" def __PrivateFunc(self): print self.num print self._string def PublicFunc(self): print self.num print self._string if __name__ == "__main__": t = Test() #t.PublicFunc() #print t.num #t.__PrivateFunc() print t._string
相關文章
相關標籤/搜索