版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三章結(jié)構(gòu)化查詢語言了解結(jié)構(gòu)化查詢語言SQL操作原理
學(xué)習(xí)數(shù)據(jù)庫SQL操作語句使用掌握數(shù)據(jù)庫對象創(chuàng)建掌握數(shù)據(jù)庫表訪問操縱掌握多表關(guān)聯(lián)數(shù)據(jù)查詢掌握數(shù)據(jù)庫對象修改與刪除掌握數(shù)據(jù)庫視圖使用掌握SQL
Server數(shù)據(jù)庫管理工具使用【學(xué)習(xí)目標(biāo)】一、基本概念3.1SQL簡介SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語言)是一種對數(shù)據(jù)庫進(jìn)行訪問的數(shù)據(jù)操作子語言。其SQL語句執(zhí)行命令完成對數(shù)據(jù)庫訪問操作。二、SQL發(fā)展20世紀(jì)70年代由IBM公司開發(fā)
1979年ORACLE公司首先提供商用的SQL
1986ANSI的數(shù)據(jù)庫委員會批準(zhǔn)了SQL作為關(guān)系型數(shù)據(jù)庫語言的美國標(biāo)準(zhǔn)。1987年國際標(biāo)準(zhǔn)化組織(ISO)將其采納為國際標(biāo)準(zhǔn)SQL86。
1989年更新成為國際標(biāo)準(zhǔn)SQL-891992年更新成為國際標(biāo)準(zhǔn)SQL-92(或稱SQL2)1999年更新成為國際標(biāo)準(zhǔn)SQL-99(或稱SQL3)2008年更新成為國際標(biāo)準(zhǔn)SQL:2008三、SQL應(yīng)用情況絕大多數(shù)主流的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)采用了SQL標(biāo)準(zhǔn)語言實(shí)現(xiàn)數(shù)據(jù)庫操作OracleSybaseDB2MicrosoftSQLServerAccessMySql。。。其中一些廠商數(shù)據(jù)庫管理系統(tǒng)對SQL語句進(jìn)行了擴(kuò)展開發(fā),如Sybase、MicrosoftSQLServer將操作語言擴(kuò)展為Transaction-SQL;Oracle將操作語言擴(kuò)展為PL/SQL。四、SQL操作機(jī)理SQL主要操作功能:SQL從數(shù)據(jù)庫存取數(shù)據(jù)
SQL從數(shù)據(jù)庫刪除數(shù)據(jù)SQL創(chuàng)建新數(shù)據(jù)庫SQL在數(shù)據(jù)庫中創(chuàng)建新表SQL在數(shù)據(jù)庫中創(chuàng)建存儲過程SQL在數(shù)據(jù)庫中創(chuàng)建視圖SQL可以設(shè)置數(shù)據(jù)庫對象的訪問權(quán)限數(shù)據(jù)庫DBMS(執(zhí)行SQL)數(shù)據(jù)庫應(yīng)用程序返回結(jié)果提交SQLI/O數(shù)據(jù)五、SQL語言語句類別1.數(shù)據(jù)操縱語言數(shù)據(jù)操縱語言(DataManipulationLanguage,DML)是SQL語言中用于增添、修改、刪除數(shù)據(jù)的語句,主要語句如下:
INSERT-向數(shù)據(jù)庫表中插入數(shù)據(jù)
UPDATE-更新數(shù)據(jù)庫表中的數(shù)據(jù)DELETE-從數(shù)據(jù)庫表中刪除數(shù)據(jù)
2.數(shù)據(jù)定義語言數(shù)據(jù)定義語言(DataDefinitionLanguage,DDL)是SQL語言中用于創(chuàng)建或刪除數(shù)據(jù)庫對象的語句。這類語句也可以定義數(shù)據(jù)表對象的主外鍵、索引、約束等要素。主要語句如下:CREATEDATABASE-創(chuàng)建新數(shù)據(jù)庫
DROPDATABASE–刪除數(shù)據(jù)庫ALTERDATABASE-修改數(shù)據(jù)庫屬性CREATETABLE-創(chuàng)建新表ALTERTABLE–修改數(shù)據(jù)庫表結(jié)構(gòu)DROPTABLE-刪除表CREATEINDEX-創(chuàng)建索引DROPINDEX-刪除索引3.數(shù)據(jù)查詢語言數(shù)據(jù)查詢語言(DataQueryLanguage,DQL)是SQL語言中用于對數(shù)據(jù)庫進(jìn)行查詢的語句。該語句只有Select一個(gè)語句,但其變化范型較多。4.數(shù)據(jù)控制語言數(shù)據(jù)控制語言(DataControlLanguage,DCL)是SQL語言中用于對數(shù)據(jù)訪問權(quán)進(jìn)行控制的語句。主要語句如下:
GRANT–授予用戶對數(shù)據(jù)對象的權(quán)限
DENY–拒絕授予用戶對數(shù)據(jù)對象的權(quán)限
REVOKE–撤消用戶對數(shù)據(jù)對象的權(quán)限5.事務(wù)處理語言事務(wù)處理語言(TransactionProcessLanguage,TPL)是SQL語言中用于數(shù)據(jù)庫內(nèi)部事務(wù)處理的語句。主要語句如下:BEGINTRANSACTION–開始事務(wù)
COMMIT–提交事務(wù)
ROLLBACK–回滾事務(wù)6.游標(biāo)控制語言游標(biāo)控制語言(CursorControlLanguage,CCL)是SQL語言中用于數(shù)據(jù)庫游標(biāo)操作的語句。主要語句如下:
DECLARECURSOR–定義游標(biāo)
FETCHINTO–提交游標(biāo)數(shù)據(jù)
CLOSECURSOR–關(guān)閉游標(biāo)六、SQL語言的數(shù)據(jù)類型1.基本數(shù)據(jù)類型字符:CHAR、VARCHAR、TEXT整數(shù):SMALLINT、INTEGER浮點(diǎn)數(shù):NUMBER(n,d)、FLOAT(n,d)
日期:DATE、DATETIME
貨幣:MONEY2.不同數(shù)據(jù)庫所支持?jǐn)?shù)據(jù)類型Access的數(shù)據(jù)類型見表3-1所示SQLServer的數(shù)據(jù)類型見表3-2所示MySQL的數(shù)據(jù)類型見表3-3所示部門信息雇員信息項(xiàng)目信息任務(wù)信息工程項(xiàng)目管理數(shù)據(jù)庫數(shù)據(jù)庫系統(tǒng)任務(wù):
創(chuàng)建項(xiàng)目數(shù)據(jù)庫ProjectDB
創(chuàng)建數(shù)據(jù)庫表對象及其約束
完成數(shù)據(jù)庫表的數(shù)據(jù)插入、修改、刪除以及查詢處理某企業(yè)希望通過創(chuàng)建一個(gè)工程項(xiàng)目管理數(shù)據(jù)庫,實(shí)現(xiàn)對項(xiàng)目信息管理。3.2數(shù)據(jù)定義語句DDL一、數(shù)據(jù)庫案例列名類型鍵是否非空備注DepartmentNamechar(35)主鍵是部門名稱DepartIntroVarchar(200)否是部門簡介OfficeNumberchar(15)否是辦公室編號OfficePhonechar(12)否是辦公電話部門(DEPARTMENT)表結(jié)構(gòu)1.數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計(jì)列名類型鍵是否非空備注EmployeeNumberInt主鍵是代理鍵,雇員編號NameVarchar(30)否是姓名Departmentchar(35)外鍵是部門Phonechar(12)否是電話EmailVarchar(100)否是郵件雇員(EMPLOYEE)表結(jié)構(gòu)列名類型鍵是否非空備注ProjectIDInt主鍵是項(xiàng)目編號NameVarchar(30)否是項(xiàng)目名稱Departmentchar(35)外鍵是部門MaxHoursNumber否是最長工時(shí)StartDateDateTime否否開始日期EndDateDateTime否否結(jié)束日期項(xiàng)目(PROJECT)表結(jié)構(gòu)列名類型鍵是否非空備注ProjectIDInt主鍵,外鍵是復(fù)合鍵,項(xiàng)目編號EmployeeNumberInt主鍵,外鍵是復(fù)合鍵,雇員編號HoursWorkedNumeric(6,2)否否工作時(shí)數(shù)任務(wù)(ASSIGNMENT)表結(jié)構(gòu)列名類型鍵是否非空備注DepartmentNamechar(35)主鍵是部門名稱DepartIntroVarchar(200)否是部門簡介OfficeNumberchar(15)否是辦公室編號OfficePhonechar(12)否是辦公電話列名類型鍵是否非空備注EmployeeNumberInt主鍵是代理鍵,雇員編號NameVarchar(30)否是姓名Departmentchar(35)外鍵是部門Phonechar(12)否是電話EmailVarchar(100)否是郵件參照完整性約束DEPARTMENT表EMPLOYEE表2.數(shù)據(jù)庫表關(guān)聯(lián)設(shè)計(jì)列名類型鍵是否非空備注DepartmentNamechar(35)主鍵是部門名稱DepartIntroVarchar(30)否是部門簡介OfficeNumberchar(15)否是辦公室編號OfficePhonechar(12)否是辦公電話DEPARTMENT表結(jié)構(gòu)列名類型鍵是否非空備注ProjectIDInt主鍵是項(xiàng)目編號NameVarchar(30)否是項(xiàng)目名稱Departmentchar(35)外鍵是部門MaxHoursNumeric(6,2)否是最長工期StartDateDateTime否否開始日期EndDateDateTime否否結(jié)束日期PROJECT表結(jié)構(gòu)參照完整性約束列名類型鍵是否非空備注ProjectIDInt主鍵是項(xiàng)目編號NameVarchar(30)否是項(xiàng)目名稱Departmentchar(35)外鍵是部門MaxHoursNumber否是最長工期StartDateDateTime否否開始日期EndDateDateTime否否結(jié)束日期PROJECT表結(jié)構(gòu)列名類型鍵是否非空備注ProjectIDInt主鍵,外鍵是復(fù)合鍵,項(xiàng)目編號EmployeeNumberInt主鍵,外鍵是復(fù)合鍵,雇員編號HoursWorkedNumeric(6,2)否否工作時(shí)數(shù)ASSIGNMENT表結(jié)構(gòu)參照完整性約束3.業(yè)務(wù)規(guī)則設(shè)計(jì)如果要刪除EMPLOYEE中的某個(gè)行,若該行連接有ASSIGNMENT的外鍵值,則禁止對EMPLOYEE行執(zhí)行刪除操作。在創(chuàng)建表時(shí)定義參照完整性約束。如果要刪除PROJECT中的某個(gè)行,則ASSIGNMENT中連接到PROJECT的對應(yīng)行數(shù)據(jù)也將隨之被刪除。在創(chuàng)建表時(shí)定義級聯(lián)刪除約束。如果某雇員離職,則企業(yè)將刪除該雇員數(shù)據(jù),但前提是必須先有人接替這個(gè)雇員工作,然后才允許刪除該雇員數(shù)據(jù)。如果企業(yè)取消某個(gè)項(xiàng)目,將刪除該項(xiàng)目數(shù)據(jù)。同時(shí),也將刪除該項(xiàng)目所下屬的任務(wù)數(shù)據(jù)。數(shù)據(jù)庫中如何設(shè)計(jì)?問題:上述項(xiàng)目數(shù)據(jù)庫設(shè)計(jì)如何通過SQL實(shí)現(xiàn)?二、數(shù)據(jù)庫創(chuàng)建語句1.語句基本格式例創(chuàng)建一個(gè)人力資源管理數(shù)據(jù)庫HR,其SQL語句如下:CREATEDATABASEHR;CREATEDATABASE<數(shù)據(jù)庫名>其中CREATEDATABASE為創(chuàng)建數(shù)據(jù)庫語句的關(guān)鍵詞,<數(shù)據(jù)庫名>為被創(chuàng)建數(shù)據(jù)庫的標(biāo)識符名稱。實(shí)踐操作:
在SQLServer中,創(chuàng)建第一個(gè)數(shù)據(jù)庫HR。2.語句完整格式CREATEDATABASE<數(shù)據(jù)庫名>onprimary(--默認(rèn)屬于primary文件組name=‘databasename_data’,--主數(shù)據(jù)文件的邏輯名稱filename=‘D:\databasename_data.mdf’,--主數(shù)據(jù)文件的物理名稱size=數(shù)值MB,--主數(shù)據(jù)文件的初始大小maxsize=數(shù)值MB,--主數(shù)據(jù)文件增長的最大值filegrowth=數(shù)值%--主數(shù)據(jù)文件的增長率)logon(/*--日志文件的具體描述,各參數(shù)含義同上--*/name='databasename_log',--日志文件的邏輯名稱filename='所存目錄:\databasename_log.ldf',--日志文件的物理名稱size=數(shù)值MB,--日志文件的初始大小filegrowth=數(shù)值MB--日志文件的增長值);CREATEDATABASEProjectDBonprimary(
--默認(rèn)屬于primary文件組name=‘Project_data’,--主數(shù)據(jù)文件的邏輯名稱filename=‘d:\Project_data.mdf',--主數(shù)據(jù)文件的物理名稱size=10MB,--主數(shù)據(jù)文件的初始大小maxsize=50MB,--主數(shù)據(jù)文件增長的最大值filegrowth=10%--主數(shù)據(jù)文件的增長率)logon(name=‘Project_log’,--日志文件的邏輯名稱filename=‘d:\Project_log.ldf',--日志文件的物理名稱size=10MB,--日志文件的初始大小filegrowth=1MB--日志文件的增長值);例創(chuàng)建一個(gè)項(xiàng)目信息管理數(shù)據(jù)庫ProjectDB,其SQL語句如下:實(shí)踐操作:
采用完整參數(shù)SQL語句,創(chuàng)建數(shù)據(jù)庫ProjectDB。三、數(shù)據(jù)庫刪除語句1.語句基本格式例刪除前面創(chuàng)建的人力資源管理數(shù)據(jù)庫HR,其SQL語句如下:DROPDATABASEHR;DROP
DATABASE<數(shù)據(jù)庫名>;其中DROP
DATABASE
為語句命令關(guān)鍵詞,<數(shù)據(jù)庫名>為數(shù)據(jù)庫名稱。實(shí)踐操作:
刪除數(shù)據(jù)庫HR。實(shí)踐練習(xí):
在SQLServer數(shù)據(jù)庫管理系統(tǒng)環(huán)境中,創(chuàng)建一個(gè)選課系統(tǒng)數(shù)據(jù)庫Catalog,完成后再刪除它。四、數(shù)據(jù)庫表創(chuàng)建語句1.語句基本格式CREATE
TABLE<表名>
(<列名1><數(shù)據(jù)類型>[列完整性約束], <列名2><數(shù)據(jù)類型>[列完整性約束],
<列名3><數(shù)據(jù)類型>[列完整性約束],…);其中CREATE
TABLE
為創(chuàng)建表語句的關(guān)鍵詞,<表名>為將被創(chuàng)建的數(shù)據(jù)庫表名稱。例
雇員數(shù)據(jù)庫表EMPLOYEE創(chuàng)建CREATE
TABLE
EMPLOYEE(EmployeeNumber Int,Name VarChar(30),Department Char(35),Phone Char(12),
Email VarChar(100) );列名類型鍵是否非空備注EmployeeNumberInt主鍵是NameVarChar(30)否是DepartmentChar(35)否是PhoneChar(12)否否EmailVarChar(100)否是2.列約束條件CREATETABLENewTableName(ColumnNameDataType OptionalConstraint,ColumnNameDataType OptionalConstraint,ColumnNameDataType OptionalConstraint,…);列約束子句
PRIMARYKEY——主鍵NOTNULL——非空值
NULL——空值
UNIQUE——值唯一
CHECK——有效性檢查
DEFAULT——缺省值列約束子句CREATE
TABLE
EMPLOYEE(EmployeeNumber Int PRIMARYKEYIDENTITY(1,1),Name VarChar(30) NOTNULL,Department Char(35) NOTNULLDEFAULT‘人力資源’,Phone Char(12) NULL,
Email VarChar(100) NOTNULLUNIQUE);例
雇員數(shù)據(jù)庫表EMPLOYEE創(chuàng)建列名類型鍵是否非空備注EmployeeNumberInt主鍵是代理鍵NameVarChar(30)否是DepartmentChar(35)否是缺省值“人力資源”PhoneChar(12)否否EmailVarChar(100)否是要求取值唯一說明:在Sybase或SQLServer,用INDENTITY標(biāo)識代理鍵在Oracle數(shù)據(jù)庫中用SEQUENCE標(biāo)識代理鍵在MySQL數(shù)據(jù)庫中,用AUTO_INCREMENT標(biāo)識代理鍵實(shí)踐操作:
在SQLServer中執(zhí)行SQL創(chuàng)建EMPLOYEE表CREATE
TABLE
STUDENT(StudentID Char(10) PRIMARYKEY,StudentName VarChar(30) NOTNULL,StudentGenderChar(2) NOTNULLCHECK(StudentGender
IN(‘男’,‘女')),BirthDay Date
NOTNULL,
Major Varchar(30)NULLDEFAULT‘軟件工程’,StudentPhone Char(11)
NULL);實(shí)踐練習(xí):
課程目錄數(shù)據(jù)庫表STUDENT創(chuàng)建。列名類型鍵是否非空備注StudentIDChar(10)主鍵是StudentNameVarChar(20)否是StudentGenderChar(2)否是(‘男’,‘女’)BirthDayDate否是MajorVarchar(30)否否缺省值“軟件工程”StudentPhoneChar(11)否否3、使用表約束定義主鍵CREATE
TABLEDEPARTMENT(DepartmentName Char(35) NOTNULL,DepartIntro VarChar(200) NOTNULL,OfficeNumber Char(15) NOTNULL,OfficePhone Char(12) NOTNULL,
CONSTRAINT DEPARTMENT_PK PRIMARYKEY(DepartmentName));使用表約束定義主鍵的優(yōu)點(diǎn):便于定義復(fù)合主鍵可命名主鍵約束便于定義代理鍵例
項(xiàng)目數(shù)據(jù)庫表PROJECT創(chuàng)建CREATE
TABLE
PROJECT(ProjectID Int NOTNULLIDENTITY(100,10),Name VarChar(30) NOTNULL,Department Char(35) NOTNULL,MaxHours Numeric(6,2) NOTNULLDEFAULT60.30,StartDate DateTimeNULL,EndDate DateTimeNULL,
CONSTRAINT PROJECT_PK PRIMARYKEY(ProjectID));列名類型鍵是否非空備注ProjectIDInt主鍵是代理鍵100開始,增量10NameChar(30)否是DepartmentChar(35)否是MaxHoursNumeric(6,2)否是缺省值60.30StartDateDateTime否否EndDateDateTime否否實(shí)踐操作:
在SQLSERVER中使用SQL表約束語句創(chuàng)建主鍵。DEPARTMENT表結(jié)構(gòu)列名類型鍵是否非空備注ProjectIDInt主鍵是項(xiàng)目編號NameVarChar(30)否是項(xiàng)目名稱DepartmentChar(35)外鍵是部門MaxHoursNumeric(6,2)否是最長工期StartDateDateTime否否開始日期EndDateDateTime否否結(jié)束日期PROJECT表結(jié)構(gòu)參照完整性約束列名類型鍵是否非空備注DepartmentNameText(35)主鍵是DepartIntroVarChar(200)否是OfficeNumberText(15)否是OfficePhoneText(12)否是4、使用表約束定義外鍵CREATETABLEPROJECT(ProjectID Int NOTNULLIDENTITY(1,1),Name VarChar(30) NOTNULL,Department Char(35) NOTNULL,MaxHours Numeric(6,2)
NOTNULLDEFAULT100,StartDate DateTimeNULL,EndDate DateTime
NULL,CONSTRAINT PROJECT_PK PRIMARYKEY(ProjectID),
CONSTRAINT PROJ_DEPART_FK FOREIGNKEY(Department)
REFERENCESDEPARTMENT(DepartmentName)
ONUPDATECASCADE);例創(chuàng)建PROJECT表中外鍵及其參照完整性約束實(shí)踐操作:在SQL
Server中創(chuàng)建PROJECT表外鍵及其參照完整性約束。列名類型鍵是否非空備注ProjectIDInt主鍵是NameVarChar(30)否是DepartmentChar(35)外鍵是MaxHoursNumber否是StartDateDateTime否否EndDateDateTime否否PROJECT表結(jié)構(gòu)列名類型鍵是否非空備注ProjectIDInt主鍵,外鍵是EmployeeNumberInt主鍵,外鍵是HoursWorkedNumeric(6,2)否否ASSIGNMENT表結(jié)構(gòu)參照完整性約束實(shí)踐練習(xí):
創(chuàng)建ASSIGNMENT表中外鍵,及其參照PROJECT和EMPLOYEE表的完整性約束列名類型鍵是否必需備注ProjectIDInt主鍵,外鍵是EmployeeNumberInt主鍵,外鍵是HoursWorkedNumeric(6,2)否否ASSIGNMENT表結(jié)構(gòu)參照完整性約束列名類型鍵是否必需備注EmployeeNumberInt主鍵是NameVarChar(30)否是DepartmentChar(35)外鍵是PhoneChar(12)否是EmailVarChar(120)否是EMPLOYEE表CREATETABLEASSIGNMENT(ProjectID Int NOTNULL,EmployeeNumber Int NOTNULL,HoursWorked Numeric(6,2) NULL,CONSTRAINT ASSIGNMENT_PK PRIMARYKEY(ProjectID,EmployeeNumber),
CONSTRAINT ASSIGN_PROJ_FKFOREIGNKEY(ProjectID)
REFERENCESPROJECT(ProjectID)
ONDELETECASCADE, CONSTRAINT ASSIGN_EMP_FKFOREIGNKEY(EmployeeNumber)
REFERENCESEMPLOYEE(EmployeeNumber) );ALTER
TABLEConstraint;ALTER
TABLE
語句可以用于添加、修改、刪除表結(jié)構(gòu)的列和約束。例刪除ASSIGNMENT表中外鍵ASSIGN_EMP_FK,其SQL操作語句如下。ALTER
TABLEASSIGNMENTDROPCONSTRAINTASSIGN_EMP_FK;五、修改表結(jié)構(gòu)SQL語句2、刪除表中外鍵1、語句基本格式在ALTTABLE語句中,可以添加CHECK關(guān)鍵字實(shí)現(xiàn)數(shù)據(jù)范圍約束添加。例
在定義PROJECT表時(shí),規(guī)定StartDate必須早于EndDate,則可通過如下語句實(shí)現(xiàn)。ALTER
TABLEPROJECTADD
CONSTRAINTPROJECT_Check_DatesCHECK(StartDate<EndDate);3、在表中添加約束使用ALTTABLE語句,還可以在現(xiàn)有表結(jié)構(gòu)中添加新的屬性列。例
在PROJECT表中添加一列CurrentTotalHours,以跟蹤在某項(xiàng)目上工作的實(shí)際小時(shí)數(shù),則可通過如下語句實(shí)現(xiàn)。ALTER
TABLEPROJECTADDCurrentTotalHoursNumeric(8,2)NULL;4、在表中添加列實(shí)踐操作:
在PROJECT表中添加新列例
在PROJECT表中刪除CurrentTotalHours列,則可通過如下語句實(shí)現(xiàn)。ALTER
TABLEPROJECTDROP
COLUMNCurrentTotalHours;5、在表中刪除列六、刪除表結(jié)構(gòu)SQL語句基本語句格式:DROPTABLETableName;注意:
該語句將刪除該表的所有數(shù)據(jù)及其結(jié)構(gòu)例刪除EMPLOYEE表及其數(shù)據(jù),可以使用如下語句。DROPTABLEEMPLOYEE;注意:
如果某表包含了參照完整性約束,直接執(zhí)行DROPTABLE語句,將會報(bào)錯(cuò)。說明:刪除EMPLOYEE表前,必須先刪除ASSIGNMENT表或至少刪除外鍵約束ASSIGN_EMP_FK,才能成功。七、索引對象定義索引——在數(shù)據(jù)庫中,索引是針對某個(gè)表中一列或多列建立的指向表中記錄數(shù)據(jù)頁的邏輯指針清單,其作用類似圖書目錄可支持對數(shù)據(jù)表的快速信息檢索。其中CREATE
INDEX
為創(chuàng)建索引語句的關(guān)鍵詞。<索引名>為在指定表中針對某列創(chuàng)建索引的名稱。該語句執(zhí)行后,在表中為指定列創(chuàng)建其列值的索引,使該列可實(shí)現(xiàn)快速查詢。1、索引創(chuàng)建SQL語句基本語句格式:CREATE
INDEX<索引名>ON<表名><(列名)>;例
在學(xué)生信息表STUDENT中,為出生日期Birthday列創(chuàng)建索引,以便可支持按出生日期快速查詢學(xué)生信息,其索引創(chuàng)建SQL語句如下。CREATE
INDEXBirthday_IdxONSTUDENT(Birthday);索引優(yōu)點(diǎn):提高數(shù)據(jù)檢索速度可快速連接關(guān)聯(lián)表減少分組和排序時(shí)間索引開銷:創(chuàng)建和維護(hù)索引都需要較大開銷索引會占用額外存儲空間數(shù)據(jù)操縱因維護(hù)索引帶來開銷2、索引修改SQL語句其中ALTER
INDEX
為索引對象修改語句的關(guān)鍵詞。<索引名>為在指定表中針對某列創(chuàng)建索引的名稱。RENAME
TO為索引換名關(guān)鍵詞。當(dāng)該語句執(zhí)行后,原有索引被換名為新名稱。使用SQL語句可以對索引進(jìn)行修改操作,其語句格式分別如下:ALTER
INDEX<索引名>ON<表名>RENAME
TO<新索引名>;例
在學(xué)生信息表STUDENT中,將原索引Birthday_Idx更名Bday_Idx,其索引修改SQL語句如下:ALTER
INDEXBirthday_IdxONSTUDENTRENAME
TOBday_Idx;ALTER
INDEX<索引名>ON<表名>[CLUSTERED|NONCLUSTERED];此外,索引對象修改SQL語句還可以更改索引的聚簇性質(zhì),例如修改為聚集索引或非聚集索引,其SQL語句格式如下:聚集索引與非聚集索引區(qū)別:在聚集索引中,鍵值的邏輯順序決定了表中相應(yīng)行的物理順序。在非聚集索引中,鍵值的邏輯順序可以與表中相應(yīng)行的物理順序不同。3、索引刪除SQL語句使用SQL語句可以對索引進(jìn)行刪除操作,其語句格式分別如下:DROP
INDEX<索引名>;其中DROP
INDEX
為刪除索引語句的關(guān)鍵詞。<索引名>為被指定的索引名稱。該語句執(zhí)行后,將從表中刪除該索引。例
在學(xué)生信息表STUDENT中,刪除Birthday_Idx索引,其索引刪除SQL語句如下:DROP
INDEXBirthday_Idx;學(xué)院信息、課程信息教師信息、學(xué)生信息開課信息、選課信息課程目錄數(shù)據(jù)庫數(shù)據(jù)庫系統(tǒng)任務(wù):
創(chuàng)建項(xiàng)目數(shù)據(jù)庫Catalog
創(chuàng)建數(shù)據(jù)庫表對象及其約束
完成數(shù)據(jù)庫表的數(shù)據(jù)插入、修改、刪除以及查詢處理某高校希望通過創(chuàng)建一個(gè)課程目錄數(shù)據(jù)庫,實(shí)現(xiàn)學(xué)生選課管理。一、數(shù)據(jù)庫案例3.3數(shù)據(jù)操縱SQL語句學(xué)院信息表:COLLEGE(CollegeID,CollegeName,CollegeIntro,CollegeTel)課程表:COURSE(CourseID,CourseName,CourseType,CourseCredit,CoursePeriod,TestMethod)教師表:TEACHER(TeacherID,TeacherName,TeacherGender,TeacherTitle,CollegeID,TeacherPhone)學(xué)生表:STUDENT(StudentID,StudentName,StudentGender,BirthDay,Major,StudentPhone)開課計(jì)劃表:PLAN(CoursePlanID,CourseID,TeacherID,CourseRoom,CourseTime,Note)選課注冊表:REGISTER(CourseRegID,CoursePlanID,StudentID,Note)二、單條數(shù)據(jù)插入例在學(xué)生信息表STUDENT中,原有數(shù)據(jù)見下圖所示INSERT
INTO<基本表>[<列名表>]VALUES
(列值表);其中INSERT
INTO
為插入語句的關(guān)鍵詞。<基本表>為被插入數(shù)據(jù)的數(shù)據(jù)庫表。<列名表>給出在表中插入哪些列。數(shù)據(jù)操縱SQL語句是一類對數(shù)據(jù)庫表中數(shù)據(jù)進(jìn)行變動操作的語句集。它以INSERT、UPDATE、DELETE三種語句為核心,分別完成數(shù)據(jù)的插入、更新與刪除處理。該語句執(zhí)行后,學(xué)生信息表STUDENT的數(shù)據(jù)見下圖所示。注意:在INSERT
INTO插入數(shù)據(jù)語句中,所使用的Interger和Numeric等類型數(shù)值不使用引號標(biāo)注,但Char、Varchar、Date和Datetime等值類型必須使用單引號。執(zhí)行如下插入數(shù)據(jù)SQL語句:INSERT
INTOSTUDENTVALUES('201222010002','劉菲','女','1995-04-23','軟件工程','lufei@163.com');三、多條數(shù)據(jù)插入在數(shù)據(jù)庫表插入操作中,還可以一次執(zhí)行一組SQL數(shù)據(jù)插入語句,實(shí)現(xiàn)在表中多行數(shù)據(jù)插入。例
在學(xué)生信息表STUDENT中,一次插入多個(gè)學(xué)生數(shù)據(jù),其插入數(shù)據(jù)SQL語句如下:INSERT
INTOSTUDENTVALUES('201222010003','張亮','男','1996-01-21','軟件工程','zhangl@163.com');INSERT
INTOSTUDENTVALUES('201222010004','謝云','男','1995-08-12','軟件工程','xiey@163.com');INSERT
INTOSTUDENTVALUES('201222010005','劉亞','女','1995-06-20','軟件工程',NULL);實(shí)踐操作:在SQLSERVER中執(zhí)行上述插入語句。這些語句執(zhí)行后,學(xué)生信息表STUDENT的數(shù)據(jù)見下圖所示。注意:在INSERT
INTO插入數(shù)據(jù)語句中,若某些列的值不確定,可以在該列位置使用空值(NULL),但主鍵、非空列不允許使用NULL。此外,若表中主鍵為代理鍵,它不需要出現(xiàn),因該值由DBMS自動提供實(shí)踐練習(xí):
在EMPLOYEE表中插入多個(gè)員工信息數(shù)據(jù)列名類型鍵是否非空備注EmployeeNumberInt主鍵是代理鍵NameVarChar(30)否是DepartmentChar(35)否是缺省值“人力資源”PhoneChar(12)否否EmailVarChar(100)否是要求取值唯一四、數(shù)據(jù)更新SQL語句數(shù)據(jù)更新SQL語句可以對數(shù)據(jù)表中指定數(shù)據(jù)進(jìn)行修改處理,其語句基本格式如下:UPDATE<基本表>SET<列名1>=<表達(dá)式1>[,<列名2>=<表達(dá)式2>...][WHERE<條件表達(dá)式>];其中UPDATE
為數(shù)據(jù)更新語句的關(guān)鍵詞。<基本表>為被更新數(shù)據(jù)的數(shù)據(jù)庫表。SET
關(guān)鍵詞指定對哪些列設(shè)定新值。WHERE
關(guān)鍵詞給出需要滿足的條件表達(dá)式。例
在學(xué)生信息表STUDENT中,學(xué)生“楊賓”的原有Email數(shù)據(jù)為空,現(xiàn)需要修改為“yangbin@163.com”。其數(shù)據(jù)修改的SQL語句如下:UPDATESTUDENTSETEmail=’yangbin@163.com’WHEREStudentName=’楊賓’;實(shí)踐操作:在SQLSERVER中執(zhí)行上述更新SQL語句。這個(gè)語句執(zhí)行后,學(xué)生信息表STUDENT的數(shù)據(jù)下圖所示。實(shí)踐練習(xí):
在下面的STUDENT表中,使用SQL語句將“劉亞”的出生日期和Email分別修改為“1995-05-15”、liuy@163.com。五、數(shù)據(jù)刪除SQL語句數(shù)據(jù)刪除語句DELETE將從指定數(shù)據(jù)庫表中刪除滿足條件的數(shù)據(jù)行,其語句基本格式如下:DELETE
FROM<表名>[WHERE<條件表達(dá)式>];其中DELETE
FROM為數(shù)據(jù)刪除語句的關(guān)鍵詞。<表名>為被刪除數(shù)據(jù)的數(shù)據(jù)庫表。WHERE
關(guān)鍵詞給出需要滿足的條件表達(dá)式。例在學(xué)生信息表STUDENT中,刪除姓名為“張亮”的學(xué)生數(shù)據(jù),其數(shù)據(jù)刪除的SQL語句如下:DELETE
FROMSTUDENTWHEREStudentName=’張亮’;實(shí)踐練習(xí):
在下面的STUDENT表中,刪除“張亮”信息。3.4SQL關(guān)系查詢語句一、
語句基本格式在SQL語言中,數(shù)據(jù)查詢語言(DQL)是負(fù)責(zé)對數(shù)據(jù)表進(jìn)行查詢訪問的語句,這是對數(shù)據(jù)庫訪問使用最多的一類SQL語句SELECT[ALL|DISTINCT]<目標(biāo)列>[,<目標(biāo)列>…][INTO<新表>]FROM<表名>[,<表名>…][WHERE<條件表達(dá)式>][GROUPBY<列名>[HAVING<條件表達(dá)式>][ORDERBY<列名>[ASC|DESC]];二、從單個(gè)表讀取指定列例學(xué)生信息表STUDENT原始數(shù)據(jù)如下圖所示。在數(shù)據(jù)庫中,最簡單的數(shù)據(jù)查詢操作就是從單個(gè)數(shù)據(jù)表中讀取指定列的數(shù)據(jù),其基本語句格式為:SELECT<目標(biāo)列>[,<目標(biāo)列>…]FROM<表名>;若要從STUDENT表中讀取學(xué)生的學(xué)號、姓名、專業(yè)等列數(shù)據(jù),其數(shù)據(jù)查詢SQL語句如下:SELECTStudentID,StudentName,MajorFROMSTUDENT;如果希望從STUDENT表查詢所有列數(shù)據(jù),其數(shù)據(jù)查詢SQL語句如下:SELECT*FROMSTUDENT;若希望從STUDENT表中查詢專業(yè)列(Major)數(shù)據(jù),其數(shù)據(jù)查詢SQL語句執(zhí)行結(jié)果如下:為了使讀取的數(shù)據(jù)過濾重復(fù)行,可以在查詢語句中加入DISTINCT關(guān)鍵字,其執(zhí)行結(jié)果如下。三、從單個(gè)表讀取指定行SQL查詢語句也可以從一個(gè)數(shù)據(jù)表中讀取滿足條件的指定行數(shù)據(jù),即完成關(guān)系數(shù)據(jù)的元組選擇操作,其基本語句格式如下。SELECT*FROM<表名>WHERE<條件表達(dá)式>;例
從STUDENT表中查詢性別為“男”的學(xué)生數(shù)據(jù),其數(shù)據(jù)查詢SQL語句如下。SELECT*FROMSTUDENTWHEREStudentGender=’男’;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。四、從單個(gè)表讀取指定行和列例
從STUDENT表中查詢性別為“男”的學(xué)生學(xué)號、學(xué)生姓名、性別、專業(yè)數(shù)據(jù),其數(shù)據(jù)查詢SQL語句如下。SELECTStudentID,StudentName,StudentGender,MajorFROMSTUDENTWHEREStudentGender=’男’;在SQL查詢語句中,還可以從一個(gè)數(shù)據(jù)表中讀取指定行與指定列范圍內(nèi)的數(shù)據(jù),即同時(shí)完成關(guān)系數(shù)據(jù)的行列投影操作,其基本語句格式為:SELECT<目標(biāo)列>[,<目標(biāo)列>…]FROM<表名>WHERE<條件表達(dá)式>;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。在WHERE子句中可以使用如下方式,指定范圍數(shù)據(jù)。1)使用BETWEEN..AND關(guān)鍵詞來限定列值范圍,還可以使用關(guān)鍵詞LIKE與通配符來限定查詢條件。2)SQL查詢語言的常用通配符有下劃線(_)和百分號(%)。下劃線(_)通配符用于代表一個(gè)未指定的字符。百分號(%)通配符用于代表一個(gè)或多個(gè)未指定的字符。五、Where條件子句例
若要從STUDENT表中查詢出生日期在“1995-04-01”到“1996-04-01”的學(xué)生數(shù)據(jù)。其查詢SQL語句如下:SELECT*FROMSTUDENTWHEREBirthDayBETWEEN‘1995-04-01’AND‘1996-04-01’;該語句執(zhí)行后,其查詢操作結(jié)果見下圖所示。例
若要從STUDENT表中查詢郵箱域名為“@163.com”的學(xué)生數(shù)據(jù)。其數(shù)據(jù)查詢SQL語句如下:SELECT*FROMSTUDENTWHEREEmailLIKE’%@163.com’;該語句執(zhí)行后,其查詢操作結(jié)果見下圖所示。實(shí)踐練習(xí):
從學(xué)生數(shù)據(jù)表STUDENT中查詢“劉”姓的學(xué)生信息。說明:在SQL查詢Where子句中,還可以使用多個(gè)條件表達(dá)式,并通過邏輯運(yùn)算符(AND、OR、NOT)連接操作,進(jìn)一步限定結(jié)果集的數(shù)據(jù)范圍。以及使用IN或NOT
IN關(guān)鍵詞限定列值范圍。例
從STUDENT表中查詢性別為“男”,并且專業(yè)為“軟件工程”的學(xué)生數(shù)據(jù),其數(shù)據(jù)查詢SQL語句如下。SELECTStudentID,StudentName,StudentGender,MajorFROMSTUDENTWHEREMajor=’軟件工程’ANDStudentGender=’男’;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。IN關(guān)鍵字使用:
從STUDENT表中查詢,使用IN關(guān)鍵字讀取”計(jì)算機(jī)應(yīng)用”專業(yè)的學(xué)生。其SQL語句如下所示。SELECTStudentID,StudentName,StudentGender,MajorFROMSTUDENTWHEREMajorIN('計(jì)算機(jī)應(yīng)用');實(shí)踐操作:執(zhí)行上述SQLSELECT語句。六、對結(jié)果進(jìn)行排序在SELECT查詢語句返回的結(jié)果中,行的順序是任意的。如果需要結(jié)果集排序,可以在SELECT語句中加入ORDERBY關(guān)鍵字。例
若要從STUDENT表中按學(xué)生出生日期降序輸出學(xué)生數(shù)據(jù),其數(shù)據(jù)查詢SQL語句如下。SELECT*FROMSTUDENTORDERBYBirthday
DESC;在默認(rèn)情況下,SQL查詢的結(jié)果集是按指定列值的升序排列。可以使用關(guān)鍵詞ASC和DESC選定排序是升序或降序。實(shí)踐操作:執(zhí)行上述SQLSELECT語句。如果需要結(jié)果集按多個(gè)列排序,可以分別加入關(guān)鍵字ASC或DESC改變。例
若要將STUDENT表查詢數(shù)據(jù),首先按出生日期降序排列,然后按姓名升序排列,其數(shù)據(jù)查詢SQL語句如下:SELECT*FROMSTUDENTORDER
BYBirthdayDESC,StudentNameASC;實(shí)踐練習(xí):
從學(xué)生數(shù)據(jù)表STUDENT中查詢信息,分別按姓名、出生日期升序排列輸出。七、SQL內(nèi)置函數(shù)和計(jì)算在SQL語言中,可以使用函數(shù)方式對SELECT查詢結(jié)果集數(shù)據(jù)進(jìn)行處理。這些函數(shù)可以是DBMS系統(tǒng)所提供的內(nèi)置函數(shù),也是用戶根據(jù)需要自定義函數(shù)。典型DBMS系統(tǒng)提供的內(nèi)置函數(shù)主要有以下幾類:聚合函數(shù)算術(shù)函數(shù)字符串函數(shù)日期時(shí)間函數(shù)數(shù)據(jù)類型轉(zhuǎn)換函數(shù)例
若要統(tǒng)計(jì)STUDENT表中的學(xué)生人數(shù),在SELECT語句中可以使用COUNT()函數(shù)來計(jì)算,其查詢SQL語句如下:SELECT
COUNT(*)AS學(xué)生人數(shù)FROMSTUDENT;例
若要找出STUDENT表中年齡最大和年齡最小的學(xué)生出生日期,其查詢SQL語句如下:SELECT
Min(Birthday)
AS
最大年齡,Max(Birthday)
AS
最小年齡FROMSTUDENT;例
若要計(jì)算出STUDENT表中各個(gè)學(xué)生的Email字符串長度,其查詢SQL語句如下:SELECTStudentID,StudentName,Email,LEN(Email)AS
郵箱長度FROMSTUDENT;八、SQL內(nèi)置函數(shù)和分組在SQL語言中,可在查詢結(jié)果集進(jìn)行分組數(shù)據(jù)統(tǒng)計(jì)。這是通過在SELECT語句中加入GroupBy子語句來實(shí)現(xiàn)。例
若要分專業(yè)統(tǒng)計(jì)STUDENT表中的學(xué)生人數(shù)。在SELECT語句中可以使用GROUPBY分組子句完成統(tǒng)計(jì),其查詢SQL語句如下:SELECTMajorAS
專業(yè),COUNT(StudentID)
AS
學(xué)生人數(shù)FROMSTUDENTGROUP
BYMajor;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。在分組統(tǒng)計(jì)SQL查詢語句中,還可以使用HAVING子句限定分組統(tǒng)計(jì)的條件。例
若要分專業(yè)統(tǒng)計(jì)STUDENT表中男生人數(shù),但限定只顯示人數(shù)大于2的人數(shù),其查詢SQL語句如下:SELECTMajorAS
專業(yè),COUNT(StudentID)
AS
學(xué)生人數(shù)FROMSTUDENTWHEREStudentGender=’男’GROUPBYMajorHAVINGCOUNT(*)>2;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。Groupby與having理解groupby有一個(gè)原則,就是select后面的所有列中,沒有使用聚合函數(shù)的列,必須出現(xiàn)在groupby后面或者包含在having后的聚合函數(shù)里。where子句的作用是在對查詢結(jié)果進(jìn)行分組前將不符合where條件的行去掉,即在分組之前過濾數(shù)據(jù)條件中不能包含聚合函數(shù)。having子句的作用是篩選滿足條件的組即在分組之后過濾數(shù)據(jù)條件中經(jīng)常包含聚合函數(shù)。GROUPBY是分組查詢,一般GROUPBY是和聚合函數(shù)配合使用注意:除了使用GROUPBY語句外,列的名稱是不允許和內(nèi)置函數(shù)一起混合使用。以下語句不規(guī)范。SELECT
MaxHours,
SUM(MaxHours)FROM
PROJECTWHERE
ProjectID
<=1200;DBMS產(chǎn)品在使用內(nèi)置函數(shù)的方式也不一樣。一般來說,內(nèi)置函數(shù)是不能用于WHERE子句中的。以下語句不規(guī)范:SELECT
ProjectID,
MaxHoursFROM
PROJECTWHERE
MaxHours
<
AVG(MaxHours);Groupby與having理解having子句限制的是組,而不是行。通常情況下,HAVING從句被放置在SQL命令的結(jié)尾處。當(dāng)同時(shí)含有where子句、groupby子句、having子句及聚集函數(shù)時(shí),執(zhí)行順序如下:執(zhí)行where子句查找符合條件的數(shù)據(jù);使用groupby子句對數(shù)據(jù)進(jìn)行分組;對groupby子句形成的組運(yùn)行聚集函數(shù)計(jì)算每一組的值;最后用having子句去掉不符合條件的組。having子句中的每一個(gè)元素也必須出現(xiàn)在select列表中。有些數(shù)據(jù)庫例外,如oracle.九、使用子查詢處理多個(gè)表在實(shí)際應(yīng)用中,通常需要關(guān)聯(lián)多表才能獲得所需的信息。在SELECT查詢語句中,可使用子查詢方式實(shí)現(xiàn)多表關(guān)聯(lián)查詢。例
在課程目錄數(shù)據(jù)庫中,希望能檢索出“計(jì)算機(jī)學(xué)院”的教師名單。該操作需要關(guān)聯(lián)教師信息表TEACHER和學(xué)院信息表COLLEGE,才能獲得這些數(shù)據(jù)。這里可采用子查詢方法實(shí)現(xiàn)兩表關(guān)聯(lián)查詢,其查詢SQL語句如下:SELECTTeacherID,TeacherName,TeacherTitleFROMTEACHERWHERECollegeIDIN
(SELECTCollegeID
FROMCOLLEGE
WHERECollegeName=’計(jì)算機(jī)學(xué)院’);實(shí)踐操作:執(zhí)行上述SQLSELECT語句。例:
查詢Accounting部門的單個(gè)項(xiàng)目中,工作時(shí)間超過40小時(shí)的雇員姓名。操作語句:SELECTFirstName,LastNameFROMEMPLOYEEWHEREEmployeeNumberIN(SELECTDISTINCTEmployeeNumberFROMASSIGNMENTWHEREHoursWorked>40ANDProjectIDIN(SELECTProjectID FROMPROJECT WHEREDepartment=‘Accounting’));說明:
子查詢通過嵌套可以擴(kuò)展到3層以上。運(yùn)行結(jié)果使用子查詢查找MaxHours小于平均值的項(xiàng)目SELECT
ProjectID,
MaxHoursFROM
PROJECTWHERE
MaxHours
<
(SELECT
AVG(MaxHours)
FROM
PROJECT);SELECT
ProjectID,
MaxHoursFROM
PROJECTWHERE
MaxHours
<
AVG(MaxHours);十、使用連接查詢多個(gè)表在處理多個(gè)表時(shí),子查詢只有在結(jié)果來自一個(gè)表的情況下才有用。但如果需要顯示兩個(gè)或多個(gè)表中的數(shù)據(jù),就不能使用子查詢,而需要采用連接操作。例
在課程目錄系統(tǒng)數(shù)據(jù)庫中,希望獲得各個(gè)學(xué)院的教師信息。這需要關(guān)聯(lián)教師信息表TEACHER和學(xué)院信息表COLLEGE,查詢學(xué)院名稱、教師編號、教師姓名、教師性別、職稱等信息,按學(xué)院名稱、教師編號分別排序輸出,其查詢SQL語句如下:SELECTB.CollegeNameAS
學(xué)院名稱,A.TeacherIDAS
編號,A.TeacherNameAS
姓名,A.TeacherGenderAS
性別,A.TeacherTitleAS
職稱FROMTEACHERASA,COLLEGEASBWHEREA.CollegeID=B.CollegeIDORDER
BYB.CollegeName,A.TeacherID;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。例:關(guān)聯(lián)查詢EMPLOYEE表、PROJECT表和ASSIGNMENT表,得到雇員任務(wù)工時(shí)列表及其所在項(xiàng)目名稱。操作語句:SELECTName,FirstName,LastName,HoursWorkedFROMEMPLOYEEASE,PROJECTASP,ASSIGNMENTASAWHEREE.EmployeeNumber=A.EmployeeNumberANDP.ProjectID=A.ProjectIDORDERBYP.ProjectID,A.EmployeeNumber;說明:
前面給出的案例是兩表連接實(shí)現(xiàn)查詢,同樣也可以多表關(guān)聯(lián)實(shí)現(xiàn)查詢。十一、SQLJOIN…ON語法在SQL語言中,實(shí)現(xiàn)多表關(guān)聯(lián)查詢還可以使用JOIN…ON關(guān)鍵詞的語句格式。其中兩表關(guān)聯(lián)查詢的JOIN…ON連接語句格式如下:SELECT<目標(biāo)列>[,<目標(biāo)列>…]FROM<表名1>JOIN<表名2>ON<連接條件>;例
在課程目錄系統(tǒng)數(shù)據(jù)庫中,希望獲得各個(gè)學(xué)院的教師信息。這需要關(guān)聯(lián)教師信息表TEACHER和學(xué)院信息表COLLEGE,查詢學(xué)院名稱、教師編號、教師姓名、教師性別、職稱等信息,按學(xué)院名稱、教師編號分別排序輸出,其查詢SQL語句如下:SELECTB.CollegeNameAS
學(xué)院名稱,A.TeacherIDAS
編號,A.TeacherNameAS
姓名,A.TeacherGenderAS
性別,A.TeacherTitleAS
職稱FROMTEACHERASAJOINCOLLEGEASBONA.CollegeID=B.CollegeIDORDER
BYB.CollegeName,A.TeacherID;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。十二、外部連接前節(jié)介紹的連接方式在SELECT查詢語句稱為內(nèi)部連接。在一些特殊情況下,如關(guān)聯(lián)表中一些行不匹配,部分?jǐn)?shù)據(jù)就會丟失。例
在課程目錄數(shù)據(jù)庫中,希望能查詢所有開設(shè)課程的學(xué)生選課情況,包括開設(shè)課程名稱、選課學(xué)生人數(shù)。這需要關(guān)聯(lián)課程信息表COURSE、開課計(jì)劃表PLAN、選課注冊信息表REGISTER。若使用內(nèi)連接查詢,該JOIN…ON連接查詢的SQL語句如下:SELECTC.CourseNameAS
課程名稱,T.TeacherNameAS
教師,
COUNT
(R.CoursePlanID)AS
選課人數(shù)FROMCOURSEASCJOINPLANASPONC.CourseID=P.CourseIDJOINTEACHERASTONP.TeacherID=T.TeacherIDJOINREGISTERASRONP.CoursePlanID=R.CoursePlanIDGROUP
BYC.CourseName,T.TeacherName;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。問題:在上面的內(nèi)連接查詢中,只能找出有學(xué)生注冊的課程名稱和選課人數(shù),但不能找出沒有學(xué)生注冊的課程名稱和選課人數(shù)。在SQL應(yīng)用中,有時(shí)候也希望輸出那些不滿足連接條件的元組數(shù)據(jù)。這時(shí),可使用JOIN…ON外連接方式實(shí)現(xiàn)。其實(shí)現(xiàn)方式有三種形式,具體如下:LEFTJOIN:左外連接,即使右表中沒有匹配,也從左表返回所有的行。RIGHTJOIN:右外連接,即使左表中沒有匹配,也從右表返回所有的行。FULLJOIN:全外連接,只要其中一個(gè)表中存在匹配,就返回行。例
在課程目錄系統(tǒng)數(shù)據(jù)庫中,希望能查詢所有開設(shè)課程的學(xué)生選課情況,包括開設(shè)課程名稱、選課學(xué)生人數(shù)。這需要關(guān)聯(lián)課程信息表COURSE、開課計(jì)劃表CPLAN、選課注冊信息表REGISTER。若使用左外連接查詢,該JOIN…ON連接查詢的SQL語句如下:SELECTC.CourseNameAS
課程名稱,T.TeacherNameAS
教師,COUNT
(R.CoursePlanID)AS
選課人數(shù)FROMCOURSEASCJOINCPLANASPONC.CourseID=P.CourseIDJOINTEACHERASTONP.TeacherID=T.TeacherIDLEFT
JOINREGISTERASRONP.CoursePlanID=R.CoursePlanIDGROUP
BYC.CourseName,T.TeacherName;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。一、什么是視圖3.5SQL視圖視圖——
是一種通過其它表或視圖構(gòu)建的虛擬表。它本身沒有自己的數(shù)據(jù),而是使用了存儲在表或其它視圖中的數(shù)據(jù)。二、視圖創(chuàng)建基本語句格式:CREATE
VIEW<視圖名>[(列名1),(列名2),…]AS<SELECT查詢>;例
在課程目錄數(shù)據(jù)庫中,若需要建立一個(gè)由學(xué)科基礎(chǔ)課程數(shù)據(jù)構(gòu)成的視圖BasicCourseView,其創(chuàng)建SQL語句如下。CREATE
VIEWBasicCourseViewASSELECTCourseName,CourseCredit,CoursePeriod,TestMethodFROM
COURSE;當(dāng)這個(gè)語句執(zhí)行后,在數(shù)據(jù)庫中創(chuàng)建了一個(gè)名稱為BasicCourseView的數(shù)據(jù)庫視圖對象。實(shí)踐操作:執(zhí)行上述SQLSELECT語句。當(dāng)視圖在數(shù)據(jù)庫中創(chuàng)建后,用戶可以像訪問數(shù)據(jù)表一樣去操作訪問視圖。例如,使用SELECT語句查詢該視圖數(shù)據(jù),并按課程名稱排序輸出,其SQL語句如下:SELECT*FROMBasicCourseViewORDER
BYCourseName;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。三、視圖刪除當(dāng)數(shù)據(jù)庫不再需要某視圖時(shí),可以在數(shù)據(jù)庫中刪除該視圖,其視圖的刪除語句格式如下:DROP
VIEW<視圖名>;其中DROP
VIEW
為刪除視圖語句的關(guān)鍵詞。<視圖名>為將被刪除的視圖名稱。例
在數(shù)據(jù)庫中,若需要刪除名稱為BasicCourseView的視圖對象,其刪除該視圖的SQL語句如下:DROP
VIEWBasicCourseView;四、SQL視圖使用1.使用視圖簡化復(fù)雜SQL查詢操作通過視圖,數(shù)據(jù)庫開發(fā)人員可以將復(fù)雜的查詢語句封裝在視圖內(nèi),使外部程序只需要使用簡單方式訪問該視圖,便可獲取所需要的數(shù)據(jù)。例
在課程目錄數(shù)據(jù)庫中,希望能查詢選修“數(shù)據(jù)庫原理及應(yīng)用”課程的學(xué)生名單。這需要關(guān)聯(lián)課程信息表COURSE、開課計(jì)劃表CPLAN、選課注冊信息表REGISTER、學(xué)生信息表STUDENT,其查詢SQL語句如下:SELECTC.CourseNameAS
課程名稱,S.StudentIDAS
學(xué)號,S.StudentNameAS
姓名FROMCOURSEASC,CPLANASP,REGISTERASR,STUDENTASSWHEREC.CourseID=P.CourseIDANDC.CourseName=’數(shù)據(jù)庫原理及應(yīng)用’ANDP.CoursePlanID=R.CoursePlanIDANDR.StudentID=S.StudentID;這個(gè)SQL語句是較復(fù)雜和冗長,為了讓外部程序簡單地實(shí)現(xiàn)該信息查詢,可以先定義一個(gè)名稱為DatabaseCourseView視圖,其視圖創(chuàng)建SQL語句如下:CREATE
VIEWDatabaseCourseViewAS
SELECTC.CourseNameAS
課程名稱,S.StudentIDAS
學(xué)號,S.StudentNameAS
姓名FROMCOURSEASC,CPLANASP,REGISTERASR,STUDENTASSWHEREC.CourseID=P.CourseIDANDC.CourseName=’數(shù)據(jù)庫原理及應(yīng)用’ANDP.CoursePlanID=R.CoursePlanIDANDR.StudentID=S.StudentID;當(dāng)DatabaseCourseView視圖被創(chuàng)建完成后,外部程序就可以通過一個(gè)簡單的SELECT語句查詢視圖數(shù)據(jù),其操作語句如下:SELECT*FROMDatabaseCourseView;實(shí)踐操作:執(zhí)行上述SQLSELECT語句。2.使用視圖提高數(shù)據(jù)訪問安全性通過視圖可以將基本數(shù)據(jù)表部分敏感數(shù)據(jù)隱藏起來,外部用戶無法得知數(shù)據(jù)表的完整數(shù)據(jù),降低數(shù)據(jù)庫被攻擊的風(fēng)險(xiǎn)。此外,還可以保護(hù)部分隱私數(shù)據(jù)。例
在課程目錄系統(tǒng)數(shù)據(jù)庫中,除管理部門用戶外,其他用戶只能瀏覽教師基本信息,如教師編號、教師姓名、性別、職稱、所屬學(xué)院,教師其他信息被隱藏,可定義視圖來處理信息,其視圖創(chuàng)建SQL語句如下:CREATE
VIEWBasicTeacherInfoViewAS
SELECTT.TeacherIDAS
編號,T.TeacherNameAS
教師姓名,T.TeacherGender
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度投資款轉(zhuǎn)為房地產(chǎn)貸款合同法律依據(jù)分析3篇
- 2024年城堡裝修項(xiàng)目合同2篇
- 2023年重慶萬州區(qū)周家壩街道公益性崗位招聘筆試真題
- 2024年度水果農(nóng)場電商運(yùn)營合同3篇
- 2024年小區(qū)車位租賃協(xié)議2篇
- 2024年度三人合伙成立科技公司股權(quán)分配合同2篇
- 2024年度某藥品生產(chǎn)公司與某藥品銷售公司之間的藥品銷售代理合同2篇
- 購買拍賣店面合同范例
- 2024年度創(chuàng)業(yè)投資企業(yè)委托項(xiàng)目人才招聘合同3篇
- 2024年度演藝經(jīng)紀(jì)合同:含藝人培養(yǎng)、演出與代言2篇
- 【MOOC】法理學(xué)-西南政法大學(xué) 中國大學(xué)慕課MOOC答案
- 遼寧省普通高中2024-2025學(xué)年高一上學(xué)期12月聯(lián)合考試語文試題(含答案)
- 儲能運(yùn)維安全注意事項(xiàng)
- 2024蜀繡行業(yè)市場趨勢分析報(bào)告
- 電力法律法規(guī)培訓(xùn)
- 2024年世界職業(yè)院校技能大賽“智能網(wǎng)聯(lián)汽車技術(shù)組”參考試題庫(含答案)
- 【課件】校園安全系列之警惕“死亡游戲”主題班會課件
- 化工企業(yè)冬季安全生產(chǎn)檢查表格
- 2024年工程勞務(wù)分包聯(lián)合協(xié)議
- 蜜雪冰城員工合同模板
- 廣東省深圳市龍崗區(qū)2024-2025學(xué)年三年級上學(xué)期11月期中數(shù)學(xué)試題(含答案)
評論
0/150
提交評論