csv是文本文件,用記事本就能打開,XLS是二進(jìn)制的文件只有用EXCEL才能打
數(shù)據(jù)模型
數(shù)據(jù)庫按照數(shù)據(jù)結(jié)構(gòu)來組織桃纯、存儲和管理數(shù)據(jù)酷誓,實際上,數(shù)據(jù)庫一共有三種模型:
層次模型
網(wǎng)狀模型
關(guān)系模型
基于關(guān)系模型的關(guān)系數(shù)據(jù)庫,在關(guān)系數(shù)據(jù)庫中态坦,關(guān)系是通過主鍵和外鍵來維護的
INT
整型
4字節(jié)整數(shù)類型盐数,范圍約+/-21億
BIGINT
長整型
8字節(jié)整數(shù)類型,范圍約+/-922億億
REAL
浮點型
4字節(jié)浮點數(shù)驮配,范圍約+/-1038
DOUBLE
浮點型
8字節(jié)浮點數(shù)娘扩,范圍約+/-10308
DECIMAL(M,N)
高精度小數(shù)
由用戶指定精度的小數(shù),例如壮锻,DECIMAL(20,10)表示一共20位琐旁,其中小數(shù)10位,通常用于財務(wù)計算
CHAR(N)
定長字符串
存儲指定長度的字符串猜绣,例如灰殴,CHAR(100)總是存儲100個字符的字符串
VARCHAR(N)
變長字符串
存儲可變長度的字符串,例如掰邢,VARCHAR(100)可以存儲0~100個字符的字符串
BOOLEAN
布爾類型
存儲True或者False
DATE
日期類型
存儲日期牺陶,例如,2018-06-22
TIME
時間類型
存儲時間辣之,例如掰伸,12:20:59
DATETIME
日期和時間類型
存儲日期+時間,例如怀估,2018-06-22 12:20:59
注意NULL表示字段數(shù)據(jù)不存在狮鸭。一個整型字段如果為NULL不表示它的值為0,同樣的多搀,一個字符串型字段為NULL也不表示它的值為空串''歧蕉。
商用數(shù)據(jù)庫,例如:Oracle康铭,SQL Server惯退,DB2等;
開源數(shù)據(jù)庫从藤,例如:MySQL催跪,PostgreSQL等锁蠕;
桌面數(shù)據(jù)庫,以微軟Access為代表叠荠,適合桌面應(yīng)用程序使用匿沛;
嵌入式數(shù)據(jù)庫扫责,以Sqlite為代表榛鼎,適合手機應(yīng)用和桌面程序。
總的來說鳖孤,SQL語言定義了這么幾種操作數(shù)據(jù)庫的能力:
DDL:Data Definition Language
DDL允許用戶定義數(shù)據(jù)者娱,也就是創(chuàng)建表、刪除表苏揣、修改表結(jié)構(gòu)這些操作黄鳍。通常,DDL由數(shù)據(jù)庫管理員執(zhí)行平匈。
DML:Data Manipulation Language
DML為用戶提供添加框沟、刪除、更新數(shù)據(jù)的能力增炭,這些是應(yīng)用程序?qū)?shù)據(jù)庫的日常操作忍燥。
DQL:Data Query Language
DQL允許用戶查詢數(shù)據(jù),這也是通常最頻繁的數(shù)據(jù)庫日常操作隙姿。
主鍵
主鍵是關(guān)系表中記錄的唯一標(biāo)識梅垄。主鍵的選取非常重要:主鍵不要帶有業(yè)務(wù)含義,而應(yīng)該使用BIGINT自增或者GUID類型输玷。主鍵也不應(yīng)該允許NULL队丝。
可以使用多個列作為聯(lián)合主鍵,但聯(lián)合主鍵并不常用欲鹏。
外鍵
外鍵并不是通過列名實現(xiàn)的机久,而是通過定義外鍵約束實現(xiàn)的:
ALTER TABLE 表 1
ADD CONSTRAINT 外鍵約束名
FOREIGN KEY (表1中的需要定義外鍵的列名)
REFERENCES 表2 (關(guān)聯(lián)的外鍵列名);
通過定義外鍵約束,關(guān)系數(shù)據(jù)庫可以保證無法插入無效的數(shù)據(jù)赔嚎。即如果classes表不存在id=99的記錄膘盖,students表就無法插入class_id=99的記錄。
要刪除一個外鍵約束尽狠,也是通過ALTER TABLE實現(xiàn)的:
ALTER TABLE 表名
DROP FOREIGN KEY 外鍵約束名;
刪除外鍵約束并沒有刪除外鍵這一列衔憨。刪除列是通過DROP COLUMN ...實現(xiàn)的
關(guān)系數(shù)據(jù)庫通過外鍵可以實現(xiàn)一對多、多對多和一對一的關(guān)系袄膏。外鍵既可以通過數(shù)據(jù)庫來約束践图,也可以不設(shè)置約束,僅依靠應(yīng)用程序的邏輯來保證沉馆。
索引
索引的效率取決于索引列的值是否散列码党,即該列的值如果越互不相同德崭,那么索引效率越高。反過來揖盘,如果記錄的列存在大量相同的值眉厨,例如gender列,大約一半的記錄值是M兽狭,另一半是F憾股,因此,對該列創(chuàng)建索引就沒有意義箕慧。
如果要經(jīng)常根據(jù)score列進(jìn)行查詢服球,就可以對score列創(chuàng)建索引:
ALTER TABLE students
ADD INDEX idx_score (score);
可以對一張表創(chuàng)建多個索引。索引的優(yōu)點是提高了查詢效率颠焦,缺點是在插入斩熊、更新和刪除記錄時,需要同時修改索引伐庭,因此粉渠,索引越多,插入圾另、更新和刪除記錄的速度就越慢霸株。
對于主鍵,關(guān)系數(shù)據(jù)庫會自動對其創(chuàng)建主鍵索引盯捌。使用主鍵索引的效率是最高的淳衙,因為主鍵會保證絕對唯一。
在設(shè)計關(guān)系數(shù)據(jù)表的時候饺著,看上去唯一的列箫攀,例如身份證號、郵箱地址等幼衰,因為他們具有業(yè)務(wù)含義靴跛,因此不宜作為主鍵。
但是渡嚣,這些列根據(jù)業(yè)務(wù)要求梢睛,又具有唯一性約束:即不能出現(xiàn)兩條記錄存儲了同一個身份證號。這個時候识椰,就可以給該列添加一個唯一索引绝葡。例如,我們假設(shè)students表的name不能重復(fù):
通過UNIQUE關(guān)鍵字我們就添加了一個唯一索引腹鹉。
也可以只對某一列添加一個唯一約束而不創(chuàng)建唯一索引:
ALTER TABLE students
ADD CONSTRAINT uni_name UNIQUE (name);
這種情況下藏畅,name列沒有索引,但仍然具有唯一性保證功咒。
無論是否創(chuàng)建索引愉阎,對于用戶和應(yīng)用程序來說绞蹦,使用關(guān)系數(shù)據(jù)庫不會有任何區(qū)別。這里的意思是說榜旦,當(dāng)我們在數(shù)據(jù)庫中查詢時幽七,如果有相應(yīng)的索引可用,數(shù)據(jù)庫系統(tǒng)就會自動使用索引來提高查詢效率溅呢,如果沒有索引澡屡,查詢也能正常執(zhí)行,只是速度會變慢藕届。因此挪蹭,索引可以在使用數(shù)據(jù)庫的過程中逐步優(yōu)化亭饵。
通過對數(shù)據(jù)庫表創(chuàng)建索引休偶,可以提高查詢速度。
通過創(chuàng)建唯一索引辜羊,可以保證某一列的值具有唯一性踏兜。
數(shù)據(jù)庫索引對于用戶和應(yīng)用程序來說都是透明的
SELECT語句其實并不要求一定要有FROM子句,可以用于計算
如果不加括號八秃,條件運算按照NOT碱妆、AND、OR的優(yōu)先級進(jìn)行昔驱,即NOT優(yōu)先級最高疹尾,其次是AND,最后是OR骤肛。加上括號可以改變優(yōu)先級纳本。
使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分?jǐn)?shù)的腋颠,再按gender列排序:
OFFSET是可選的繁成,如果只寫LIMIT 15,那么相當(dāng)于LIMIT 15 OFFSET 0淑玫。 offset 以0開始巾腕,OFFSET超過了查詢的最大數(shù)量并不會報錯,而是得到一個空的結(jié)果集
MySQL中絮蒿,LIMIT 15 OFFSET 30還可以簡寫成LIMIT 30, 15尊搬。
要特別注意:如果聚合查詢的WHERE條件沒有匹配到任何行,COUNT()會返回0土涝,而SUM()佛寿、AVG()、MAX()和MIN()會返回NULL:
分組:在結(jié)果1的基礎(chǔ)上再進(jìn)行分組回铛。
join:
簡單地說狗准,就是先確定一個主表作為結(jié)果集克锣,然后,把其他表的行有選擇性地“連接”在主表結(jié)果集上腔长,on 條件是s.class_id = c.id袭祟,表示students表的class_id列與classes表的id列相同的行需要連接;
根據(jù)條件
INNER JOIN只返回同時存在于兩張表的行數(shù)據(jù)捞附,
RIGHT OUTER JOIN返回右表都存在的行巾乳。如果某一行僅在右表存在,那么結(jié)果集就會以NULL填充剩下的字段鸟召。
LEFT OUTER JOIN則返回左表都存在的行胆绊。
關(guān)系數(shù)據(jù)庫的基本操作就是增刪改查,即CRUD:Create欧募、Retrieve压状、Update、Delete跟继。其中种冬,對于查詢,我們已經(jīng)詳細(xì)講述了SELECT語句的詳細(xì)用法舔糖。
而對于增娱两、刪、改金吗,對應(yīng)的SQL語句分別是:
INSERT:插入新記錄十兢;
UPDATE:更新已有記錄;
DELETE:刪除已有記錄摇庙。