?目錄
第1關(guān) 基本查詢的學(xué)習(xí)
查詢語(yǔ)句SELECT
頭歌實(shí)驗(yàn)
查詢語(yǔ)句SELECT
第2關(guān) 深入學(xué)習(xí)查詢語(yǔ)句
MySQL聚集函數(shù)
頭歌實(shí)驗(yàn)
MySQL聚集函數(shù)
第3關(guān) 視圖的創(chuàng)建和使用
查看數(shù)據(jù)庫(kù)中表的情況:
頭歌實(shí)驗(yàn)
第4關(guān) 索引和完整性
索引
頭歌實(shí)驗(yàn)
索引
數(shù)據(jù)完整性
域完整性
實(shí)體完整性
參照完整性
第1關(guān) 基本查詢的學(xué)習(xí)
查詢語(yǔ)句SELECT
以下是MySQL數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)通用的SELECT
語(yǔ)法:
SELECT column_name1,column_name2 FROM table_name [WHERE Clause] [OFFSET M ] [LIMIT N]
- 查詢語(yǔ)句中可以指定一個(gè)或者多個(gè)表,表之間使用逗號(hào)
,
分割,并使用WHERE語(yǔ)句來(lái)設(shè)定查詢條件 -
SELECT
命令可以讀取一條或者多條記錄 - 可以使用星號(hào)
*
來(lái)代替字段,返回表所有字段的數(shù)據(jù) - 可以使用
LIMIT
屬性來(lái)設(shè)定返回的記錄數(shù)。
頭歌實(shí)驗(yàn)
本關(guān)的應(yīng)用場(chǎng)景是企業(yè)員工數(shù)據(jù)庫(kù)的查詢。本關(guān)你將自己動(dòng)手完成對(duì)一個(gè)真實(shí)的員工數(shù)據(jù)庫(kù)YGGL
的查詢:
- 查找財(cái)務(wù)部年齡不低于所有研發(fā)部雇員年齡的雇員姓名、編號(hào)和性別。
- 查找財(cái)務(wù)部收入在
5200
元以上的雇員姓名及其薪水收入支出情況。
上述查詢功能需要你掌握SELECT
語(yǔ)句的基本語(yǔ)法、掌握子查詢、連接查詢的表示方法。下面就是對(duì)這些內(nèi)容的詳細(xì)教程,請(qǐng)先仔細(xì)閱讀。
相關(guān)知識(shí)
查詢語(yǔ)句SELECT
以下是MySQL數(shù)據(jù)庫(kù)中查詢數(shù)據(jù)通用的SELECT
語(yǔ)法:
SELECT column_name1,column_name2 FROM table_name [WHERE Clause] [OFFSET M ] [LIMIT N]
- 查詢語(yǔ)句中可以指定一個(gè)或者多個(gè)表,表之間使用逗號(hào)
,
分割,并使用WHERE語(yǔ)句來(lái)設(shè)定查詢條件 -
SELECT
命令可以讀取一條或者多條記錄 - 可以使用星號(hào)
*
來(lái)代替字段,返回表所有字段的數(shù)據(jù) - 可以使用
LIMIT
屬性來(lái)設(shè)定返回的記錄數(shù)。
命令行的操作
首先我們來(lái)通過(guò)命令行操作復(fù)習(xí)上一階段所學(xué)內(nèi)容吧!
下面幾個(gè)表來(lái)自于我們用于實(shí)驗(yàn)的員工管理系統(tǒng)的數(shù)據(jù)庫(kù)YGGL
,通過(guò)命令行新建數(shù)據(jù)庫(kù)數(shù)據(jù)表并插入數(shù)據(jù)吧!
CREATE DATABASE YGGL;
使用數(shù)據(jù)庫(kù):
use YGGL;
員工信息表emp
表結(jié)構(gòu):
列名 | 數(shù)據(jù)類型 | 長(zhǎng)度 | 是否允許為空值 | 說(shuō)明 |
---|---|---|---|---|
eid | char | 6 | 否 | 員工編號(hào),主鍵 |
ename | char | 10 | 否 | 姓名 |
birth | date | 否 | 生日 | |
sex | int | 1 | 否 | 性別 |
addr | char | 20 | 是 | 地址 |
zip | char | 6 | 是 | 郵編 |
tel | char | 12 | 是 | 電話號(hào)碼 |
did | char | 3 | 否 | 部門編號(hào),外鍵 |
create table emp
(
eid char(6) NOT NULL PRIMARY KEY,
ename char(10) NOT NULL,
birth date NOT NULL,
sex int(1) NOT NULL,
addr char(20) NULL,
zip char(6) NULL,
tel char(12) NULL,
did char(3) NOT NULL
);
數(shù)據(jù)樣本:
eid | ename | birth | sex | addr | zip | tel | did |
---|---|---|---|---|---|---|---|
001 | wl | 1971-01-23 | 1 | zsl | 210003 | 12345668 | 2 |
008 | wrh | 1981-03-28 | 1 | bjdl | 210001 | 12345621 | 1 |
010 | wxr | 1987-12-09 | 1 | spl | 210006 | 12345661 | 1 |
018 | ll | 1965-07-30 | 0 | zsdl | 210002 | 12345601 | 1 |
201 | lm | 1977-10-18 | 1 | hjl | 210013 | 12345608 | 5 |
208 | zj | 1970-09-28 | 1 | plx | 210004 | 12345617 | 5 |
991 | zm | 1984-08-10 | 0 | zsl | 210003 | 12345622 | 3 |
006 | zsb | 1979-10-01 | 1 | jfl | 210010 | 12345618 | 5 |
678 | lt | 1982-04-02 | 1 | zsbl | 210008 | 12345636 | 3 |
566 | lym | 1973-09-20 | 1 | rhl | 210001 | 12345691 | 4 |
759 | yf | 1983-11-18 | 1 | bjxl | 210002 | 12345601 | 4 |
209 | cll | 1974-09-03 | 0 | hzl | 210018 | 12345658 | 4 |
insert into emp values
('001','wl','1971-01-23',1,'zsl','210003','12345668','2'),
('008','wrh','1981-03-28',1,'bjdl','210001','12345621','1'),
('010','wxr','1987-12-09',1,'spl','210006','12345661','1'),
('018','ll','1965-07-30',0,'zsdl','210002','12345601','1'),
('201','lm','1977-10-18',1,'hjl','210013','12345608','5'),
('208','zj','1970-09-28',1,'plx','210004','12345617','5'),
('991','zm','1984-08-10',0,'zsl','210003','12345622','3'),
('006','zsb','1979-10-01',1,'jfl','210010','12345618','5'),
('678','lt','1982-04-02',1,'zsbl','210008','12345636','3'),
('566','lym','1973-09-20',1,'rhl','210001','12345691','4'),
('759','yf','1983-11-18',1,'bjxl','210002','12345601','4'),
('209','cll','1974-09-03',0,'hzl','210018','12345658','4');
部門信息表dept
表結(jié)構(gòu):
列名 | 數(shù)據(jù)類型 | 長(zhǎng)度 | 是否允許為空值 | 說(shuō)明 |
---|---|---|---|---|
did | char | 3 | 否 | 部門編號(hào),主鍵 |
dname | char | 20 | 否 | 部門名 |
note | varchar | 100 | 是 | 備注 |
create table dept
(
did char(3) NOT NULL PRIMARY KEY,
dname char(20) NOT NULL,
note varchar(100) NULL
);
數(shù)據(jù)樣本:
did | dname | note | 說(shuō)明 |
---|---|---|---|
1 | cwb | NULL | 財(cái)務(wù)部 |
2 | rlzyb | NULL | 人力資源部 |
3 | jlbgs | NULL | 經(jīng)理辦公室 |
4 | yfb | NULL | 研發(fā)部 |
5 | scb | NULL | 市場(chǎng)部 |
insert into dept values
('1','cwb',NULL),
('2','rlzyb',NULL),
('3','jlbgs',NULL),
('4','yfb',NULL),
('5','scb',NULL);
工資表sal
表結(jié)構(gòu):
列名 | 數(shù)據(jù)類型 | 長(zhǎng)度 | 是否允許為空值 | 說(shuō)明 |
---|---|---|---|---|
eid | char | 6 | 否 | 員工編號(hào),主鍵 |
income | int | 8 | 否 | 收入 |
outcome | int | 8 | 否 | 支出 |
create table sal
(
eid char(6) NOT NULL PRIMARY KEY,
income int(8) NOT NULL,
outcome int(8) NOT NULL
);
數(shù)據(jù)樣本:
eid | income | outcome |
---|---|---|
001 | 5100 | 1123 |
008 | 4582 | 1088 |
201 | 5569 | 1185 |
006 | 4987 | 1079 |
209 | 5066 | 1108 |
566 | 5980 | 1210 |
991 | 6259 | 1281 |
010 | 5860 | 1198 |
018 | 5347 | 1180 |
759 | 5531 | 1199 |
678 | 5240 | 1121 |
208 | 4980 | 1100 |
insert into sal values
('001',5100,1123),
('008',4582,1088),
('201',5569,1185),
('006',4987,1079),
('209',5066,1108),
('566',5980,1210),
('991',6259,1281),
('010',5860,1198),
('018',5347,1180),
('759',5531,1199),
('678',5240,1121),
('208',4980,1100);
查詢每個(gè)雇員的所有數(shù)據(jù):
select * from emp;
查詢每個(gè)雇員的地址和電話:
select ename,addr,tel from emp;
查詢eid
為001
的雇員地址和電話:
select ename,addr,tel from emp where eid='001';
查詢emp
中所有女雇員的地址和電話,使用as
子句將結(jié)果中各列的標(biāo)題分別指定為地址和電話:
select ename as fname,addr as faddr,tel as ftel from emp where sex=0;
計(jì)算每個(gè)雇員的實(shí)際收入:
select did,income-outcome as money from sal;
找出所有姓名是w
開(kāi)頭的雇員的部門號(hào):
select did from emp where name like 'w%';
-
%
表示任意符號(hào)
找出所有收入在5000-6000之間的雇員號(hào)碼:
select eid from sal where income between 5000 and 6000;
-
BETWEEN
運(yùn)算符用于WHERE
表達(dá)式中,選取介于兩個(gè)值之間的數(shù)據(jù)范圍。BETWEEN
同AND
一起搭配使用。通常value1
應(yīng)該小于?value2
。當(dāng) BETWEEN 前面加上NOT
運(yùn)算符時(shí),表示與BETWEEN
相反的意思,即選取這個(gè)范圍之外的值。
子查詢的使用
所謂子查詢,即在查詢語(yǔ)句中內(nèi)嵌其他查詢語(yǔ)句。下面,我們?nèi)岳^續(xù)在命令行的操作中學(xué)習(xí)。
查找在cwb
工作的雇員情況:
select * from emp where did=(select did from dept where dname='cwb');
連接查詢的使用
比如查詢每個(gè)雇員的薪水情況,但是我們要返回雇員的姓名,而在sal表中沒(méi)有雇員姓名,這個(gè)時(shí)候就需要我們通過(guò)員工編號(hào)連接emp和sal兩張表。
select emp.ename,sal.income from emp,sal where emp.eid=sal.eid;
一些關(guān)鍵字
-
any
關(guān)鍵字:
假設(shè)any
內(nèi)部的查詢語(yǔ)句返回的結(jié)果個(gè)數(shù)是三個(gè),那么:
select ...from ... where a > any(...)
等價(jià)于
select ...from ... where a > result1 or a > result2 or a > result3
ALL
關(guān)鍵字與any
關(guān)鍵字類似,但其含義不同,相當(dāng)于上面的or
改成and
。some
關(guān)鍵字和any
關(guān)鍵字是一樣的功能。
-
IN
運(yùn)算符用于WHERE
表達(dá)式中,以列表項(xiàng)的形式支持多個(gè)選擇
WHERE column IN (value1,value2,...)
WHERE column NOT IN (value1,value2,...)
當(dāng)IN
前面加上NOT
運(yùn)算符時(shí),表示與IN
相反的意思,即不在這些列表項(xiàng)內(nèi)選擇。
-
UNION
操作符用于連接兩個(gè)以上的SELECT
語(yǔ)句的結(jié)果組合到一個(gè)結(jié)果集合中。SELECT expression_1,expression_2,...,expression_n FROM tables [WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression_1,expression_2,...,expression_n FROM tables[WHERE conditions];
expression_1
,?expression_2
, ...?expression_n
是要檢索的列,tables
是要檢索的數(shù)據(jù)表,WHERE conditions
是檢索條件,DISTINCT
是刪除結(jié)果集中重復(fù)的數(shù)據(jù)。默認(rèn)情況下?UNION
操作符已經(jīng)刪除了重復(fù)數(shù)據(jù),所以DISTINCT
修飾符對(duì)結(jié)果沒(méi)啥影響。而ALL
可以返回所有結(jié)果集,包含重復(fù)數(shù)據(jù)。
編程要求
編寫查詢語(yǔ)句,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)YGGL
(包括表emp
、dept
和sal
)的相關(guān)查詢:
查詢一:使用子查詢的方法,查找財(cái)務(wù)部cwb
年齡不低于所有研發(fā)部yfb
雇員年齡的雇員姓名ename
、編號(hào)eid
和性別sex
。
查詢二:使用連接查詢的方式,查找財(cái)務(wù)部cwb
收入income
在5200元以上的雇員姓名ename
及其薪水收入income
支出outcome
情況。
//請(qǐng)?jiān)谙旅嫜a(bǔ)齊查詢一的MySQL語(yǔ)句
/*********begin*********/
select ename,eid,sex from emp
where did in
(select did from dept
where dname='cwb'
)
/*********end*********/
and
birth<=all
(select birth from emp
where did in
(select did from dept
where dname='yfb'
)
);
//請(qǐng)?jiān)谙旅孑斎氩樵兌腗ySQL語(yǔ)句
/*********begin*********/
select ename,income,outcome
from emp,sal,dept
where emp.eid=sal.eid and
emp.did=dept.did and
dname='cwb' and income>5200;
/*********end*********/
第2關(guān) 深入學(xué)習(xí)查詢語(yǔ)句
MySQL聚集函數(shù)
函數(shù) | 說(shuō)明 |
---|---|
COUNT() | 返回某列的行數(shù) |
MAX() | 返回某列最大值 |
MIN() | 返回某列最小值 |
AVG() | 返回某列平均值 |
SUM() | 返回某列值之和 |
頭歌實(shí)驗(yàn)
本關(guān)的應(yīng)用場(chǎng)景是企業(yè)員工數(shù)據(jù)庫(kù)的查詢。上一關(guān)中簡(jiǎn)單的查詢滿足不了需求,比如:
- 求財(cái)務(wù)部雇員的總?cè)藬?shù);
- 求各部門的雇員數(shù);
- 將各雇員的姓名按收入由低到高排列。
上述查詢功能需要你掌握數(shù)據(jù)匯總、掌握GROUP BY和ORDER BY子句的作用和使用方法。下面就是對(duì)這些內(nèi)容的詳細(xì)教程,請(qǐng)先仔細(xì)閱讀。
相關(guān)知識(shí)
首先我們還是使用命令行操作登錄數(shù)據(jù)庫(kù)系統(tǒng),創(chuàng)建數(shù)據(jù)庫(kù)YGGL
、創(chuàng)建數(shù)據(jù)表emp
、dept
和sal
并插入數(shù)據(jù)。
MySQL聚集函數(shù)
函數(shù) | 說(shuō)明 |
---|---|
COUNT() | 返回某列的行數(shù) |
MAX() | 返回某列最大值 |
MIN() | 返回某列最小值 |
AVG() | 返回某列平均值 |
SUM() | 返回某列值之和 |
求財(cái)務(wù)部雇員的平均收入:
select avg(income) as avgincome
from sal
where eid in
(select eid
from emp
where did=
(select did
from dept
where dname='cwb'));
GROUP BY 和 ORDER BY 子句的使用
GROUP BY語(yǔ)句根據(jù)一個(gè)或多個(gè)列對(duì)結(jié)果集進(jìn)行分組。
SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
如果我們需要對(duì)讀取的數(shù)據(jù)進(jìn)行排序,我們就可以使用MySQL的ORDER BY子句來(lái)設(shè)定你想按哪個(gè)字段哪種方式來(lái)進(jìn)行排序,再返回搜索結(jié)果。
SELECT field1, field2,...,fieldN table_name1,table_name2..., ORDER BY field1,[field2...] [ASC [DESC]]
- 你可以設(shè)定多個(gè)字段來(lái)排序。
- 你可以使用
?ASC
?(升序)或?DESC
(降序) 關(guān)鍵字來(lái)設(shè)置查詢結(jié)果是按升序或降序排列。 默認(rèn)情況下,它是按升序排列。 - 你可以添加?
WHERE...LIKE?
子句來(lái)設(shè)置條件。
編程要求
在右側(cè)代碼窗口區(qū)域的指定位置編寫查詢語(yǔ)句,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)YGGL
(包括表emp
、dept
和sal
)的相關(guān)查詢:
查詢一:求財(cái)務(wù)部雇員的總?cè)藬?shù);
查詢二:求各部門的雇員數(shù);
查詢?nèi)簩⒏鞴蛦T的姓名按收入由低到高排列(提示:使用連接查詢)。
//請(qǐng)?jiān)谙旅孑斎氩樵円坏腗ySQL語(yǔ)句
/*********begin*********/
select count(eid)
from emp
where did=
(select did
from dept
where dname='cwb');
/*********end*********/
//請(qǐng)?jiān)谙旅孑斎氩樵兌腗ySQL語(yǔ)句
/*********begin*********/
select count(eid)
from emp
group by did;
/*********end*********/
//請(qǐng)?jiān)谙旅孑斎氩樵內(nèi)腗ySQL語(yǔ)句
/*********begin*********/
select emp.ename
from emp,sal
where emp.eid=sal.eid
order by income;
/*********end*********/
第3關(guān) 視圖的創(chuàng)建和使用
查看數(shù)據(jù)庫(kù)中表的情況:
show tables;
頭歌實(shí)驗(yàn)
本關(guān)的應(yīng)用場(chǎng)景是企業(yè)員工數(shù)據(jù)庫(kù)的查詢。視圖也是為了實(shí)現(xiàn)多樣地查看表中的數(shù)據(jù),比如限制財(cái)務(wù)部的經(jīng)理只能看到財(cái)務(wù)部的信息。本關(guān)你創(chuàng)建cx_sal
視圖并使用該視圖查看財(cái)務(wù)部雇員薪水情況。你需要掌握視圖的使用方法~
相關(guān)知識(shí)
首先我們還是使用命令行操作登錄數(shù)據(jù)庫(kù)系統(tǒng),創(chuàng)建數(shù)據(jù)庫(kù)YGGL
、創(chuàng)建數(shù)據(jù)表emp
、dept
和sal
并插入數(shù)據(jù)。
現(xiàn)在,你輸入以下代碼查看數(shù)據(jù)庫(kù)中表的情況:
show tables;
限制查看雇員的某些情況:
create or replace view cx_emp
as
select eid,ename,birth,sex,did
from emp;
創(chuàng)建該視圖后,我們可以在數(shù)據(jù)庫(kù)中查看所有的表,是不是變成了下面這樣?
接下來(lái)我們輸入下面的命令來(lái)查看該視圖:
select * from cx_emp;
為了了解視圖的特性,我們向視圖cx_emp
中插入一條記錄:
eid | ename | birth | sex | did |
---|---|---|---|---|
888 | zhj | 1983-09-25 | 1 | 3 |
現(xiàn)在,我們查看一下emp
表,你是不是已經(jīng)成功把這條記錄插入到emp
表中了呢?這就是視圖,原表和視圖之間是同步的。
接下來(lái)請(qǐng)你嘗試以下操作。
將zhj
從經(jīng)理辦公室(部門編號(hào)3
)轉(zhuǎn)到市場(chǎng)部(部門編號(hào)為5
):
update cx_emp set did='5'
where ename='zhj';
請(qǐng)你再次查看emp
表核查是否修改成功。
編程要求
請(qǐng)你思考,我們想限制各部門的經(jīng)理只能查找本部雇員的薪水情況該怎么操作呢?比如財(cái)務(wù)部,只讓財(cái)務(wù)部的經(jīng)理查看本部門雇員姓名和收入、支出情況。
請(qǐng)你創(chuàng)建cx_sal
視圖并使用該視圖查看財(cái)務(wù)部雇員薪水情況ename
、income
和outcome
。?
//請(qǐng)?jiān)谙旅孑斎雱?chuàng)建cx_sal的視圖的MySQL語(yǔ)句
/*********begin*********/
create or replace view cx_sal
as
select ename,income,outcome
from emp,sal,dept
where emp.eid=sal.eid and
emp.did=dept.did and
dname='cwb';
/*********end*********/
//請(qǐng)?jiān)谙旅孑斎氩樵冐?cái)務(wù)部雇員薪水情況視圖的MySQL語(yǔ)句
/*********begin*********/
select * from cx_sal;
/*********end*********/
第4關(guān) 索引和完整性
索引
索引是根據(jù)表中一列或若干列按照一定的順序建立的列值與記錄行之間的對(duì)應(yīng)關(guān)系表。在列上創(chuàng)建了索引之后,查找數(shù)據(jù)是可以直接根據(jù)該列上的索引找到對(duì)應(yīng)行的位置,從而快速找到數(shù)據(jù)。
索引類型分成下列幾個(gè):
- 普通索引(INDEX):基本索引類型
- 唯一性索引(UNIQUE):該列的所有值沒(méi)有重復(fù)
- 主鍵(PRIMARY KEY):一種唯一性索引,一個(gè)表只能有一個(gè)主鍵
- 全文索引(FLLTEXT):只能在varchar或text類型上創(chuàng)建
頭歌實(shí)驗(yàn)
任務(wù)描述
經(jīng)理覺(jué)得查找數(shù)據(jù)的速度偏慢、精度較低,這個(gè)時(shí)候,你需要?jiǎng)?chuàng)建索引來(lái)使查詢的速度更快,使用完整性來(lái)提高查詢精度。
上述查詢功能需要你掌握索引的使用方法、理解數(shù)據(jù)完整性的概念及分類、掌握各種數(shù)據(jù)完整性的實(shí)現(xiàn)方法。下面就是對(duì)這些內(nèi)容的詳細(xì)教程,請(qǐng)先仔細(xì)閱讀。
背景知識(shí)
索引
索引是根據(jù)表中一列或若干列按照一定的順序建立的列值與記錄行之間的對(duì)應(yīng)關(guān)系表。在列上創(chuàng)建了索引之后,查找數(shù)據(jù)是可以直接根據(jù)該列上的索引找到對(duì)應(yīng)行的位置,從而快速找到數(shù)據(jù)。
索引類型分成下列幾個(gè):
- 普通索引(INDEX):基本索引類型
- 唯一性索引(UNIQUE):該列的所有值沒(méi)有重復(fù)
- 主鍵(PRIMARY KEY):一種唯一性索引,一個(gè)表只能有一個(gè)主鍵
- 全文索引(FLLTEXT):只能在varchar或text類型上創(chuàng)建
語(yǔ)法格式:
//創(chuàng)建
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名稱 ON 表名{字段名稱[(長(zhǎng)度)] [ASC|DESC]}
//修改
ALTER TABLE tbl_name ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX索引名稱(字段名稱[(長(zhǎng)度)][ASC|DESC]);
下面我們用命令行操作試一試。
在創(chuàng)建好整個(gè)數(shù)據(jù)庫(kù)的基礎(chǔ)上,對(duì)YGGL
數(shù)據(jù)庫(kù)的emp
表的ename
列建立索引:
create index emp_name_idx
on emp(ename);
查看是否創(chuàng)建成功:
show index from emp;
重命名索引:
alter index emp_name_idx
rename to emp_idx;
刪除索引:
drop index emp_idex;
數(shù)據(jù)完整性
為了防止不合規(guī)定的數(shù)據(jù)進(jìn)入基表中,我們定義完整性規(guī)則。分為:域完整性、實(shí)體完整性和參照完整性。
域完整性
域完整性又叫列完整性,主要是對(duì)一列的數(shù)據(jù)進(jìn)行約束。比如emp
中限定sex
的值只能為1
和2
中的一個(gè),可以在創(chuàng)建表時(shí)將sex
做以下定義:
sex int(1) check(sex='1' or sex='2') NOT NULL,
或者在所有字段定義完成后加一句:
constraint ch_sex check(sex='1' or sex='2')
下面,我們?cè)诿钚兄型ㄟ^(guò)修改表的方式創(chuàng)建約束:
alter table emp
add(constraint ch_sex check(sex='1' or sex='2'));
刪除約束:
alter table emp
drop constraint ch_sex;
實(shí)體完整性
又叫行完整性,要求每一行都有一個(gè)唯一的標(biāo)識(shí)符。比如emp
中的員工eid
是唯一的,才能唯一確定某一個(gè)人。通過(guò)unique
約束和primary key
約束可以實(shí)現(xiàn)實(shí)體完整性。
同樣的,在創(chuàng)建表時(shí)對(duì)tel
創(chuàng)建約束應(yīng)該將tel
定義為:
tel char(12) NULL constraint un_tel unique,
下面我們?cè)诿钚兄型ㄟ^(guò)修改表的方式創(chuàng)建約束:
alter table emp
add constraint un_tel unique(tel);
參照完整性
又叫引用完整性,它保證主表和從表中的數(shù)據(jù)一致性,實(shí)現(xiàn)方式是定義外鍵與主鍵。例如emp
和sal
表,eid
在emp
中是外鍵,而在sal
中eid
定義為主鍵。
- 從表不能引用主表不存在的鍵值
- 主表中的值更改了,則從表中所有引用都也要修改
- 若要?jiǎng)h除主表中的記錄,應(yīng)先刪除從表中匹配的記錄
如果在創(chuàng)建sal
表時(shí)想創(chuàng)建參照完整性使emp
表中所有eid
都要出現(xiàn)在sal
中,可以在定義emp
的eid
時(shí)這樣定義:
eid char(6) NOT NULL references sal(eid),
下面我們?cè)诿钚兄型ㄟ^(guò)修改表的方式定義:
alter table emp
add constraint sal_id foreign key(eid)
references sal(eid);
編程要求
在已經(jīng)創(chuàng)建好整個(gè)YGGL
數(shù)據(jù)庫(kù)的基礎(chǔ)上進(jìn)行以下操作:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-473881.html
建立索引pk_xs_bak
:對(duì)emp
的eid
建立索引;
實(shí)現(xiàn)域完整性ch_tel
:為emp
的tel
建立check
約束,其值只能為0
-9
的數(shù)字;
實(shí)現(xiàn)實(shí)體完整性un_dept
:為dept
的dname
創(chuàng)建唯一性索引;
實(shí)現(xiàn)參照完整性fk_emp
:將emp
中的did
列為外鍵。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-473881.html
//請(qǐng)?jiān)谙旅孑斎雱?chuàng)建索引的MySQL語(yǔ)句
/*********begin*********/
create index pk_xs_bak
on emp(eid);
/*********end*********/
//請(qǐng)?jiān)谙旅孑斎雽?shí)現(xiàn)域完整性的MySQL語(yǔ)句
/*********begin*********/
alter table emp
add(constraint ch_tel check(tel between 0 and 9));
/*********end*********/
//請(qǐng)?jiān)谙旅孑斎雽?shí)現(xiàn)實(shí)體完整性的MySQL語(yǔ)句
/*********begin*********/
alter table dept
add constraint un_dept unique(dname);
/*********end*********/
//請(qǐng)?jiān)谙旅孑斎雽?shí)現(xiàn)參照完整性的MySQL語(yǔ)句
/*********begin*********/
alter table emp
add constraint sal_id foreign key(eid)
references sal(eid);
/*********end*********/
到了這里,關(guān)于MySQL開(kāi)發(fā)技巧——查詢、索引和完整性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!