【MySQL】數(shù)據(jù)庫入門與提高
什么是數(shù)據(jù)?
生活中我們的成績,自己的工資,這些都是狹義上的數(shù)值數(shù)據(jù)
廣義:文字、聲音、圖形等,一切能夠被計算機(jī)接收并且能被處理的符號
大量、海量的數(shù)據(jù)組成的就是數(shù)據(jù)庫
數(shù)據(jù)庫的特點:存儲大量數(shù)據(jù),方便檢索和訪問
? ? ? ????????????????? ?保持?jǐn)?shù)據(jù)信息的一致、完整
? ? ? ???????????????????共享和安全(你的行程會共享給多個部門與組織,例如去一趟哈爾濱,那么你的數(shù)據(jù)就會被保存在公交局)
? ? ? ????????????????? ?通過組合分析,產(chǎn)生新的有用信息
數(shù)據(jù)管理技術(shù)的發(fā)展階段:? ? ?人工管理階段——文件系統(tǒng)管理階段——數(shù)據(jù)庫管理階段
數(shù)據(jù)庫就是存放數(shù)據(jù)的倉庫???????管理數(shù)據(jù)庫的系統(tǒng)就叫做數(shù)據(jù)庫管理系統(tǒng)
關(guān)系型數(shù)據(jù)庫:通過關(guān)系模型建立的數(shù)據(jù)庫,存儲結(jié)構(gòu)是多個二維表,例如一個學(xué)校的數(shù)據(jù)庫就分為學(xué)生表教師表...
數(shù)據(jù)庫管理系統(tǒng)(DBMS):對收集到的大量數(shù)據(jù)進(jìn)行整理、加工、歸納、分類、匯總等
數(shù)據(jù)庫應(yīng)用系統(tǒng)
應(yīng)用程序客戶端(電腦,PC)
數(shù)據(jù)庫服務(wù)器(服務(wù)器,數(shù)據(jù)庫)
應(yīng)用程序客戶端對數(shù)據(jù)庫服務(wù)器進(jìn)行操作與查詢,而數(shù)據(jù)庫服務(wù)器對應(yīng)用程序客戶端進(jìn)行相應(yīng)
結(jié)構(gòu)化查詢語言(SQL)
SQL語言是用于關(guān)系型數(shù)據(jù)庫的查詢的結(jié)構(gòu)化語言,對于網(wǎng)狀型數(shù)據(jù)庫等不起作用。
關(guān)系型數(shù)據(jù)庫常用的SQL語言有:MySQL(體積小,速度快,成本低,開源) and SQLsever and Oracle(世界上最好的關(guān)系型數(shù)據(jù)庫語言) Access
關(guān)系:一個關(guān)系通常對應(yīng)一張表(一個表里有多個關(guān)系)
關(guān)系模式:關(guān)系的描述
數(shù)據(jù)庫的表的創(chuàng)建與管理
圖形界面工具:使用 Navicat 右擊創(chuàng)建數(shù)據(jù)庫與表
命令行方式
創(chuàng)建數(shù)據(jù)庫:create databases(數(shù)據(jù)庫名);
mysql> create database if not exists scout;
Query OK, 1 row affected (0.00 sec)
mysql> create schema if not exists iboy;
Query OK, 1 row affected (0.00 sec)
【if not exists(系統(tǒng)會自動檢測,沒有這個數(shù)據(jù)庫就會建一個,有的話就不管了,沒有這句話的話系統(tǒng)會報錯)】????????????????? ? ????????????????????create database/schema IF NOT EXISTS MINI;
? ? 數(shù)據(jù)庫名表示被創(chuàng)建數(shù)據(jù)庫名,數(shù)據(jù)庫名必須符合以下規(guī)則:
? ? 數(shù)據(jù)庫名必須唯一
? ? 名稱內(nèi)不能含有“/”及“.”等非法字符
? ? 數(shù)據(jù)庫名最大不能超過64字節(jié)
數(shù)據(jù)庫文件:數(shù)據(jù)庫是由相關(guān)數(shù)據(jù)表組成,一個數(shù)據(jù)庫包括多個數(shù)據(jù)表。
顯示數(shù)據(jù)庫:顯示服務(wù)器中已經(jīng)建立的數(shù)據(jù)庫,使用SHOW DATABASES;
因為MySQL服務(wù)器中有多個數(shù)據(jù)庫,可以使用USE命令可指定當(dāng)前數(shù)據(jù)庫
語法格式:USE 數(shù)據(jù)庫名;
? ? ? eg:USE mini;
字符集是一套符號的編碼。
eg:ASCII字符集中有四個字母:‘A’,‘a(chǎn)’,‘B’,‘b’。每個字母都有一個賦予的數(shù)字,AabB是字符,賦予的數(shù)字是編碼,字符和編碼合在一起是字符集。
GB2312是中國國家標(biāo)準(zhǔn)的簡體中文字符集。
校對規(guī)則是在字符集內(nèi)用于比較字符的一套規(guī)則。
數(shù)據(jù)操縱(增刪改查)
數(shù)據(jù)插入:INSTER? INTO 表名(列名)?
????????????????????????????????VALUES(表達(dá)式,...);
????????????????????第一行inster表示插入到哪個列表那個列,values表示插入的值,這個不一定必須是值(常量變量),也可以是一個表達(dá)式,
?????????????????????eg:???????USE Bookstore:
????????????????????????????????????INSERT?INTO book
????????????????????????????????????????VALUES(? '6625','計算機(jī)',‘Dreamwearer 8’,
????????????????????????????????????????‘2010-08-16’,33.25,NULL,NULL);
book后面沒有默認(rèn)值就代表從第一列開始插入
如果不想默認(rèn)插入的話:eg:
????????????????????????????????????????????INSTER INTO Book
????????????????????????????????????????????(圖書編號,書名,出版日期,單價)
??????????????????????????????????????????????VALUES('6626','網(wǎng)站制作‘,‘2021-11-22’,33.25);
當(dāng)執(zhí)行一遍操作了之后,插入第二條相同編號的記錄時,系統(tǒng)提示錯誤,意為表中已經(jīng)有圖書編號為6625的記錄,第二條記錄不能插入。為了不想讓他提示錯誤,更換表中的值不能用插入的話我們可以用替換,也就是增刪改查中的改。也就是REPLACE語句。
數(shù)據(jù)修改(一):REPLACE INTO 表名
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??VALUES(表達(dá)式,...);
eg: 【圖書編號,圖書類型,書名,出版日期,單價,容量,封面(計算機(jī)中的地址)】
?USE Bookstore:
?REPLACE?INTO book
?????????????VALUES(? '6625','計算機(jī)',‘Dreamwearer 8’, ‘2010-08-16’,33.25,40,NULL);
數(shù)據(jù)修改(二):UPDATE?表名
?? ? ? ? ? ? ? ? ? ? ? ?????????????SET 列名1 = 表達(dá)式1[,列名2 = 表達(dá)式2,...]
????????????????????????????????????[WHERE條件](WHERE時指定的條件對符合條件的數(shù)據(jù)進(jìn)行修改,如果沒有WHERE語句則對全部數(shù)據(jù)進(jìn)行修改)
????????????????????????? ? eg:UPDATE?Book
?????????????????????????????????????????SET 數(shù)量 = 數(shù)量+10;(讓Book中的所有數(shù)據(jù)的數(shù)量都加10.因為是所有的書籍都加所以就不用WHERE了)
????????????????????????????????????UPDATE?Members
?????????????????????????????????????????SET 聯(lián)系電話 = ‘13802551234’,密碼 = ‘111111’
???????????????????????????????????????? WHERE 姓名 = ‘張三’;(如果不加張三的話就會修改全部人的聯(lián)系電話和密碼,既然不想修改全部人的聯(lián)系電話和密碼,只想修改張三的聯(lián)系電話和密碼,則用WHERE語句來指定只修改張三的信息,因為張三是字符型所以要加上‘’)
數(shù)據(jù)修改(三):UPDATE(多表修改方式)?表名1,表名2
?? ? ? ? ? ? ? ? ? ? ? ?????????????SET 列名1 =?表達(dá)式1[,列名2 = 表達(dá)式2,...]
????????????????????????????????????[WHERE 條件]
????????????????????????????????表明列表:包含了多個表的聯(lián)合,各表之間用逗號隔開,多表修改語法和其他部分與單表修改法相同。
????????????????????????????????eg:【訂單號為16的客戶因某種原因退回4本圖書,請在sell表中修改訂購冊數(shù),同時書退回后,book表中該圖書的數(shù)量要增加4本】
????????????????????????????????????UPDATE sell,book
????????????????????????????????????????????SET sell.訂購冊數(shù)=訂購冊數(shù)-4,book.數(shù)量 = 數(shù)量+4
????????????????????????????????????????????WHERE sell.圖書編號=book.圖書編號 and sell.訂單號=‘16’;(當(dāng)UPDATE修改多個表時,要修改的表明之間用逗號隔開,字段名因為涉及到多個表,用‘表名.字段名’表示,總之就是用圖書編號將兩個數(shù)據(jù)庫聯(lián)系起來,通過where來聯(lián)系起來,此時這個圖書編號就是兩個數(shù)據(jù)庫之間的外碼,且多表連接條件必須在WHERE子句中指定)
多表與單表之間的區(qū)別就是在where里用同名屬性進(jìn)行了兩個數(shù)據(jù)的連接,而且在單表的時候就不需要在每個屬性前加上表名了,我們看現(xiàn)在的表里的屬性都是sell.屬性或者book.屬性,雖然說在單表修改的時候加上也沒有關(guān)系,但是也沒有必要。
【修改數(shù)據(jù)庫的字符集和校對規(guī)則:ALTER DATABASE命令
???????????????????????????????????????????????????????alter database iboy
????????????????????????????????????????????????????????? default character set utf8
????????????????????????????????????????????????????????? ?default collate utf8_bin;】
【刪除數(shù)據(jù)庫;DROP DATABASE;
????????????????????????????daop database mom;】
刪除數(shù)據(jù)(一;單表刪除):????DELETE FROM 表名
????????????????????????????????? ????????????????? [WHERE條件]
刪除數(shù)據(jù)(二;多表刪除):????DELETE FROM 表名1,表名2
????????????????????????????????????????????????????FROM 表名列表
????????????????????????????????? ??????????????????[WHERE條件]
數(shù)據(jù)刪除(三)使用TRUNCATE TABLE語句刪除數(shù)據(jù):因為使用DELETE語句刪除會產(chǎn)生日志,不僅占內(nèi)存而且太慢了,使用這個語句進(jìn)行刪除的數(shù)據(jù)不可恢復(fù),且無日志,謹(jǐn)慎使用。如果在數(shù)據(jù)庫中參與了索引(加快查詢,增加效率)和視圖(保障數(shù)據(jù)安全的措施,在表上面生成的表),就不能用TRUNCATE來刪除,而應(yīng)該用DELETE。??????TRUNCATE TABLE 表名
以上我們介紹了數(shù)據(jù)庫的表的屬性的增刪改查,那么我們接下來來學(xué)習(xí)一下數(shù)據(jù)庫表的查詢。表的查詢分為單表查詢、多表查詢、子查詢。
單表查詢(一):SELECT語句
使用數(shù)據(jù)庫的目的是為了存儲數(shù)據(jù)以便在需要的時候進(jìn)行檢索、統(tǒng)計或組織輸出,通過SQL語句的查詢可以從表或視圖中迅速方便地檢索數(shù)據(jù)。
SELECT——要查詢的屬性(列表中要有的列)
FROM——指定表(只查詢表內(nèi)的語句)
WHERE——條件:只顯示列中滿足條件的數(shù)據(jù)
GROUP BY——對查詢出的數(shù)據(jù)進(jìn)行分組????????{列名|表達(dá)式|列編號}
HAVING——用于GROUP BY的后面,條件
ORDER BY——進(jìn)行排序????????????????????????? ?? ????{列名|表達(dá)式|列編號}
選擇指定的列????使用SELECT語句選擇一個表中的某些列的語法如:
? ? ? ? ? ? ? ? ? ? ? ? ?SELECT Z
1.選擇指定的列????使用SELECT語句選擇一個表中的某些列的語法如下:
?????? SELECT 字段列表 FROM 表名
Eg:查詢Bookstore數(shù)據(jù)庫的Members表中各會員的會員姓名,聯(lián)系電話和注冊時間。
USE Bookstore;
????????????? SELECT 會員姓名、聯(lián)系電話、注冊時間
???????????????????? FROM Members;
如果說要查詢Members表中的所有信息,是不是需要把表中所有的列都打出來呢?
不是,可以用*來代替。???????????? SELECT * FROM Members;
?
2.定義列表別名:當(dāng)需要查詢結(jié)果中的某些列或所有列顯示時使用自己選擇的列標(biāo)題時,可以在列名之后使用AS子句來更改查詢結(jié)果的列別名(例如說我們查詢學(xué)生姓名的時候表中的數(shù)值是Sname,但是你知道名字是Sname,別人可能不知道,這時候就要用AS命令)
語法格式為:????????????? SELECT 字段列名 AS 別名
Eg:查詢Book表中圖書類別為計算機(jī)的圖書書名,作何和出版社,結(jié)果中各列的標(biāo)題分別制定為name、auther和publisher。
SELECT 書名 AS name,作者 AS auther,出版社 AS publisher
FROM Book
?????? WHERE 圖書類別= “計算機(jī)”
注意!當(dāng)自定義的列標(biāo)題中含有空格時,必須用單引號將標(biāo)題括起來。
好比你的一個列名為phone number,寫成‘phone number’
3.替換查詢結(jié)果中的數(shù)據(jù):例如我們在統(tǒng)計公民信息的時候遇到大于六十歲的年齡這的數(shù)據(jù)的時候,可以讓數(shù)據(jù)輸出出來‘老年人’三個字。
Eg:要替換查詢結(jié)果中的數(shù)據(jù),則要使用查詢中的CASE表達(dá)式,格式為:
CASE
?????? WHEN 條件1 THEN 表達(dá)式1
?????? WHEN 條件2 THEN 表達(dá)式2
?????? ……
?????? ELSE 表達(dá)式
END
Eg:查詢Book表中圖書編號、書名和數(shù)量,對其庫存數(shù)量按一下規(guī)則進(jìn)行替換:若數(shù)量為空值,替換為“尚未進(jìn)貨”:若數(shù)量小于5,替換為“需進(jìn)貨”;若數(shù)量在5-50之間,替換為“庫存正?!保蝗魩齑娲笥?0,替換為“庫存積壓”。列標(biāo)題更改為“庫存”
SELECT 圖書編號,書名
CASE
????????????? WHEN 數(shù)量 IS NULL THEN ‘尚未進(jìn)貨’
????????????? WHEN 數(shù)量 < 5 THEN ‘需進(jìn)貨’
????????????? WHEN 數(shù)量 >=5 and 數(shù)量 <=50 THEN ‘庫存正常’
????????????? ELSE ‘庫存積壓’
?????? END AS 庫存
FROM Book;
4.計算列值:使用SELECT對列進(jìn)行時查詢時,在結(jié)果中可以輸出對列值計算后的值,即SELECT子句可使用表達(dá)式作為結(jié)果,格式為:SELECT 表達(dá)式1【表達(dá)式2……】
Eg:對Sell表已發(fā)貨的記錄計算訂購金額(訂購金額=訂購冊數(shù)*訂購單價),并顯示圖書編號和訂購金額
SELECT 圖書編號,訂購冊數(shù)*訂購單價AS 訂購金額
?????? FROM Sell
?????? WHERE 發(fā)貨狀況 = ‘已發(fā)貨’
5.消除結(jié)果集中的重復(fù)行:對表只選擇某些列時,可能會出現(xiàn)重復(fù)行。例如,若對XSCJ數(shù)據(jù)庫的XS表中選擇專業(yè)名和總學(xué)分,則出現(xiàn)多行重復(fù)的情況。可以用DISTINCT或DISTINCTOW關(guān)鍵字消除結(jié)果集中的重復(fù)行,
其格式是:SELECT DISTINCT 字段列表
????????????? ? 其含義是對結(jié)果集中的重復(fù)行只選擇一個,保證行的唯一性
Eg:對Book表中只選擇圖書類別和出版社,消除結(jié)果集中的重復(fù)行
?????? SELECT DISTINCT 圖書類別,重復(fù)行
????????????? FROM Book;
WHERE比較運(yùn)算的例子
1.??? 查詢Bookstore數(shù)據(jù)庫Book表中書名為“網(wǎng)頁程序設(shè)計”的記錄
SELECT * FROM Book
??????? WHERE 書名=‘網(wǎng)頁程序設(shè)計’;
2.??? 查詢Book表中單價大于30的圖書情況。
SELECT * FROM Book
?????? WHERE 單價>30;
邏輯運(yùn)算:通過邏輯運(yùn)算符(AND、OR、XOR和NOT)組成更為復(fù)雜的查詢條件。邏輯運(yùn)算的結(jié)果是“1”或“0”,分別表示“True”或“False”。
1.??? 查詢Sell表中已收貨且已結(jié)清的訂單情況
SELECT 訂單號,是否收貨,是否結(jié)清 FROM Sell
?????????????? WHERE 是否收貨=“已收貨” AND 是否結(jié)清=‘已結(jié)清’;
2.??? 查詢Book表中清華大學(xué)出版社和北京大學(xué)出版社出版的價格大于25元的圖書。
SELECT * FROM Book
?? WHERE (出版社=‘清華大學(xué)出版社’OR出版社=‘北京大學(xué)出版社’)
?????????????? AND 單價 >=25;
或
SELECT * FROM Book
??????? WHERE (出版社=‘清華大學(xué)出版社’ AND 單價>25)
?????????????? OR(出版社=‘北京大學(xué)出版社’ AND 單價>25);
思考:那么如果把例一的括號去掉可不可呢?答案是不可以,因為AND的優(yōu)先級高于OR。
LIKE運(yùn)算符
模式匹配(LIKE運(yùn)算符):LIKE運(yùn)算符用于支出一個字符是否與指定的字符串相匹配,其對象可以使char、varchar、text、datETIMe等類型的數(shù)據(jù),返回邏輯值TRUE或FALSE
使用LIKE進(jìn)模式匹配時,常使用特殊符號_和%進(jìn)行模糊查詢。
%代表0到多個字符,而_代表單個字符。
1.??? 查詢Members表中姓”張”的會員的身份證號,姓名以及注冊時間
SELECT 用戶號,會員姓名,注冊時間 FROM???? Members
??????? WHERE 會員姓名 LIKE ‘張%‘;
2.??? 查詢Book表中圖書編號倒數(shù)第二位為T的圖書的圖書編號和書名
SELECT 圖書編號,書名 FROM Book
??????? WHERE 圖書編號 LIKE ‘%T_’;
子查詢
在查詢條件中,可以使用另一個查詢的結(jié)果作為條件的一部分,例如,判定列值是否與某個查詢的結(jié)果集中的值相等,作為查詢條件一部分的查詢成為子查詢。SQL標(biāo)準(zhǔn)允許SELECT多層次嵌套使用,用來表示復(fù)雜的查詢,子查詢除了可以在SELECT語句中,還可以用在INSERT、UPDATE以及DELETE語句中。
子查詢通常與IN、EXIST謂詞以及比較運(yùn)算符結(jié)合使用。
(1)IN子查詢
IN子查詢用于進(jìn)行一個給定值是否在子查詢結(jié)果集中的判定。
例子:查找在Bookstore數(shù)據(jù)庫中張三的訂單信息
SELECT *
????FROM Sell
????????WHERE 用戶號 IN
????????(SELECT 用戶號 FROM Members
????????????????????????????????WHERE 會員姓名 = “張三”);
子查詢嵌套舉例
IN子查詢只能返回一列數(shù)據(jù)。對于比偶叫復(fù)雜的查詢,可以使用嵌套的子查詢。
例子:查找購買除了“網(wǎng)頁程序設(shè)計”以外圖書的會員信息。要查找會員信息,先要知道會員的身份證號,而要知道購買了“網(wǎng)頁程序設(shè)計”以外圖書的會員,可以按圖書編號在Sell表中查到,但是"網(wǎng)絡(luò)程序設(shè)計"的圖書編號要通過查找Book才可以獲得。
SELECT * FROM Members WHERE 用戶號 IN
(SLEECT 用戶號 FROM Sell WHERE 圖書編號 NOT IN)
????(SELECT 圖書編號 FROM Book WHERE 書名=‘網(wǎng)頁程序設(shè)計’));
SELECT子句的表達(dá)式中還可以包含所謂的聚合函數(shù)。聚合函數(shù)常擦好難過用于對一組值進(jìn)行計算,然后返回單個值。
COUNT????求組中項數(shù),返回int類型整數(shù)
求元組的個數(shù),例如求學(xué)生成績大于70分的人數(shù),用于統(tǒng)計組中滿足條件的行數(shù)和總行數(shù),返回SELECT語句檢測到的行中非NULL值的數(shù)目,若找不到匹配的行,則返回0。
語法格式為:? ? COUNT ({[ ALL | DISTINCT]表達(dá)式} | *)
例子:求會員總?cè)藬?shù)
SELECT COUNT(*) AS ‘會員數(shù)’? ?FROM Members;
例子:統(tǒng)計已結(jié)清的額訂單數(shù)
SELECT COUNT(是否結(jié)清) AS ‘已結(jié)清的訂單數(shù)’????FROM Sell;
例子:統(tǒng)計訂購冊數(shù)在5以上的訂單數(shù)
SELECT COUNT(訂購冊數(shù)) AS ‘訂購冊數(shù)在5以上的訂單數(shù)’
????FROM Sell
????????WHERE 訂單冊數(shù)>5;
MAX and MIN????MAX和MIN分別用于求表達(dá)式中所有值項的最大值與最小值。
SUM and AVG????SUN和AVG分別用于求表達(dá)式的和和平均。
GROUP BY子句主要用于根據(jù)字段對行分組。
例如,根據(jù)學(xué)生所學(xué)的專業(yè)對XS表中的所有行分組,結(jié)果是每個專業(yè)的學(xué)生成為一組。
例子:輸出Book表中圖書類別名
SELECT 圖書類別 FROM Book? GROUP BY 圖書類別;
HAVING子句的目的與WHERE子句類似,不同的是WHERE子句是用在FROM子句之后選擇行,而HAVING子句用在GROUP BY子句后選擇行。?
例子:查找Sell表中每個會員平均訂購冊數(shù)在10本以上的會員的用戶號和平均訂購冊數(shù)。
SELECT 用戶號,AVG(訂購冊數(shù)) AS ‘平均訂購冊數(shù)’
????FROM Sell
????????GROUP BY 用戶號
????????????HAVING AVG(訂購冊數(shù)) >10;
單元練習(xí):
選擇題
(B)是存儲在計算機(jī)內(nèi)有結(jié)構(gòu)的數(shù)據(jù)的集合
A.數(shù)據(jù)庫系統(tǒng)
B.數(shù)據(jù)庫
C.數(shù)據(jù)庫管理系統(tǒng)
D.數(shù)據(jù)結(jié)構(gòu)
?
數(shù)據(jù)庫的特點之一是數(shù)據(jù)的共享,嚴(yán)格的講這里的數(shù)據(jù)共享是指(D)
A.??? 同一個應(yīng)用中的多個程序共享一個數(shù)據(jù)集合
B.???? 多個用戶,同一種語言共享數(shù)據(jù)
C.??? 多個用戶共享一個數(shù)據(jù)文件
D.??? 多種應(yīng)用、多種語言、多個用戶互相覆蓋地使用數(shù)據(jù)集合
?
在數(shù)據(jù)庫中存儲的是(C)
A.??? 數(shù)據(jù)
B.???? 數(shù)據(jù)模型
C.??? 數(shù)據(jù)及數(shù)據(jù)之間的聯(lián)系
D.??? 信息
?
數(shù)據(jù)庫(DB)、數(shù)據(jù)庫系統(tǒng)(DBS)和數(shù)據(jù)庫管理系統(tǒng)(DBMS)之間的關(guān)系是(A)
A.??? DBS包括DB和DBMS
B.???? DBMS包括DB和DBS
C.??? DB包括DBS和DBMS
D.??? DBS就是DB,也就是DBMS
?
下列選項中不是關(guān)系數(shù)據(jù)庫基本特征的是(A)
A.??? 不同的列應(yīng)有不同的數(shù)據(jù)類型
B.???? 不同的列應(yīng)有不同的列名
C.??? 與行的次序無關(guān)(變動行的位置,例如說張三在李四的前面我們反過來)
D.??? 與列的次序無關(guān)(變動列的位置,例如說張三在李四的下面我們反過來)
?
SQL語言是(B)的語言,容易學(xué)習(xí)
A.??? 過程化
B.???? 非過程化
C.??? 格式化
D.??? 導(dǎo)航式
#就好比你上學(xué)來,我無需關(guān)心你是怎么來的,不注重過程,只注重你是否來了,因此易學(xué)。
?
下列關(guān)于MySQL的說法中,錯誤的是(D)
A.??? MySQL是一款關(guān)系數(shù)據(jù)庫系統(tǒng)
B.???? MySQL是一款網(wǎng)絡(luò)數(shù)據(jù)庫系統(tǒng)
C.??? MySQL可以在Linux或者Windows下運(yùn)行
D.??? MySQL對SQL的支持不是太好
#MySQL本身就是一個SQL語言,怎么可以說對SQL語句不友好呢
?
關(guān)系數(shù)據(jù)的基本數(shù)據(jù)結(jié)構(gòu)是(C)
A.??? 數(shù)據(jù)庫
B.???? 關(guān)系模式
C.??? 關(guān)系
D.??? 元組或記錄
?
下列四項中,不屬于數(shù)據(jù)庫系統(tǒng)的主要特點是(D)
A.??? 數(shù)據(jù)結(jié)構(gòu)化
B.???? 數(shù)據(jù)的冗余度小
C.??? 較高的數(shù)據(jù)獨立性
D.??? 程序的標(biāo)準(zhǔn)化
?
在(A)中一個節(jié)點可以有多個雙親,節(jié)點之間可以有多種聯(lián)系
A.??? 網(wǎng)狀模型
B.???? 關(guān)系模型
C.??? 層次模型
D.??? 以上都有
# 關(guān)系模型是一個二維表,不涉及雙親。層次模型是一個節(jié)點只有一個父節(jié)點,不涉及雙親。
?
學(xué)生關(guān)系模型S(SNO,SNAME,SEX,AGE),S的屬性分別表示學(xué)生的學(xué)號、姓名、性別、年齡。要在表S中刪除屬性AGE,可選用的SQL語句是(A)
A.??? DELECT AGE FROM S
B.???? ALTER TABLE S DROP AGE
C.??? UPDATE S AGE
D.??? ALTER TABLE S AGE
?
數(shù)據(jù)庫類型是按照(C)來進(jìn)行劃分的
A.??? 文件形式
B.???? 記錄形式
C.??? 數(shù)據(jù)類型
D.??? 數(shù)據(jù)存取方式
?
關(guān)系模式的任何屬性(A)
A.??? 不可再分
B.???? 可再分
C.??? 命名可以不唯一
D.??? 以上都不對
#滿足關(guān)系模式或關(guān)系模型的最基本的要求就是大表里面不可以再套小表。
?
概念模型通過(D)來表示數(shù)據(jù)庫系統(tǒng)的結(jié)構(gòu)
A.??? E-R圖中的實體
B.???? 實體的屬性
C.??? 實體之間的關(guān)系
D.??? 以上都對
數(shù)據(jù)庫的基本特點包括(D)
A.??? 數(shù)據(jù)共享性高,冗余度低
B.???? 數(shù)據(jù)獨立性高
C.??? 數(shù)據(jù)結(jié)構(gòu)化
D.??? 以上都對
?
判斷題
1.???? (√)在文件系統(tǒng)中,不容易做到數(shù)據(jù)共享,在數(shù)據(jù)庫系統(tǒng)中,容易做到數(shù)據(jù)共享
2.???? (×)關(guān)系是靜態(tài)的、穩(wěn)定的,關(guān)系模式是動態(tài)的,隨時間變化
#說反了,關(guān)系模式是一個靜態(tài)的、穩(wěn)定的,比如說學(xué)校的學(xué)生表,里面有學(xué)號與性別等等的這些屬性是一個關(guān)系模式,這個是不變的,而表中的數(shù)據(jù)是隨時變的。
我們說一個關(guān)系是一個表,這個表是隨時都可以更新的,不斷地有新生加入老生離開,這個表就是一個動態(tài)的,隨時變化的,而關(guān)系模式才應(yīng)該是靜態(tài)的,穩(wěn)定的。
3.???? (×)關(guān)系模式要求最低要滿足2NF
#NF是范式的意思,關(guān)系模式有三個范式,最低要滿足第一范式,也就是1NF,大表不得套小表。
4.???? (√)關(guān)系模式是用二維表表示實體集屬性間關(guān)系以及實體集之間聯(lián)系的模型
?
填空題
1.???? 關(guān)系模型主要特征是用(二維表)結(jié)構(gòu)表達(dá)實體集,用外鍵表示實體間的關(guān)系
2.???? 關(guān)系中的每一行成為(元組),每一列稱為(屬性)
3.???? 數(shù)據(jù)的加工是一個逐步轉(zhuǎn)化的過程,其經(jīng)歷了現(xiàn)實世界、信息世界和計算機(jī)世界這3個不同的世界,其數(shù)據(jù)模型與之對應(yīng)分成(實體模型)(概念模型)和(數(shù)據(jù)模型)。
#順序不能前后顛倒,實體對應(yīng)現(xiàn)實,信息對應(yīng)概念,計算機(jī)對應(yīng)數(shù)據(jù)。
4.???? 創(chuàng)建、修改和刪除數(shù)據(jù)庫的命令分別是(create)DATABASE、(alter)DATABASE和(drop)DATABASE
5.???? DBMS是指(數(shù)據(jù)庫操作系統(tǒng)),它是位于用戶和(操作系統(tǒng))之間的一層管理軟件
6.???? 數(shù)據(jù)庫系統(tǒng)一般由(數(shù)據(jù)庫)、(數(shù)據(jù)庫管理系統(tǒng))、應(yīng)用系統(tǒng)、數(shù)據(jù)庫管理員和用戶組成
7.???? 按照數(shù)據(jù)結(jié)構(gòu)的類型來命名,邏輯模型分為層次模型、(關(guān)系模型)和(網(wǎng)狀模型)。
?
簡答題
為某百貨公司設(shè)計一個E-R模型
百貨公司管轄若干連鎖店,每家商店經(jīng)營若干商品,每家商店有若干員工,但每個職工只能服務(wù)于一家商店。
實體類型“商店”的屬性包括:店號、店名、店址和店經(jīng)理
試題類型“商品”的屬性包括:商品號、品名、單價和產(chǎn)地
實體類型“職工”的屬性包括:工號、姓名、性別和工資
在聯(lián)系中反映出職工參加某商店工作的開始時間、商店銷售商品的月銷售量。
畫出反映商店、商品、職工實體類型及聯(lián)系的E-R圖并將其轉(zhuǎn)換成關(guān)系模式集。

2.假設(shè)數(shù)據(jù)庫Bookstore中已經(jīng)存在table1表,將table1表重命名為student。
USE Bookstore;
rename table table1 to student;
下一章——數(shù)據(jù)視圖
我們在建立大型的數(shù)據(jù)庫時,針對不同的用戶,例如說教務(wù)處比較關(guān)注的是表中的成績,學(xué)生辦關(guān)注的是課程,不同的受眾人群關(guān)注的數(shù)據(jù)庫中的點就不一樣。又或者一個數(shù)據(jù)庫有些部分是不能被人查看的,這種情況下就會出現(xiàn)我們這一章所要講解的數(shù)據(jù)視圖,它類似于一個窗口,哪扇窗口對哪些用戶敞開,能夠?qū)?shù)據(jù)庫進(jìn)行一些操作,但是數(shù)據(jù)視圖本身是不存在數(shù)據(jù)的,它是用來對數(shù)據(jù)庫進(jìn)行的一個操作。
我們要學(xué)會創(chuàng)建視圖,然后我就就需要了解對視圖的操作(增刪改查)。
視圖
視圖是數(shù)據(jù)庫的用戶使用數(shù)據(jù)庫的觀點。例如對于一個學(xué)校,其學(xué)生的情況存于數(shù)據(jù)庫的一個表或多個表中,而作為學(xué)校的不同職能部門,所關(guān)心的學(xué)生數(shù)據(jù)的內(nèi)容是不同的。即使是同樣的數(shù)據(jù),也可能有不同的操作要求,于是就可以根據(jù)他們的不同需求,在物理的數(shù)據(jù)庫上定義他們對數(shù)據(jù)庫所要求的數(shù)據(jù)結(jié)構(gòu),這根據(jù)用戶觀點所定義的數(shù)據(jù)結(jié)構(gòu)就是視圖。
視圖與表是不同的,視圖是一個虛表(虛表的意思是沒有實際的數(shù)據(jù)的表,無法進(jìn)行存儲于刪改,就像是一個窗口,用來觀察數(shù)據(jù)表中的數(shù)據(jù))。
視圖是從一個或多個表(或視圖)導(dǎo)出的表。視圖一經(jīng)定義以后,就可以像表一樣被修改、刪除、查詢或更新等。
視圖的優(yōu)點
屏蔽數(shù)據(jù)庫的復(fù)雜性。用戶不必了解復(fù)雜的數(shù)據(jù)庫中的表結(jié)構(gòu),并且數(shù)據(jù)庫表的更改也不影響用戶對數(shù)據(jù)庫的使用,
簡化用戶權(quán)限的管理。秩序授予用戶使用視圖的權(quán)限么不必指定用戶只能使用表的特定列,也增加了安全性。
標(biāo)語數(shù)據(jù)共享,各個用戶不必定義和存儲自己所需的數(shù)據(jù),可以共享數(shù)據(jù)庫的數(shù)據(jù),這樣同樣的數(shù)據(jù)只需存儲一次。
如何創(chuàng)建視圖呢?
使用CREATE VIEW語句創(chuàng)建視圖
CREATE VIEW 視圖名【列名表名】 AS select語句 WITH CHECK OPTION;
列名列表:要想為誰的列定義明確的名稱,可以使用可選的列名列表字句,列出有逗號隔開的列名。列名列表中的名稱數(shù)目必須等于SELECT語句檢索到的列數(shù)。
例子:創(chuàng)建Bookstore數(shù)據(jù)庫上的jsj_sell視圖,包括計算機(jī)類圖書的銷售的訂單號,圖書編號,書名,訂購冊數(shù)等情況。要保證對該視圖的訂單修改都要符合計算機(jī)類這個條件。
CREATE VIEW jsj_sell AS?
SELECT 訂單號,Sell.圖書編號,書名,訂購冊數(shù)
FROM Book,Sell
WHERE Book.圖書編號=Sell.圖書編號
AND Book.圖書類別=“計算機(jī)”
WITH CHECK OPTION;
例二:
查找平均訂購冊數(shù)大于5本的訂購客戶的用戶號和平均訂購冊數(shù)。
我們可以先創(chuàng)建客戶平均訂購視圖kh_avg,包括用戶號(在試圖中列名為userID)和平均訂購冊數(shù)(在視圖中列名為oreder_avg)。
創(chuàng)建客戶品平均訂購視圖kh_avg:
CREATE VIEW kh_avg(userID,order_avg)
AS
SELECT 用戶號,AVG(訂購冊數(shù))
FROM Sell?
GROUP BY 用戶號
再對kh.avg視圖進(jìn)行查詢。
SELECT *
FROM kh_avg
WHERE order_avg>5;
可更新視圖(操作視圖)
要通過視圖更新基本表數(shù)據(jù),必須保證視圖是可更新視圖,即可以再INSET、UPDATE或DELETE等語句當(dāng)中使用它們。對于可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關(guān)系。還有一些特定的其他結(jié)構(gòu),這類結(jié)構(gòu)會使得視圖不可更新。
插入數(shù)據(jù):使用INSERT語句通過視圖向基本表插入數(shù)據(jù)。
當(dāng)試圖所依賴的基本表有多個時,不能向該視圖插入數(shù)據(jù),因為這將會影響多個基本表。說白了是因為每個表的列數(shù)可能不一樣。
修改數(shù)據(jù):使用UPDATE語句可以通過視圖修改基本表的數(shù)據(jù)。
例子:將jsj_book視圖中所有單價降低5%。
UPDATE jsj_book SET 單價=單價*(1-0.05);
該語句實際上是將jsj_book視圖所依賴的基本表book中所有計算機(jī)單價降低百分之五。
若一個表依賴于多個基本表,則依次修改該視圖只能變動一個基本表的數(shù)據(jù),說白了就是要一個表一個表的改。
刪除數(shù)據(jù):使用DELETE語句可以通過視圖刪除基本表的數(shù)據(jù)
刪除jsj_book中“中國青年出版社”的記錄
DELETE FROM jsj_book
????WHERE 出版社=‘中國青年出版社’
對依賴于多個基本表的視圖,不能使用DELETE語句。例如,不能通過對jsj_sell視圖執(zhí)行DELETE語句二刪除與之相關(guān)的基本表Book以及Sell表的數(shù)據(jù)。(drop是刪除表,在這里也就是刪除視圖,于delete不一樣)
修改表結(jié)構(gòu):ALERT語句可以對已有視圖的定義進(jìn)行修改
語法格式:ALTER VIEW 視圖名[列名列表] AS select語句
例子:將jsj_book視圖修改為包含計算機(jī)類圖書的圖書編號、書名和單價(也就是說這個視圖原來的類別可能有生物有化學(xué)有計算機(jī),經(jīng)過這一操作就只剩下計算機(jī)了)。
ALTER VIEW jsj_book?AS SELECT 圖書編號,書名,單價
FROM Book WHERE 圖書類別=‘計算機(jī)’;
使用SQL中的DROP語句刪除視圖(使用DRIO VIEW 一次可以刪除多個視圖)
語法格式:DROP VIEW [IF EXISTS] 視圖名1 [視圖名2]
IF EXISTS是用來如果表中沒有的話不會報錯的功能
下面我們再來做一些題來復(fù)習(xí)一下前面的知識(比較難的題我會標(biāo)紅?。?/p>
用于范圍比較的關(guān)鍵字有兩個,分別是(BEWTEEN 和 IN)
補(bǔ)充一下,我們說BETWEEN和AND應(yīng)該是算是一個
判斷題
使用UPDATE語句更新表中的數(shù)據(jù)時,一次只能更新一個字段中的數(shù)據(jù)(×)
省略了WHERE字句的DELETE語句將刪除表中的所有數(shù)據(jù)(√)
一個HAVING子句必須位于GROUP BY子句之后,ORDER BY子句之前(√)
當(dāng)在SELETE語句指定列的位置上使用*號時,表示選擇表的所有列(√)
對表只選擇某列,可能會出現(xiàn)重復(fù)行,可用UPDATE關(guān)鍵字清除結(jié)果集中的重復(fù)行(×)
索引與數(shù)據(jù)完整性約束的創(chuàng)建
索引與我們之前創(chuàng)建的表與視圖差不多,并沒有太大的區(qū)別。
顧名思義,我們這一章節(jié)的知識點分為索引與數(shù)據(jù)完整性約束。
什么是索引?索引相當(dāng)于我們讀書時所用到的目錄,一看目錄就知道要看翻到第幾頁,例如說我們?nèi)绻腥宋磥硪獜氖掠诖髷?shù)據(jù)方面的工作,我們在查看某項內(nèi)容的時候我們只需要查看索引就知道查看哪個內(nèi)容了。
什么是數(shù)據(jù)完整性?數(shù)據(jù)完整性要與數(shù)據(jù)正確性區(qū)分。數(shù)據(jù)正確性的意思是我輸入的數(shù)據(jù)是正確的,例如我們在輸入性別這一欄的時候只有男女兩個選項,你輸入一個姓名肯定是不正確的。數(shù)據(jù)的完整性是說要保證數(shù)據(jù)列沒有空值。
索引——是一種提高查找速度的機(jī)制。
索引用來快速地尋找某些具有特定值的幾率,如果沒有索引,執(zhí)行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直接找到符合要求的幾率,表里面的記錄數(shù)量越多,這個操作的代價就越高。
索引提供指針以指向存儲在表中指定列的數(shù)據(jù)值,然后根據(jù)指定的排序次序排列這些指針,數(shù)據(jù)庫使用索引的方式與使用書的目錄很相似:通過搜索索引找到特定的值,然后跟隨指針到達(dá)包含該值得行。
如果作為搜索條件得裂傷已經(jīng)創(chuàng)建了索引,MySQL無需掃描任何記錄即可迅速找到目標(biāo)記錄所在的位置。
例如說有一張學(xué)生表,學(xué)生表以學(xué)號作為主鍵,表里還有姓名性別年齡列。
通過建立索引文件,產(chǎn)生了學(xué)號和記錄號兩個列。記錄號是1234......,索引并不一定是順序的,但是學(xué)號一定是按順序從小到大的,記錄號是學(xué)號在學(xué)生表中出現(xiàn)的行號。當(dāng)我們想找到第一萬行同學(xué)的數(shù)據(jù),直接通過查找第一萬行就可以了。
索引為什么可以加快查找速度?
索引后,中和鎮(zhèn)在索引文件中順序移動
索引文件中記錄是有序的
有序后,可以用各種方法加快查詢速度,如折半(二分)查找法,而排序前,只能順序查找記錄(還有B樹索引示意圖)
索引的分類
普通索引(INDEX)
這是最基本的索引類型,它沒有唯一性之類的限制。創(chuàng)建普通索引的關(guān)鍵字是INDEX。
唯一性索引(UNIQUE)
這種索引和前面的普通索引基本相同,但有一個區(qū)別:索引列的所有值都只能出現(xiàn)一次,即必須是唯一的。創(chuàng)建唯一索引的關(guān)鍵字是UNIQUE。
主鍵(PRIMARY KEY)
主鍵是一種唯一性的索引,它必須指定為“PRIMARY KEY”。主鍵一般在創(chuàng)建標(biāo)表的時候指定,也可以通過修改表的方式加入主鍵。每個表只能有一個主鍵。
全文索引(FULLTEXT)
MySQL支持全文檢索和全文索引。全文索引的索引類型為FULLTEXT。全文索引只能在VARCHAR或TEXT類型的列上創(chuàng)建,且只能在MyISAM表中創(chuàng)建。MyISAM是一個存儲引擎,這個我們再往后點會講,大家先以了解為主哈。
創(chuàng)建索引
使用CREATE INDEX語句
使用CREATE INDEX 語句可以在一個已有表上創(chuàng)建索引,一個表可以創(chuàng)建多個索引。
CREATE 【UNIQUE/FULLTEXT】INDEX 索引名 ON 表名 【列名【長度】】【排序】
說明:
【】中的內(nèi)容是判斷你要創(chuàng)建一個全文索引還是一個唯一性索引,若無即是一個普通索引。
索引名:索引的名稱,索引名在一個表中名稱必須是唯一的。
列名:表示創(chuàng)建索引的這個列名。
長度:表示使用列的前多少個字符創(chuàng)建索引。使用列的一部分創(chuàng)建索引可以索引文件大大減小,從而節(jié)省磁盤空間。
例子1:根據(jù)Book表的署名列上的前六個字符創(chuàng)建一個升序索引name_book。
CREATE INDEX name_book ON Book(書名(6) ASC);?????#ASC是升序的意思
可以在一個索引的定義中包含多個列,中間用逗號隔開,但是它們要屬于同一個表,這樣的索引叫做符合索引。
例子2:在Sell表的用戶號列和圖書編號列上建立一個符合索引sfz_bh_sell。
CREATE INDEX sfz_bh_sell ON Sell(用戶號,圖書編號);
我們學(xué)習(xí)完創(chuàng)建索引后我們來看一下如何修改這個索引,準(zhǔn)確的說是在修改表的時候如何來添加索引。
使用ALTER TABLE語句修改表,其中也包括向表中添加索引。
ALTER TABLE 表名
????ADD INDEX 索引名【列名】
例子:在Book表的書名列上創(chuàng)建一個普通索引
ALTER?TABLE Book
????????????????ADD INDEX sm_book(書名);
例子2:假設(shè)Book表中主鍵未設(shè)定,為Book表創(chuàng)建以圖書編號為主鍵的索引,出版社和出版時間為復(fù)合索引,以加速表的檢索速度。
ALTER TABLE Book
ADD PRIMARY KEY(圖書編號),
ADD INDEX mark(出版社,出版時間);
這個例子中既包含PRIMARY KEY,也包含復(fù)合索引,說明MySQL可以同時創(chuàng)建多個索引。記住,使用PRIMARY KEY的列,必須是一個具有NOT NULL屬性的列。
如果想要查看表中創(chuàng)建的索引的情況,可以使用SHOW INDEX FROM tbl_name語句,例如:SHOW INDEX FROM book;
前面兩種情況都是在創(chuàng)建完表后創(chuàng)建的索引,索引也可以與表一同創(chuàng)建,在創(chuàng)建表的CREATE TABLE語句中可以包含索引的定義。
CREATE TABLE 表名【列名,...|[索引項]】
例子:創(chuàng)建sell_copy表的語句如何,sell_copy表帶有身份證號和圖書編號的聯(lián)合主鍵,并在訂購冊數(shù)上創(chuàng)建索引。
CREATE TABLE sell_copy(
????????身份證號 CHAR(18) NOT NULL,
????????圖書編號 CHAR(20) NOT NULL,
????????訂購冊數(shù) INT(5),
????????訂購時間 DATETIME,
????????PRIMARY KEY(身份證號,圖書編號)????? ??
????????INDEX dgcs(訂購冊數(shù)));
#如果你創(chuàng)建的不是聯(lián)合索引,也就是說只有一個主鍵,可以直接在你要創(chuàng)建的唯一的主鍵的NOT NULL 后面直接加PRIMARY KEY,當(dāng)然你也可以寫在下面,但若是多列必須放下面。
刪除索引
1. 使用DROP INDEX語句刪除索引
????DROP INDEX 索引名 ON 表明
????例子:DROP INDEX sm_book ON Book;
????我們先來區(qū)分一下ALTER和UPDATE,ALTER是用來修改表的,UPDATE是用來區(qū)分?jǐn)?shù)據(jù)的。
????DROP 是用來刪除數(shù)據(jù)的,在我們這里也可以刪除索引,delete是用來刪除表的,但是可以恢復(fù),不可恢復(fù)的話還得用truncate。
2. 使用ALTER TABLE語句刪除索引????????????ALTER TABLE 表名
索引對查詢的影響
索引在微量數(shù)據(jù)庫的內(nèi)容的情況下有無是體會不到的,可當(dāng)一個表里有成千上萬行數(shù)據(jù)的時候,差異就非常明顯了。當(dāng)執(zhí)行涉及多個表的連接查詢時,索引將更有價值。
索引的弊端
索引以文件的形式存儲,索引文件要占用磁盤空間,若有大量的索引,索引文件可能比數(shù)據(jù)文件更快地達(dá)到最大的文件尺寸。其次我們在更新表中索引列上的數(shù)據(jù)時,對索引也需要更新,這可能需要重新組織一個索引,若表中的索引很多,這是很浪費(fèi)時間的。也就是說,這樣就降低了添加、刪除、修改和其它寫入操作的效率。表中的索引越多,則更新表的事件就越長。但是這樣的弊端并不會妨礙索引的應(yīng)用,因為索引帶來的好處完全大于其弊端,利大于弊。在表中有很多行數(shù)據(jù)的時候,索引通常是不可缺少的。
數(shù)據(jù)完整性的約束(讓數(shù)據(jù)更合法、更合規(guī))
建表的時候或者說建立表里的一些屬性的時候都會有一些約束條件,這些約束條件我們就成為數(shù)據(jù)完整性約束,數(shù)據(jù)完整性要與數(shù)據(jù)正確性相區(qū)分,數(shù)據(jù)正確性的意思是例如我們要輸入張三而你輸入了王五這就是錯誤的,而數(shù)據(jù)完整性是區(qū)別于數(shù)據(jù)正確性的約束。
實體完整性(Entity Integrity):針對于行來說的,行對行的約束成為實體完整性
例如說一張表由學(xué)號、姓名、地址組成,此時你插入了一個學(xué)生的信息結(jié)果該插入的學(xué)生的學(xué)號在表里已經(jīng)存在了,那你就無法插入到該表當(dāng)中。
約束方法:唯一約束與主鍵約束????????????????????????????約束類型:Primary Key或Unique
域完整性(Domain Integrity):列與列之間的約束是域完整性
假如說有一個學(xué)生信息表里的學(xué)生id規(guī)定是七位數(shù),而此時你要插入一個十位數(shù)的學(xué)號你將無法插入到其中。
約束方法:限制數(shù)據(jù)類型(int或varchar......)、檢查約束、外鍵約束、默認(rèn)值、非空值
約束類型:Default或Check????????????????????????????
參照完整性(Referential Integrity):表與表之間的關(guān)系稱之為參照完整性
之前所降到的域完整性或者是實體完整性都是針對于單表而言的,而參照完整性是以表與表之間進(jìn)行約束,例如說有一個表1(學(xué)號,姓名,地址)和表2(科目,學(xué)號,分?jǐn)?shù)),表2的學(xué)號是參照表1,而此時你要在表2里插入一個數(shù)據(jù)(數(shù)學(xué),001200,98),若該學(xué)號在表2里沒有出現(xiàn)那么按理來說是可以插入的,但是此時表2的學(xué)號是與表1的學(xué)號進(jìn)行了一個約束,如果表1里沒有該值那么將無法插入。???????????約束方法:外鍵約束? ? ? ? ? ? ? 約束類型:Foreign Key
用戶定義的完整性(User-defined Integrity)
針對不同的環(huán)境或項目有一些特殊的要求,滿足該特殊要求即是用戶自定義的完整性
例如說有一張學(xué)生表,我們想建立一張所有學(xué)生大于成績大于70的表,那么那些考七十分以下的學(xué)生都不會出現(xiàn)在該表當(dāng)中
主鍵約束
主鍵就是表中的一列或多個列的一組,其值能唯一地標(biāo)志表中的每一行。通過定義PRIMARY KEY約束來創(chuàng)建主鍵,而且PRIMARY KEY約束中的列不能取空值。由于PRIMARY KEY約束能夠確保數(shù)據(jù)的唯一,所以經(jīng)常用來定義標(biāo)志列。當(dāng)為表定義PRIMARY KEY約束時,MySQL為主鍵列所創(chuàng)建唯一性索引,實現(xiàn)數(shù)據(jù)的唯一性,在查詢中使用主鍵時,該索引可用來對數(shù)據(jù)進(jìn)行快速訪問。我們還可以選取兩列數(shù)據(jù)設(shè)置為主鍵,我們在定義主鍵的時候有兩種方式,一種是作為列的完整性約束,另一種是作為表的完整性約束。列的完整性約束就是說在創(chuàng)建表的時候我們設(shè)置列名和約束(int...),我們可以直接在后面加上PRIMARY KEY這個就是列級完整性約束條件,而如果說你想創(chuàng)建兩個列作為主鍵,你會發(fā)現(xiàn)無法在創(chuàng)建的列的后面加上PRIMARY KEY,你必須創(chuàng)建完表后再下面進(jìn)行設(shè)置才可以設(shè)置多列的主鍵,使用方法就是在設(shè)置完列后單起一行(PRIMARY KEY(主鍵1,主鍵2...),表級完整性無法放在列的后面,只能單起一行,這個就是表級的完整性約束條件。
主鍵約束原則:原則上,任何列或者列的組合都可以充當(dāng)一個主鍵。但是主鍵列必須遵守一些規(guī)則,這些規(guī)則源自于關(guān)系模型理論和MySQL所制定的規(guī)則。
ALTER TABLE語句添加約束舉例
加上Book表中主鍵未設(shè)定,為Book表建立以圖書編號為主鍵的約束,以書名唯一性約束。
ALTER TABLE Book ADD PRIMARY KEY(圖書編號) ADD UNIQUE u_idx(書名);
這個例子中既包括主鍵約束,也包括唯一性約束,說明MySQL可以同時創(chuàng)建多個約束。記住你在設(shè)置唯一約束的時候這個列必須是NOT NULL非空的。(刪除約束用DROP)
如果你想要查看表中創(chuàng)阿金的額約束的情況,可以使用SHOW INDEX FROM tbl_name語句。例如:SHOW INDEX FROM book;
替代鍵和主鍵的區(qū)別
一個表只能創(chuàng)建一個主鍵,但是一個表可以有若干個UNIQUE鍵,并且他們可以重合,例如說在C1和C2列上定義一個替代鍵,并且在C2和C3上定義了另一個替代鍵,這兩個替代鍵在C2列上重合了,而MySQL允許這樣。
主鍵的字段的值不允許為NULL,而UNIQUE字段的值可以取NULL,但是必須使用NULL或NOT NULL聲明。
一般創(chuàng)建PRIMARY KEY約束時,系統(tǒng)會自動產(chǎn)生PRIMARY KEY索引。
參照完整性約束舉例
創(chuàng)建表的同時創(chuàng)建外鍵:CREATE TABLE 表名 | [外鍵定義]
對已有表創(chuàng)建外鍵:ALTER TABLE 表名 [外鍵定義]
外鍵定義語法格式:FOREIGN KEY(列名)
????????????????????????????????REFERENCES 表名 [列名【長度】]
????????????????????????????????[ON DELETE] {RESTICT|CASCADE|SET NULL| NO ACTION}
????????????????????????????????[ON UPDATE]?{RESTICT|CASCADE|SET NULL| NO ACTION}
參照完整性約束說明
RESTRICT:當(dāng)要刪除或更新附表中被參照列上在外鍵中出現(xiàn)的值時,拒絕對父表的刪除或更新操作。
CASCADE:從父表刪除或更新行時自動刪除或更新字表中匹配的行。
SET NULL:當(dāng)從父表刪除或更新時,設(shè)置字表中與之對應(yīng)的外鍵列為NULL。(當(dāng)從xs表刪除081103行時,設(shè)置cj表中081103項為NULL)外鍵在子表里的時候是可以被定義為NULL的呦!
NO ACTIONS:意味著不采取行動,就是說如果一個相關(guān)的外鍵值在被參考的表里,刪除或更新中主要鍵值得企圖不被允許,和RESTRICT一樣
SET DEFAULT:它和SET NULL差不多,只不過從父表刪除或更新的時候子表不會變成NULL,而是變成一個你定義的值
例子:創(chuàng)建book_ref表,所有的book_ref表中的圖書編號都必須出現(xiàn)在Book表中,假設(shè)已經(jīng)使用圖書編號列作為Book表主鍵。
CREATE TABLE book_ref
(圖書編號????varchar(20) NULL,
書名????????????varchar(20) NOT NULL,
出版日期????date NULL,
PRIMARY KEY(書名),
FOREIGN KEY(圖書編號),
????REFERENCES Book(圖書編號)
????????ON DELETE RESTRICT
????????ON UPDATE RESTRICT)
ENGINE=INNODB;
CHECK約束
主鍵、替代鍵、外鍵都是常見的完整性約束的例子。但是,每個數(shù)據(jù)庫都還有一些專用的完整性約束。例如說KC表中星期數(shù)要子啊1~7之間,XS表中的出生日期必須大于1986-1-1。這樣的規(guī)則可以使用CHECK完整性約束來指定。
CHECK完整性約束在創(chuàng)建表的時候定義??梢远ㄎ粸榱型暾约s束,也可以定義為表完整性約束。????????????????????????????????????????????????語法格式:CHECK(約束)
例子:創(chuàng)建表student,只考慮學(xué)號和性別兩列,性別只能包含男或女。
CREATE TABLE student
( 學(xué)號 char(6) NOT NULL,
? 性別 char(2) NOT NULL CHECK(性別 IN('男','女')));
講了這么多,我們再來回顧一下如何畫E-R圖

我們先看第一題哈!
第一問就是設(shè)計教學(xué)管理的E-R模型
學(xué)校有若干個系,那么學(xué)??梢运阕魇且粋€實體集,系也是實體集,學(xué)校和系之間是學(xué)校擁有系的關(guān)系。系有三個屬性:系號,系名和系主任。每個系里有教師和學(xué)生,教師和學(xué)生也算作實體集,系和學(xué)生之間是擁有的關(guān)系,系和教師的關(guān)系是管理的關(guān)系。教師可以講授課程,課程同時也算作是一個實體集,教師可以參加科研項目,科研項目同時也算是一個實體集,項目的屬性有:項目號,名稱,負(fù)責(zé)人。學(xué)生作為一個實體集,擁有的屬性有:學(xué)號,姓名,年齡和性別。
每一個實體集就是屬性,而在E-R圖中用斜杠來代表屬性,所以我們要畫斜杠的有系號,教師號,學(xué)生號,項目號,課程號。
之后我們再來看一下之間的關(guān)系是一對一還是一對多還是多對多。學(xué)校只有一個,但是一個學(xué)校有很多系,所以學(xué)校與系的關(guān)系是一對多。一個系對應(yīng)多個學(xué)生,但是多個學(xué)生也只能對應(yīng)一個系,所以也是一對多。一個課程可以被多個學(xué)生鞋選,一個學(xué)生也可以選擇多門課,所以學(xué)生和課程之間是多對多,同理教師與課程之間的關(guān)系也是多對多。一個系有多個教師,一個教師只屬于一個系,所以教師與系之間是一對多,而教師與科研項目之間是多對多,因為一個教師可以選擇多門項目,而一個項目也可以被多個教師所選。注意問題中有一句話叫做“一個項目有多人合作,且責(zé)任輕重有排名”,所以在教師與項目的參與的關(guān)系山還叫加一個排名。還有一句話是“學(xué)生選修課程后有考試成績”,所以在學(xué)生與課程的多對多的關(guān)系下還要加上一個成績。
之后第二問我們要把E-R圖轉(zhuǎn)換成關(guān)系模式。(主鍵我們用下劃線標(biāo)識,由于該文章不支持下劃線輸入,所以就用刪除符來代表下劃線啦?。?/p>
學(xué)校后面沒有屬性我們就不寫了,聯(lián)系的關(guān)系模型就舉個例子應(yīng)該就夠了。最后有標(biāo)答哦0.0

系?(系號,系名,系主任)
教師?(教師號,教師名,職稱,系號)
學(xué)生(學(xué)號,姓名,年齡,性別,系號)
項目(項目號,名稱,負(fù)責(zé)人)
課程(課號,課程名,學(xué)分,教師號)
選修(課號,學(xué)號,分?jǐn)?shù))
負(fù)責(zé)(教師號,項目號,排名)
注意:實體集與屬性之間的名字是必須按照題目要求填寫,而實體與屬性之間的聯(lián)系可以按照自己的意志去寫。
第二問設(shè)計員工公司管理系統(tǒng)數(shù)據(jù)庫設(shè)計
通過問題可以很簡單地得知實體集有員工、部門,員工薪水。
員工領(lǐng)取薪水,多對一。員工屬于部門,一對多。
員工和員工薪水的主碼設(shè)為員工編號即可,部門的主碼社會部門編號。
員工(員工編號,姓名,學(xué)歷,出生日期,性別,工作年限,電話)
部門(部門編號,名稱,備注)
員工薪水(員工編號,收入,支出)
之后我們把所有的聯(lián)系單列出來建立成一個關(guān)系模型:例如SY(員工編號,部門編號)......
下面我們再來做二十四道小練習(xí):
實體聯(lián)系圖(E-R圖)是(A)
A.現(xiàn)實世界到信息世界的抽象
B.描述信息世界的數(shù)據(jù)模型
C.對現(xiàn)實世界的描述
D.描述機(jī)器世界的數(shù)據(jù)模型
E-R圖不是數(shù)據(jù)模型,我們的數(shù)據(jù)庫才是數(shù)據(jù)模型
以下關(guān)于索引的正確敘述的是(B)
A.使用索引可以提高數(shù)據(jù)查詢速度和數(shù)據(jù)更新速度
B.使用索引可以提高數(shù)據(jù)查詢速度,但會降低數(shù)據(jù)更新數(shù)據(jù)
C.使用索引可以提高數(shù)據(jù)查詢速度,對數(shù)據(jù)更新速度沒有影響
D.使用索引數(shù)據(jù)查詢速度和數(shù)據(jù)更新速度均沒有影響
我們在更新表中索引列上的數(shù)據(jù)時,對索引也需要更新,這可能需要重新組織一個索引,若表中的索引很多,將很浪費(fèi)時間。即索引將降低添加、刪除、修改和其他寫入操作的效率。表中的索引越多,則更新表的時間就越長。
設(shè)屬性A是關(guān)系R的主屬性,則屬性A不能取空值,這是(A)
A.實體完整性規(guī)則
B.參照完整性規(guī)則
C.用戶自定義完整性規(guī)則
D.域完整性規(guī)則
實體完整性是針對行來說的,行必須是唯一的不能有空值的。參照完整性主要說的就是外碼,說的是兩個表之間的關(guān)系,那么A表的主碼可能就是B表的外碼。而用戶自定義的完整性規(guī)則,好比說我們在搞工程的時候僅查看男生,我們一般都會用CHECK語句去執(zhí)行。域完整性是對于列來說的,例如說我們想要插入一個學(xué)生的學(xué)號,這個學(xué)校的學(xué)號都是數(shù)字,突然你插入了一個英文字符,那么就會出現(xiàn)插不進(jìn)去的情況。
關(guān)系R和S進(jìn)行自然連接時,要求R和S含有一個或多個公共(D)
A.元組????????B.行????????C.記錄????????D.屬性
自然連接與等值連接時一樣的,屬性說的就是我們的列,記錄和與元組是行。
SQL的視圖是從(C)中導(dǎo)出的
A.基本表????????B.視圖????????C.基本表或視圖????????D.數(shù)據(jù)庫
在SQL中,建立視圖用的命令是(C)
A.CREATE SCHEMA
B.CREATE TABLE
C.CREATE VIEW
D.CREATE INDEX
A我們用的不多,它是建立數(shù)據(jù)庫的意思,有的在不同版本里面SCHEMA就是建立數(shù)據(jù)庫的意思,也是建立模式的意思。TABLE顧名思義就是建立表的意思。CREATE是建立索引的意思,CREATE VIEW是建立視圖。
在SQL語言中,刪除一個視圖的命令是()
A.DELETE
B.DROP
C.CLEAR
D.REMOVE
A是刪除數(shù)據(jù),而B是刪除視圖或數(shù)據(jù)庫,D是抹除。
以下關(guān)于外鍵和相應(yīng)的主鍵之間的關(guān)系,正確的是(A)
A.外鍵并不一定要參與相應(yīng)的主鍵同名
B.外鍵一定要與相應(yīng)的主鍵同名
C.外鍵一定要與相應(yīng)的主鍵同名且唯一
D.外鍵一定要與相應(yīng)的主鍵同名,但并不一定唯一
例如說兩個表AB,B中的一個列不是B的主鍵而是A中的主鍵,則這個列在B中叫外鍵。外鍵首先作為A的主鍵一定要與B的外鍵自身同名,但是外鍵并不是唯一的。D相比于B而言更加的完整。
在視圖上不能完成的操作是(C)
A.更新視圖數(shù)據(jù)
B.查詢
C.在視圖上定義新的基本表
D.在視圖上定義新視圖
(√)練習(xí)兩個表的關(guān)鍵字成為外鍵
(×)使用命令DROP INDEX能刪除所有的索引
(√)在默認(rèn)RESTRICT情況下,如果要刪除表T1是其他表T2的參照表,應(yīng)先刪除T2中表,在刪除T1表
(√)在每次訪問視圖時,視圖都是從數(shù)據(jù)表中提取所包含的行和列
(×)修改引用標(biāo)的數(shù)據(jù)時,一定能從視圖中反映出來
例如說我們的引用表里有學(xué)號這一列,而視圖當(dāng)中沒有選用引用表中的學(xué)號這一列,所以當(dāng)對學(xué)號進(jìn)行修改的時候視圖中是反應(yīng)不出來的
(×)子查詢內(nèi)不可以嵌套子查詢
(×)索引既可以提高檢索數(shù)據(jù)的速度,也可以提高修改數(shù)據(jù)的速度。
【我們選擇題里有一道這樣的題:索引將降低添加、刪除、修改和其他寫入操作的效率。表中的索引越多,則更新表的時間就越長】
ORDER BY字句實現(xiàn)的是(排序)
在每次訪問視圖時,視圖都是從(基本表)中提取所包含的行和列【因為這題后面限定了所包含的行和列,所以只能是基本表或者數(shù)據(jù)表】
表的外鍵約束是數(shù)據(jù)的(參照)完整性【兩個表相互進(jìn)行參照】
要進(jìn)行模糊匹配查詢,需要使用(LIKE)關(guān)鍵字來設(shè)置查詢條件
在進(jìn)行多表查詢時必須設(shè)置(連接)條件【用where連接起來】
完整性約束包括(實體完整性)、(域完整性)、(參照完整性)和(用戶自定義完整性)
用于將事務(wù)處理寫到數(shù)據(jù)庫的命令是(C)
A.insert
B.rollback
C.commit
D.savepoint
UNIQUE唯一索引的作用是(A)
A.保證各行在該索引上的值都不得重復(fù)
B.保證各行在該索引上的值不得為NULL
C.保證參加唯一索引的各列,不得再參加其他的索引
D.保證唯一索引不能被刪除
查找表結(jié)構(gòu)用以下哪一項(D)
A.FIND????????B.SELETE????????C.ALTER????????D.DESC
以下聚合函數(shù)求數(shù)據(jù)總和的是(B)
A.MAX????????B.SUM????????C.COUNT????????D.AVG