1御铃、什么是多表關聯(lián)查詢蒿涎,有幾種多表關聯(lián)的查詢方式穿撮,分別是什么缺脉?
多表關聯(lián)查詢概念:
將兩個或兩個以上的表按某個條件連接起來,從而選取需要的數(shù)據(jù)悦穿。多表聯(lián)查是同時查
詢兩個或兩個以上的表時使用的攻礼。
多表關聯(lián)查詢分類:
1.1內連接
SELECT 字段,字段1,..
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
1.2外連接
1.2.1左外連接
左外連接使用關鍵字left join,
然后通過on連接表與表之間的條件
注意:left join 會查詢出left join左邊的表所有的數(shù)據(jù),
即使右表沒有匹配
語法:
SELECT 字段,字段1,...
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
1.2.2 右外連接
左外連接使用關鍵字right join,
然后通過on連接表與表之間的條件
注意: 即使左表中沒有匹配栗柒,
也從右表返回所有的行
語法:
SELECT 字段,字段1,....
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
2礁扮、mysql的引擎有哪幾種,innodb Myisam 的區(qū)別瞬沦?
2.1 mysql的各種引擎
ISAM太伊、MyISAM、HEAP逛钻、CSV僚焦、 BLACKHOLE、ARCHIVE曙痘、
PERFORMANCE_SCHEMA芳悲、InnoDB、Berkeley边坤、Merge名扛、Federated、Cluster
2.2 InnoDB和MyISAM的區(qū)別
2.2.1 InnoDB
MyISAM是MySQL的默認數(shù)據(jù)庫引擎(5.5版之前)茧痒,由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良肮韧。雖然性能極佳,但卻有一個缺點:不支持事務處理(transaction)。不過弄企,在這幾年的發(fā)展下超燃,MySQL也導入了InnoDB(另一種數(shù)據(jù)庫引擎),以強化參考完整性與并發(fā)違規(guī)處理機制桩蓉,后來就逐漸取代MyISAM淋纲。
2.2.2 MyISAM
InnoDB劳闹,是MySQL的數(shù)據(jù)庫引擎之一院究,為MySQL AB發(fā)布binary的標準之一。InnoDB由Innobase Oy公司所開發(fā)本涕,2006年五月時由甲骨文公司并購业汰。與傳統(tǒng)的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(Transaction)功能菩颖,類似于PostgreSQL样漆。目前InnoDB采用雙軌制授權,一是GPL授權晦闰,另一是專有軟件授權放祟。
2.2.3 區(qū)別
2.2.3.1、 存儲結構
MyISAM:每個MyISAM在磁盤上存儲成三個文件呻右。第一個文件的名字以表的名字開始跪妥,擴展名指出文件類型。.frm文件存儲表定義声滥。數(shù)據(jù)文件的擴展名為.MYD (MYData)眉撵。索引文件的擴展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一個數(shù)據(jù)文件中(也可能是多個文件落塑,或者是獨立的表空間文件)纽疟,InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB憾赁。
2.2.3.2污朽、 存儲空間
MyISAM:可被壓縮,存儲空間較小龙考。支持三種不同的存儲格式:靜態(tài)表(默認蟆肆,但是注意數(shù)據(jù)末尾不能有空格,會被去掉)洲愤、動態(tài)表颓芭、壓縮表。
InnoDB:需要更多的內存和存儲柬赐,它會在主內存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引亡问。
2.2.3.3、 可移植性、備份及恢復
MyISAM:數(shù)據(jù)是以文件的形式存儲州藕,所以在跨平臺的數(shù)據(jù)轉移中會很方便束世。在備份和恢復時可單獨針對某個表進行操作。
InnoDB:免費的方案可以是拷貝數(shù)據(jù)文件床玻、備份 binlog毁涉,或者用 mysqldump,在數(shù)據(jù)量達到幾十G的時候就相對痛苦了锈死。
2.2.3.4贫堰、 事務支持
MyISAM:強調的是性能,每次查詢具有原子性,其執(zhí)行數(shù)度比InnoDB類型更快待牵,但是不提供事務支持其屏。
InnoDB:提供事務支持事務,外部鍵等高級數(shù)據(jù)庫功能缨该。 具有事務(commit)偎行、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
2.2.3.5贰拿、 AUTO_INCREMENT
MyISAM:可以和其他字段一起建立聯(lián)合索引蛤袒。引擎的自動增長列必須是索引,如果是組合索引膨更,自動增長可以不是第一列妙真,他可以根據(jù)前面幾列進行排序后遞增。
InnoDB:InnoDB中必須包含只有該字段的索引询一。引擎的自動增長列必須是索引隐孽,如果是組合索引也必須是組合索引的第一列。
2.2.3.6健蕊、 表鎖差異
MyISAM:只支持表級鎖菱阵,用戶在操作myisam表時,select缩功,update晴及,delete,insert語句都會給表自動加鎖嫡锌,如果加鎖以后的表滿足insert并發(fā)的情況下虑稼,可以在表的尾部插入新的數(shù)據(jù)。
InnoDB:支持事務和行級鎖势木,是innodb的最大特色蛛倦。行鎖大幅度提高了多用戶并發(fā)操作的新能。但是InnoDB的行鎖啦桌,只是在WHERE的主鍵是有效的溯壶,非主鍵的WHERE都會鎖全表的及皂。
2.2.3.7、 全文索引
MyISAM:支持 FULLTEXT類型的全文索引
InnoDB:不支持FULLTEXT類型的全文索引且改,但是innodb可以使用sphinx插件支持全文索引验烧,并且效果更好。
2.2.3.8又跛、 表主鍵
MyISAM:允許沒有任何索引和主鍵的表存在碍拆,索引都是保存行的地址。
InnoDB:如果沒有設定主鍵或者非空唯一索引慨蓝,就會自動生成一個6字節(jié)的主鍵(用戶不可見)感混,數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值菌仁。
2.2.3.9浩习、 表的具體行數(shù)
MyISAM:保存有表的總行數(shù),如果select count() from table;會直接取出出該值济丘。
InnoDB:沒有保存表的總行數(shù),如果使用select count() from table洽蛀;就會遍歷整個表摹迷,消耗相當大,但是在加了wehre條件后郊供,myisam和innodb處理的方式都一樣峡碉。
2.2.3.10、 CURD操作
MyISAM:如果執(zhí)行大量的SELECT驮审,MyISAM是更好的選擇鲫寄。
InnoDB:如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮疯淫,應該使用InnoDB表地来。DELETE 從性能上InnoDB更優(yōu),但DELETE FROM table時熙掺,InnoDB不會重新建立表未斑,而是一行一行的刪除,在innodb上如果要清空保存有大量數(shù)據(jù)的表币绩,最好使用truncate table這個命令蜡秽。
2.2.3.11、 外鍵
MyISAM:不支持
InnoDB:支持
3缆镣、什么是數(shù)據(jù)庫事務芽突,為什么要有數(shù)據(jù)庫事務,事務的特性董瞻,事務的隔離級別有哪些寞蚌?
3.1 什么是數(shù)據(jù)庫事務
事務(Transaction)是并發(fā)控制的基本單位。所謂的事務,它是一個操作序列睬澡,這些操作要么都執(zhí)行固额,要么都不執(zhí)行,它是一個不可分割的工作單位煞聪。例如斗躏,銀行轉賬工作:從一個賬號扣款并使另一個賬號增款,這兩個操作要么都執(zhí)行昔脯,要么都不執(zhí)行,在關系數(shù)據(jù)庫中,一個事務可以是一條SQL語句啄糙、一組SQL語句或整個程序。 云稚。所以隧饼,應該把它們看成一個事務。事務是數(shù)據(jù)庫維護數(shù)據(jù)一致性的單位静陈,在每個事務結束時燕雁,都能保持數(shù)據(jù)一致性
3.2 為什么要引入數(shù)據(jù)庫事務
事務的提出主要是為了解決并發(fā)情況下保持數(shù)據(jù)一致性的問題。
3.3 數(shù)據(jù)庫事務的特征
Atomic(原子性):事務中包含的操作被看做一個邏輯單元鲸拥,這個邏輯單元中的操作要么全部成功拐格,要么全部失敗(減款,增款必須一起完成)。
Consistency(一致性):只有合法的數(shù)據(jù)可以被寫入數(shù)據(jù)庫刑赶,否則事務應該將其回滾到最初狀態(tài)捏浊。事務的運行并不改變數(shù)據(jù)的一致性.例如,完整性約束了a+b=10,一個事務改變了a,那么b也應該隨之改變。
Isolation(隔離性):事務允許多個用戶對同一個數(shù)據(jù)進行并發(fā)訪問撞叨,而不破壞數(shù)據(jù)的正確性和完整性金踪。同時,并行事務的修改必須與其他并行事務的修改相互獨立牵敷。
Durability(持久性):事務完成之后胡岔,它對于 系統(tǒng)的影響是永久的,該修改即使出現(xiàn)系統(tǒng)故障也將一直保留劣领,真實的修改了數(shù)據(jù)庫
3.4 事務的隔離級別
Read uncommitted姐军,讀未提交
Read committed,讀提交
Repeatable read尖淘,重復讀
Serializable奕锌,序列化
4、什么是索引村生,作用惊暴?原理?MySQL的原理趁桃?
4.1 索引
索引是對數(shù)據(jù)庫表中一列或多列的值進行排序的一種結構
4.2 索引的作用
保證數(shù)據(jù)庫表中數(shù)據(jù)的唯一性辽话,提高查詢效率
4.3 索引的原理
對要查詢的字段建立索引其實就是把該字段按照一定的方式排序肄鸽;建立的索引只對該字段有用,如果查詢的字段改變油啤,那么這個索引也就無效了典徘,比如圖書館的書是按照書名的第一個字母排序的,那么你想要找作者叫張三的就不能用改索引了益咬;還有就是如果索引太多會降低查詢的速度
4.4 MySQL的原理
mysql原理圖各個組件說明:
4.4.1 connectors
與其他編程語言中的sql 語句進行交互逮诲,如php、java等幽告。
4.4.2 Management Serveices & Utilities
系統(tǒng)管理和控制工具
4.4.3 Connection Pool (連接池)
管理緩沖用戶連接梅鹦,線程處理等需要緩存的需求
4.4.4 SQL Interface (SQL接口)
接受用戶的SQL命令,并且返回用戶需要查詢的結果冗锁。比如select from就是調用SQL Interface
4.4.5 Parser (解析器)
SQL命令傳遞到解析器的時候會被解析器驗證和解析齐唆。主要功能:a . 將SQL語句分解成數(shù)據(jù)結構,并將這個結構傳遞到后續(xù)步驟冻河,后面SQL語句的傳遞和處理就是基于這個結構的b. 如果在分解構成中遇到錯誤箍邮,那么就說明這個sql語句是不合理的,語句將不會繼續(xù)執(zhí)行下去
4.4.6 Optimizer (查詢優(yōu)化器)
SQL語句在查詢之前會使用查詢優(yōu)化器對查詢進行優(yōu)化(產生多種執(zhí)行計劃,最終數(shù)據(jù)庫會選擇最優(yōu)化的方案去執(zhí)行,盡快返會結果) 他使用的是“選取-投影-聯(lián)接”策略進行查詢芋绸。用一個例子就可以理解: select uid,name from user where gender = 1;這個select 查詢先根據(jù)where 語句進行選取媒殉,而不是先將表全部查詢出來以后再進行gender過濾這個select查詢先根據(jù)uid和name進行屬性投影,而不是將屬性全部取出以后再進行過濾將這兩個查詢條件聯(lián)接起來生成最終查詢結果.
4.4.7 Cache和Buffer (查詢緩存)
如果查詢緩存有命中的查詢結果摔敛,查詢語句就可以直接去查詢緩存中取數(shù)據(jù)。這個緩存機制是由一系列小緩存組成的全封。比如表緩存马昙,記錄緩存,key緩存刹悴,權限緩存等
4.4.8 Engine (存儲引擎)
存儲引擎是MySql中具體的與文件打交道的子系統(tǒng)行楞。也是Mysql最具有特色的一個地方。Mysql的存儲引擎是插件式的土匀。它根據(jù)MySql AB公司提供的文件訪問層的一個抽象接口來定制一種文件訪問機制(這種訪問機制就叫存儲引擎)
5. 請簡述python 經典類和新式類的區(qū)別子房?
5.1 經典類與新式類
?新式類都從object繼承,經典類不需要就轧。
?新式類的MRO(method resolution order 基類搜索順序)算法采用C3算法廣度優(yōu)先搜
索证杭,而舊式類的MRO算法是采用深度優(yōu)先搜索
?新式類相同父類只執(zhí)行一次構造函數(shù),經典類重復執(zhí)行多次妒御。
5.2 新式類對象可以直接通過class屬性獲取自身類型:type
# coding:utf-8
class E:
# 經典類
pass
class E1(object):
# 新式類
pass
e = E()
print "經典類"
print e
print type(e)
print e.__class__
print "新式類"
e1 = E1()
print e1
print e1.__class__
print type(e1)
# 經典類
<__main__.E instance at 0x0000000002250B08>
<type 'instance'>
__main__.E
# 新式類
<__main__.E1 object at 0x0000000002248710>
<class '__main__.E1'>
<class '__main__.E1'>
5.3 繼承搜索的順序發(fā)生了改變,經典類多繼承屬性搜索順序: 先深入繼承樹左側解愤,再返回,開始找右側;新式類多繼承屬性搜索順序: 先水平搜索乎莉,然后再向上移動
# coding:utf-8
class A(object):
"""
新式類
作為所有類的基類
"""
def foo(self):
print "class A"
class A1():
"""
經典類
作為所有類的基類
"""
def foo(self):
print "class A1"
class C(A):
pass
class C1(A1):
pass
class D(A):
def foo(self):
print "class D"
class D1(A1):
def foo(self):
print "class D1"
class E(C, D):
pass
class E1(C1, D1):
pass
e = E()
e.foo()
e1 = E1()
e1.foo()
輸出
class D
class A1
因為A新式類,對于繼承A類都是新式類送讲,首先要查找類E中是否有foo()奸笤,如果沒有則按順序查找C->D->A。它是一種廣度優(yōu)先查找方式哼鬓。
因為A1經典類,對于繼承A1類都是經典類监右,首先要查找類E1中是否有foo(),如果沒有則按順序查找C1->A1->D1异希。它是一種深度優(yōu)先查找方式健盒。
5.4 新式類增加了slots內置屬性, 可以把實例屬性的種類鎖定到slots規(guī)定的范圍之中。
比如只允許對A實例添加name和age屬性:
# coding:utf-8
class A(object):
__slots__ = ('name', 'age')
class A1():
__slots__ = ('name', 'age')
a1 = A1()
a = A()
a1.name1 = "a1"
a.name1 = "a"
A是新式類添加了slots 屬性,所以只允許添加 name age
A1經典類slots 屬性沒用
Traceback (most recent call last):
File "t.py", line 13, in <module>
a.name1 = "a"
AttributeError: 'A' object has no attribute 'name1'
所以a.name是會出錯的
5.5 新式類增加了getattribute方法
class A(object):
def __getattribute__(self, *args, **kwargs):
print "A.__getattribute__"
class A1():
def __getattribute__(self, *args, **kwargs):
print "A1.__getattribute__"
a1 = A1()
a = A()
a.test
print "========="
a1.test
A.__getattribute__
=========
Traceback (most recent call last):
File "t.py", line 18, in <module>
a1.test
AttributeError: A1 instance has no attribute 'test'
可以看出A是新式類宠互,每次通過實例訪問屬性味榛,都會經過getattribute函數(shù),
A1不會調用getattribute所以出錯了