版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第三章 結構化查詢語言 學習創(chuàng)建數(shù)據(jù)庫結構的基本SQL語句 學習將數(shù)據(jù)添加到數(shù)據(jù)庫的基本SQL語句 學習單表的基本SQL查詢語句 學習多表關聯(lián)的SQL查詢語句 使用SQL語句修改與刪除數(shù)據(jù)庫表中數(shù)據(jù) 使用SQL語句修改與刪除數(shù)據(jù)庫表和約束 學習使用基本SQL語句創(chuàng)建和使用視圖【學習目標】一、基本概念3.1 SQL簡介SQL( Structured Query Language,結構化查詢語言 )它是一種對數(shù)據(jù)庫進行訪問與操作的數(shù)據(jù)子語言。它嵌入到編程語言(如JAVA、C#等)中執(zhí)行或在DBMS工具中執(zhí)行。二、SQL發(fā)展 20世紀70年代由IBM公司開發(fā) 1986 ANSI的數(shù)據(jù)庫委員會批準了S
2、QL作為關系型數(shù)據(jù)庫語言的美國標準。 1987年國際標準化組織(ISO)將其采納為國際標準SQL86。 1989年更新成為國際標準SQL-89 1992年更新成為國際標準SQL-92(或稱SQL2) 2019年更新成為國際標準SQL-99(或稱SQL3) 2019年更新成為國際標準SQL:2019三、SQL應用情況絕大多數(shù)主流的關系型數(shù)據(jù)庫管理系統(tǒng)采用了SQL語言標準OracleSybaseDB2Microsoft SQL ServerAccessMySql。其中一些數(shù)據(jù)庫管理系統(tǒng)對SQL語句進行了再開發(fā)和擴展,如Sybase、 Microsoft SQL Server將操作語言擴展為Tran
3、saction-SQL;Oracle將操作語言擴展為PL/SQL。四、SQL能做什么? SQL 可從數(shù)據(jù)庫取回數(shù)據(jù) SQL 可在數(shù)據(jù)庫中插入新的紀錄 SQL 可更新數(shù)據(jù)庫中的數(shù)據(jù) SQL 可從數(shù)據(jù)庫刪除記錄 SQL 可創(chuàng)建新數(shù)據(jù)庫 SQL 可在數(shù)據(jù)庫中創(chuàng)建新表 SQL 可在數(shù)據(jù)庫中創(chuàng)建存儲過程 SQL 可在數(shù)據(jù)庫中創(chuàng)建視圖 SQL 可以設置表、存儲過程和視圖的權限 數(shù)據(jù)庫DBMS(執(zhí)行SQL)應用程序返回結果提交SQL五、SQL語言語句類別1. 數(shù)據(jù)操縱語言數(shù)據(jù)操縱語言(Data Manipulation Language,DML)是SQL語言中用于查詢和增刪修改表數(shù)據(jù)的語句,主要語句如下:
4、SELECT - 從數(shù)據(jù)庫表中獲取數(shù)據(jù) UPDATE - 更新數(shù)據(jù)庫表中的數(shù)據(jù) DELETE - 從數(shù)據(jù)庫表中刪除數(shù)據(jù) INSERT - 向數(shù)據(jù)庫表中插入數(shù)據(jù)2. 數(shù)據(jù)定義語言數(shù)據(jù)定義語言(Data Definition Language,DDL)是SQL語言中用于創(chuàng)建或刪除表。也可以定義索引(鍵),規(guī)定表之間的鏈接,以及施加表間的約束。主要語句如下: CREATE DATABASE - 創(chuàng)建新數(shù)據(jù)庫 ALTER DATABASE - 修改數(shù)據(jù)庫 CREATE TABLE - 創(chuàng)建新表 ALTER TABLE - 變更(改變)數(shù)據(jù)庫表 DROP TABLE - 刪除表 CREATE INDEX
5、 - 創(chuàng)建索引(搜索鍵) DROP INDEX - 刪除索引 六、SQL語言程序創(chuàng)建數(shù)據(jù)庫表CUSTOMERCOURSEENROLLMENTDDL插入數(shù)據(jù)庫表CUSTOMERDML七、示例數(shù)據(jù)庫部門(DEPARTMENT)雇員(EMPLOYEE)項目(PROJECT)任務(ASSIGNMENT)工程項目管理列名類型鍵是否非空備注DepartmentNameText(35)主鍵是部門名稱BudgetCodeText(30)否是預算編號OfficeNumberText(15)否是辦公室編號PhoneText(12)否是辦公電話部門(DEPARTMENT)表結構1. 數(shù)據(jù)庫表結構列名類型鍵是否非空備
6、注EmployeeNumberInt主鍵是代理鍵,雇員編號FirstNameText(30)否是名LastNameText(30)否是姓DepartmentText(35)外鍵是部門PhoneText(12)否是辦公電話EmailText(100)否是郵件雇員(EMPLOYEE)表結構列名類型鍵是否非空備注ProjectIDInt主鍵是項目編號NameText(30)否是項目名稱DepartmentText(35)外鍵是部門MaxHoursNumber否是最長工期StartDateDateTime否否開始日期EndDateDateTime否否結束日期項目(PROJECT)表結構列名類型鍵是否非
7、空備注ProjectIDInt主鍵,外鍵是復合鍵,項目編號EmployeeNumberInt主鍵,外鍵是復合鍵,雇員編號HoursWorkedNumeric(6,2)否否工作時數(shù)任務(ASSIGNMENT)表結構列名類型鍵是否非空備注DepartmentNameText(35)主鍵是部門名稱BudgetCodeText(30)否是預算編號OfficeNumberText(15)否是辦公室編號PhoneText(12)否是辦公電話列名類型鍵是否非空備注EmployeeNumberInt主鍵是代理鍵,雇員編號FirstNameText(30)否是名LastNameText(30)否是姓Depart
8、mentText(35)外鍵是部門PhoneText(12)否是辦公電話EmailText(100)否是郵件參照完整性約束DEPARTMENT表EMPLOYEE表2. 數(shù)據(jù)庫表聯(lián)系參照完整性約束列名類型鍵是否非空備注DepartmentNameText(35)主鍵是部門名稱BudgetCodeText(30)否是預算編號OfficeNumberText(15)否是辦公室編號PhoneText(12)否是辦公電話DEPARTMENT表結構列名類型鍵是否非空備注ProjectIDInt主鍵是項目編號NameText(30)否是項目名稱DepartmentText(35)外鍵是部門MaxHoursN
9、umeric(6,2)否是最長工期StartDateDateTime否否開始日期EndDateDateTime否否結束日期PROJECT表結構參照完整性約束參照完整性約束列名類型鍵是否非空備注ProjectIDInt主鍵是項目編號NameText(30)否是項目名稱DepartmentText(35)外鍵是部門MaxHoursNumber否是最長工期StartDateDateTime否否開始日期EndDateDateTime否否結束日期PROJECT表結構列名類型鍵是否非空備注ProjectIDInt主鍵,外鍵是復合鍵,項目編號EmployeeNumberInt主鍵,外鍵是復合鍵,雇員編號Ho
10、ursWorkedNumeric(6,2)否否工作時數(shù)ASSIGNMENT表結構參照完整性約束PROJECT表數(shù)據(jù)ASSIGNMENT表數(shù)據(jù)3. 業(yè)務規(guī)則 如果要刪除EMPLOYEE中的某個行,而該行連接到ASSIGNMENT,則禁止對EMPLOYEE行執(zhí)行刪除操作 如果刪除了PROJECT中的某個行,則ASSIGNMENT中連接到這個已刪除的PROJECT行的所有行也將隨之被刪除 如果刪除了EMPLOYEE表中的某個行(例如一個雇員已調(diào)離),就必須有人接替這個雇員工作。應用程序需要在刪除原雇員前,把該雇員的任務重新分配給另一個雇員。 如果刪除了PROJECT表中的某個行,就取消這個項目,因此
11、不必維護這個項目的相關記錄。業(yè)務規(guī)則含義一、SQL語言 DDL語句組成數(shù)據(jù)定義語言(Data Definition Language,DDL)是SQL語言中用于創(chuàng)建或刪除表。也可以定義索引(鍵),規(guī)定表之間的鏈接,以及施加表間的約束。主要語句如下: CREATE DATABASE - 創(chuàng)建新數(shù)據(jù)庫 ALTER DATABASE - 修改數(shù)據(jù)庫 CREATE TABLE - 創(chuàng)建新表 ALTER TABLE - 變更(改變)數(shù)據(jù)庫表 DROP TABLE - 刪除表 CREATE INDEX - 創(chuàng)建索引(搜索鍵) DROP INDEX - 刪除索引 3.2 用于數(shù)據(jù)定義的SQL語句二、CREA
12、TE TABLE語句1. 語句基本格式CREATE TABLE NewTableName( ColumnName DataType OptionalConstraint, ColumnName DataType OptionalConstraint, ColumnName DataType OptionalConstraint, );列名關鍵字表名列類型列約束例: 雇員數(shù)據(jù)庫表EMPLOYEE創(chuàng)建CREATE TABLE EMPLOYEE( EmployeeNumber Int, FirstName Char(30), LastName Char(30), Department Char(35
13、), Phone Char(12), EmailVarChar(100) );2. 列約束條件CREATE TABLE NewTableName( ColumnName DataType OptionalConstraint, ColumnName DataType OptionalConstraint, ColumnName DataType OptionalConstraint, );列約束子句 PRIMARY KEY主鍵 NOT NULL非空值 NULL空值 UNIQUE值唯一 CHECK有效性檢查 DEFAULT缺省值CREATE TABLE DEPARTMENT( Departmen
14、tName Char(35) PRIMARY KEY, BudgetCode Char(30)NOT NULL, OfficeNumber Char(15)NOT NULL, Phone Char(12)NOT NULL );例1: 部門數(shù)據(jù)庫表DEPARTMENT創(chuàng)建列名類型鍵是否非空備注DepartmentNameChar(35)主鍵是BudgetCodeChar(30)否是OfficeNumberChar(15)否是PhoneChar(12)否是DBMS執(zhí)行SQL語句SQL Server執(zhí)行sql語句CREATE TABLE EMPLOYEE( EmployeeNumber Int PR
15、IMARY KEY IDENTITY(1,1), FirstName Char(30)NOT NULL, LastName Char(30)NOT NULL, Department Char(35)NOT NULL DEFAULT 人力資源, Phone Char(12)NULL, EmailVarChar(100)NOT NULL UNIQUE );例2: 雇員數(shù)據(jù)庫表EMPLOYEE創(chuàng)建列名類型鍵是否非空備注EmployeeNumberInt主鍵是代理鍵FirstNameChar(30)否是LastNameChar(30)否是DepartmentChar(35)否是缺省值“人力資源”Pho
16、neChar(12)否否EmailVarChat(100)否是要求取值唯一CREATE TABLE PROJECT( ProjectID Int PRIMARY KEY, Name Char(30)NOT NULL, Department Char(35)CHECK (Department IN(財務,銷售,人事), MaxHours Numeric(6,2) NOT NULL DEFAULT 100, StartDate DateTime NULL, EndDate DateTime NULL );練習: 項目數(shù)據(jù)庫表PROJECT創(chuàng)建列名類型鍵是否非空備注ProjectIDInt主鍵是Na
17、meChar(30)否是DepartmentChar(35)否是MaxHoursNumeric(6,2)否是缺省值“100”StartDateDateTime否否EndDateDateTime否否三、SQL語言的數(shù)據(jù)類型1. 基本數(shù)據(jù)類型 字符:CHAR、VARCHAR、TEXT 整數(shù):SMALLINT、INTEGER 浮點數(shù):NUMBER(n,d)、FLOAT(n,d) 日期:DATE、DATETIME 貨幣:MONEY2. 不同數(shù)據(jù)庫所支持數(shù)據(jù)類型見P98頁,圖3-5(a)所示SQL Server2019的數(shù)據(jù)類型見P99頁,圖3-5(b)所示ORACLE Database11g的數(shù)據(jù)類型
18、見P99頁,圖3-5(c)所示MySQL的數(shù)據(jù)類型四、使用表約束定義主鍵CREATE TABLE DEPARTMENT( DepartmentName Char(35) NOT NULL, BudgetCode Char(30)NOT NULL, OfficeNumber Char(15)NOT NULL, Phone Char(12)NOT NULL, CONSTRAINTDEPARTMENT_PKPRIMARY KEY(DepartmentName) );使用表約束定義主鍵的優(yōu)點: 便于定義復合主鍵 可命名主鍵約束 便于定義代理鍵例1: 項目數(shù)據(jù)庫表PROJECT創(chuàng)建CREATE TABL
19、E PROJECT( ProjectID Int NOT NULL AUTO_INCREMENT, Name Char(30)NOT NULL, Department Char(35)NOT NULL, MaxHours Numeric(6,2) NOT NULL DEFAULT 100, StartDate DateTime NULL, EndDate DateTime NULL, CONSTRAINTPROJECT_PKPRIMARY KEY(ProjectID) );MySQL 執(zhí)行sql語句例2: 任務分配數(shù)據(jù)庫表ASSIGNMENT創(chuàng)建CREATE TABLE ASSIGNMENT(
20、 ProjectID Int NOT NULL, EmployeeNumberIntNOT NULL, HoursWorked Numeric(6,2) NULL, CONSTRAINTASSIGNMENT_PKPRIMARY KEY(ProjectID,EmployeeNumber) );列名類型鍵是否非空備注DepartmentNameText(35)主鍵是OfficeNumberText(15)否是PhoneText(12)否是列名類型鍵是否非空備注EmployeeNumberInt主鍵是FirstNameText(30)否是LastNameText(30)否是DepartmentTex
21、t(35)外鍵是PhoneText(12)否否EmailText(100)否否五、使用表約束定義外鍵參照完整性約束DEPARTMENT表EMPLOYEE表CREATE TABLE EMPLOYEE( EmployeeNumber Int NOT NULL AUTO_INCREMENT, FirstName Char(30)NOT NULL, LastName Char(30)NOT NULL, Department Char(35)NOT NULL DEFAULT 人力資源, Phone Char(12)NULL, EmailVarChar(100)NOT NULL UNIQUE, CONST
22、RAINTEMPLOYEE_PKPRIMARY KEY(EmployeeNumber ), CONSTRAINTEMP_DEPART_FKFOREIGN KEY(Department)REFERENCES DEPARTMENT(DepartmentName)ON UPDATE CASCADE );列名類型鍵是否非空備注DepartmentNameText(35)主鍵是部門名稱BudgetCodeText(30)否是預算編號OfficeNumberText(15)否是辦公室編號PhoneText(12)否是辦公電話DEPARTMENT表結構列名類型鍵是否非空備注ProjectIDInt主鍵是項目
23、編號NameText(30)否是項目名稱DepartmentText(35)外鍵是部門MaxHoursNumeric(6,2)否是最長工期StartDateDateTime否否開始日期EndDateDateTime否否結束日期PROJECT表結構參照完整性約束編寫實現(xiàn)下表關聯(lián)的參照完整性約束SQL語句CREATE TABLE PROJECT( ProjectID Int NOT NULL AUTO_INCREMENT, Name Char(30)NOT NULL, Department Char(35)NOT NULL, MaxHours Numeric(6,2) NOT NULL DEFAU
24、LT 100, StartDate DateTime NULL, EndDate DateTime NULL, CONSTRAINTPROJECT_PKPRIMARY KEY(ProjectID), CONSTRAINTPROJ_DEPART_FK FOREIGN KEY(Department)REFERENCES DEPARTMENT (DepartmentName) ON UPDATE CASCADE );列名類型鍵是否非空備注ProjectIDInt主鍵是NameText(30)否是DepartmentText(35)外鍵是MaxHoursNumber否是StartDateDateTim
25、e否否EndDateDateTime否否PROJECT表結構列名類型鍵是否非空備注ProjectIDInt主鍵,外鍵是EmployeeNumberInt主鍵,外鍵是HoursWorkedNumeric(6,2)否否ASSIGNMENT表結構參照完整性約束編寫實現(xiàn)下表關聯(lián)的參照完整性約束列名類型鍵是否必需備注ProjectIDInt主鍵,外鍵是EmployeeNumberInt主鍵,外鍵是HoursWorkedNumeric(6,2)否否ASSIGNMENT表結構參照完整性約束列名類型鍵是否必需備注EmployeeNumberInt主鍵是FirstNameText(30)否是LastNameTe
26、xt(30)否是DepartmentText(35)外鍵是PhoneText(12)否是EmailText(120)否是EMPLOYEE表CREATE TABLE ASSIGNMENT( ProjectID Int NOT NULL, EmployeeNumberIntNOT NULL, HoursWorked Numeric(6,2) NULL, CONSTRAINTASSIGNMENT_PKPRIMARY KEY(ProjectID,EmployeeNumber), CONSTRAINTASSIGN_PROJ_FK FOREIGN KEY(ProjectID)REFERENCES PROJ
27、ECT(ProjectID)ON UPDATE NO ACTIONON DELETE CASCADE,CONSTRAINTASSIGN_EMP_FK FOREIGN KEY(EmployeeNumber)REFERENCES EMPLOYEE(EmployeeNumber)ON UPDATE NO ACTIONON DELETE NO ACTION );一、SQL的數(shù)據(jù)操縱語句3.3 插入關系數(shù)據(jù)的SQL語句 SELECT - 從數(shù)據(jù)庫表中獲取數(shù)據(jù) UPDATE - 更新數(shù)據(jù)庫表中的數(shù)據(jù) DELETE - 從數(shù)據(jù)庫表中刪除數(shù)據(jù) INSERT - 向數(shù)據(jù)庫表中插入數(shù)據(jù)二、SQL的插入數(shù)據(jù)語句1.
28、 語句基本格式INSERT INTO TableName VALUES(列值,列值, ,列值)例1: 部門數(shù)據(jù)庫表DEPARTMENT插入記錄數(shù)據(jù)INSERT INTO DEPARTMENT VALUES (Administration, BC-100-10, BLDG01-300, 360-285-8100);說明:如果DBMS提供了代理鍵功能,則在插入具有代理鍵的數(shù)據(jù)庫表時,該項不需要放入值。例2: 項目數(shù)據(jù)庫表PROJECT插入記錄數(shù)據(jù),因ProjectID是代理鍵,插入數(shù)據(jù)語句為INSERT INTO PROJECT VALUES(2019 Q3 Product Plan, Marke
29、ting,135.00,10-MAY-05 15-JUN-05);例3: 如果缺少某些列,那么插入語句應該列出提供數(shù)據(jù)的列名INSERT INTO PROJECT (Name, Department, MaxHours, StartDate)VALUES(2019 Q4 Portfolio Analysis, Finance, 140.00, 2019-10-05);例4: 部門數(shù)據(jù)庫表DEPARTMENT插入多條記錄數(shù)據(jù)INSERT INTO DEPARTMENT VALUES(Administration, BC-100-10, BLDG01-300, 360-285-8100);INSE
30、RT INTO DEPARTMENT VALUES(Legal, BC-200-10, BLDG01-200, 360-285-8200);INSERT INTO DEPARTMENT VALUES(Accounting, BC-300-10, BLDG01-100, 360-285-8300);INSERT INTO DEPARTMENT VALUES(Finance, BC-400-10, BLDG01-140, 360-285-8400);INSERT INTO DEPARTMENT VALUES(Human Resources, BC-500-10, BLDG01-180, 360-2
31、85-8500);INSERT INTO DEPARTMENT VALUES(Production, BC-600-10, BLDG02-100, 360-287-8600);INSERT INTO DEPARTMENT VALUES(Marketing, BC-700-10, BLDG02-200, 360-287-8700);INSERT INTO DEPARTMENT VALUES(Info Systems, BC-800-10, BLDG02-270, 360-287-8800);說明:為了使INSERT語句起作用,必須為所有NOT NULL列提供值一、SQL關系查詢語句3.4 SQL
32、關系查詢語句1. 語句基本格式SELECT ColumnNames FROM TableNameWHERE SomeConditionExits;2. 從單個表讀取指定列例 從PROJECT表中查詢讀取Name,Department,MaxHours三列數(shù)據(jù) SQL Server查詢操作結果SELECT Name,Department,MaxHours FROM PROJECT; DBC-e03-Ch03-SQLQuery01 SQL 查詢語句如下: MYSQL查詢操作結果例: 從項目數(shù)據(jù)庫表RPOJECT提取Department列SELECT Department FROM PROJECT;
33、 DBC-e03-Ch03-SQLQuery03其結果為:說明:SQL SELECT語句執(zhí)行后的結果也應該是一個關系。為了使讀取的數(shù)據(jù)刪除重復行,可以在查詢語句中加入DISTINCT關鍵字:SELECT DISTINCT Department FROM PROJECT; DBC-e03-Ch03-SQLQuery04其結果為:3.從單個表讀取指定行例 從PROJECT表中查詢讀取Finance部門資助的項目列表PROJECT表中查詢的SQL SELECT語句如下:SELECT ProjectID, Name, Department, MaxHours, StartDate, EndDateFR
34、OM PROJECTWHERE Department = Finance; DBC-e03-Ch03-SQLQuery05說明: 在SELECT關鍵字后使用(*),可以提取所有列SELECT *FROM PROJECTWHERE Department = Finance; DBC-e03-Ch03-SQLQuery06說明: 在WHERE子句中放置更多條件,可以提取指定范圍數(shù)據(jù)。SELECT *FROM PROJECTWHERE Department = Finance AND MaxHours 135; DBC-e03-Ch03-SQLQuery084.從單個表讀取指定行和指定列例1 從EM
35、PLOYEE表中查詢讀取Accounting部門所有雇員的FirstName,LastName,Phone和Department值。SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEWHERE Department = Accounting; DBC-e03-Ch03-SQLQuery09例2 從EMPLOYEE表中查詢,使用OR關鍵字讀取在Accounting部門工作或電話號碼為360-285-8310的雇員。SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEW
36、HERE Department = Accounting OR Phone= 360-285-8410; Ch03-SQLQuery11例3 從EMPLOYEE表中查詢,使用IN關鍵字讀取Accounting、Finance、Marketing部門工作的雇員。SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEWHERE Department IN (Accounting, Finance, Marketing) ; Ch03-SQLQuery12例4 從EMPLOYEE表中查詢,使用NOT IN關鍵字讀取不在Accounting
37、、Finance、Marketing部門工作的雇員。SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEWHERE Department NOT IN (Accounting, Finance, Marketing) ; Ch03-SQLQuery135.在WHERE子句中指定范圍、使用通配符 例1 從EMPLOYEE表中查詢,使用BETWEEN指定范圍。SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEWHERE EmployeeNumber BETWEEN 2
38、AND 5; Ch03-SQLQuery14SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEWHERE EmployeeNumber BETWEEN 2 AND 5;等同于如下查詢SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEWHERE EmployeeNumber =2 AND EmployeeNumber= 5; Ch03-SQLQuery14-b例2 從PROJECT表中查詢,使用LIKE和通配符_指定范圍。SELECT *FROM PROJECTWH
39、ERE Name LIKE 2019 Q_ Portfolio Analysis; Ch03-SQLQuery15例3 從EMPLOYEE表中查詢,使用LIKE和%代替一個或任意多個字符。SELECT *FROM EMPLOYEEWHERE Phone LIKE 360-287-%; Ch03-SQLQuery17例4 從EMPLOYEE表中查詢,使用IS NULL關鍵詞在WHERE子句中查找電話號碼含有Null的行 。SELECT FirstName,LastName,Phone,DepartmentFROM EMPLOYEEWHERE Phone IS NULL; Ch03-SQLQuer
40、y196.對結果進行排序例1 從EMPLOYEE表中查詢,使用ORDER BY關鍵詞對結果行進行排序。SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEORDER BY Department; Ch03-SQLQuery20 在SELECT查詢語句返回的結果中,行的順序是任意的。如果需要結果集排序,可以在SELECT語句中加入ORDER BY關鍵字。升序排序例2 從EMPLOYEE表中查詢,使用DESC關鍵詞對結果集進行降序排序。SELECT FirstName, LastName, Phone, DepartmentFROM
41、EMPLOYEEORDER BY Department DESC; Ch03-SQLQuery21 默認情況,在SELECT的ORDER BY查詢結果,是升序排序。如果需要結果集降序排序,可以加入關鍵字DESC改變。降序排序例3 從EMPLOYEE表中查詢,首先對Department列降序排序,然后再對LastName列按升序排序。SELECT FirstName, LastName, Phone, DepartmentFROM EMPLOYEEORDER BY Department DESC, LastName ASC; Ch03-SQLQuery22 如果需要結果集按多個列排序,可以分別加
42、入關鍵字ASC或DESC改變。多列排序7.SQL內(nèi)置函數(shù)和計算例1 從PROJECT表中查詢,使用COUNT函數(shù)統(tǒng)計項目數(shù)量。SELECT COUNT(*)FROM PROJECT; Ch03-SQLQuery23 SQL允許基于表中的數(shù)據(jù)計算。SQL包含5個內(nèi)置函數(shù):COUNT、SUM、AVG、MAX、MIN。這些函數(shù)都針對SELECT語句的結果集進行操作。例2 從PROJECT表中查詢,使用COUNT函數(shù)統(tǒng)計行數(shù)時,加入自定義列名。SELECT COUNT(*) AS NumberofProjectsFROM PROJECT; Ch03-SQLQuery24注意:上面結果沒有列名??梢允褂?/p>
43、AS關鍵字賦予列名。例3 從PROJECT表中查詢,使用MIN、MAX、SUM函數(shù)分別給出最小項目工時、最大項目工時、總工時統(tǒng)計值。SELECT MIN(MaxHours) AS MinmumMaxHours,MAX(MaxHours) AS MaximumMaxHours,SUM(MaxHours) AS TotalMaxHoursFROM PROJECTWHERE ProjectID = 1200; Ch03-SQLQuery27例4 從PROJECT表中查詢,分別給出每個項目的最大成本。假定雇員的工資是18.5美元/每工時。SELECT ProjectID, Name, MaxHours
44、,(18.5 * MaxHours) AS MaxProjectCostFROM PROJECT; Ch03-SQLQuery28注意:除了后面將提到的GROUP BY語句外,列的名稱是不允許和內(nèi)置函數(shù)一起混合使用。以下語句不規(guī)范。SELECT MaxHours,SUM( MaxHours)FROM PROJECTWHERE ProjectID = 1200; Ch03-SQLQuery29 DBMS產(chǎn)品在使用內(nèi)置函數(shù)的方式也不一樣。一般來說,內(nèi)置函數(shù)是不能用于WHERE子句中的。以下語句不規(guī)范:SELECT ProjectID,MaxHoursFROM PROJECTWHERE MaxHou
45、rs 1; Ch03-SQLQuery32說明: 可以對形成的組使用HAVING子句應用某些條件,從而進一步限制所得結果。運行結果例3: 從EMPLOYEE表中查詢,同時使用WHERE子句和HAVING子句條件查詢EmployeeNumber小于或等于6的雇員,然后形成分組,最后應用HAVING條件,進行統(tǒng)計。操作語句:SELECT Department,Count(*) AS NumberofEmployeeFROM EMPLOYEEWHERE EmployeeNumber 1; Ch03-SQLQuery33說明: 在GROUP BY語句中,可以同時使用WHERE子句和HAVING子句進行
46、分組條件統(tǒng)計。運行結果9.使用子查詢處理多個表例1 想知道在某個任務中,工作時間超過50小時的所有雇員姓名。雇員名稱存儲在EMPLOYEE表中,但他們的工作時間則存儲在ASSIGNMENT表中。SELECT FirstName, LastNameFROM EMPLOYEEWHERE EmployeeNumber IN (SELECT DISTINCT EmployeeNumber FROM ASSIGNMENTWHERE HoursWorked 50); Ch03-SQLQuery36 有時候,需要從多個表進行查詢,才能獲得所需信息。運行結果例2: 查詢Accounting部門的單個項目中,工
47、作時間超過40小時的雇員姓名。操作語句:SELECT FirstName, LastNameFROM EMPLOYEEWHERE EmployeeNumber IN (SELECT DISTINCT EmployeeNumber FROM ASSIGNMENT WHERE HoursWorked40 AND ProjectID IN (SELECT ProjectIDFROM PROJECTWHERE Department = Accounting); Ch03-SQLQuery39說明: 子查詢通過嵌套可以擴展到3層以上。運行結果10.使用連接查詢多個表例1 從EMPLOYEE表和ASSIG
48、NMENT表關聯(lián)查詢,得到雇員任務工時列表。SELECT FirstName, LastName, HoursWorkedFROM EMPLOYEE, ASSIGNMENTWHERE EMPLOYEE.EmployeeNumber = ASSIGNMENT.EmployeeNumber; Ch03-SQLQuery40 在處理多個表時,子查詢只有在結果來自一個表的情況下才有用。但如果需要顯示兩個或多個表中的數(shù)據(jù),就不能使用子查詢,而需要采用連接操作。運行結果例2:關聯(lián)查詢EMPLOYEE表和ASSIGNMENT表,得到雇員任務工時列表結果集;然后對結果集按雇員分組,統(tǒng)計他們的工作時間。操作語句
49、:SELECT FirstName, LastName,SUM(HoursWorked) AS TotalHoursWorkedFROM EMPLOYEE AS E, ASSIGNMENT AS AWHERE E.EmployeeNumber =A.EmployeeNumberGROUP BY FirstName, LastName; Ch03-SQLQuery41說明: 連接本身其實也是一個表,同樣可以采用SELECT語句操作,還可使用AS關鍵字將別名賦予表名,簡化語句。運行結果例3:關聯(lián)查詢EMPLOYEE表、PROJECT表和ASSIGNMENT表,得到雇員任務工時列表及其所在項目名稱。
50、操作語句:SELECT Name,FirstName, LastName,HoursWorkedFROM EMPLOYEE AS E, PROJECT AS P,ASSIGNMENT AS AWHERE E.EmployeeNumber =A.EmployeeNumber AND P.ProjectID=A.ProjectID ORDER BY P.ProjectID, A.EmployeeNumber; Ch03-SQLQuery43說明: 前面給出的案例是兩表連接實現(xiàn)查詢,同樣也可以多表關聯(lián)實現(xiàn)查詢。運行結果11.SQL JOIN ON語法 在SELECT查詢語句中,也可使用專門的連接JO
51、INON關鍵字實現(xiàn)前面的連接操作。SELECT FirstName, LastName, HoursWorkedFROM EMPLOYEE, ASSIGNMENTWHERE EMPLOYEE.EmployeeNumber = ASSIGNMENT.EmployeeNumberORDER BY EMPLOYEE.EmployeeNumber,ProjectID; Ch03-SQLQuery41例1 從EMPLOYEE表和ASSIGNMENT表關聯(lián)查詢,得到雇員任務時間列表。上述操作也可使用JOINON關鍵字實現(xiàn)SELECT FirstName, LastName, HoursWorkedFROM
52、 EMPLOYEE JOIN ASSIGNMENTON EMPLOYEE.EmployeeNumber = ASSIGNMENT.EmployeeNumberORDER BY EMPLOYEE.EmployeeNumber,ProjectID; Ch03-SQLQuery44運行結果說明: 同樣,連接JOINON關鍵字也可用于多表關聯(lián)操作。例2 從EMPLOYEE表、PROJECT表和ASSIGNMENT表關聯(lián)查詢,得到雇員任務時間列表和項目名。上述操作也可使用JOINON關鍵字實現(xiàn)操作語句:SELECT Name,FirstName, LastName,HoursWorkedFROM EMP
53、LOYEE AS E, PROJECT AS P,ASSIGNMENT AS AWHERE E.EmployeeNumber =A.EmployeeNumber AND P.ProjectID=A.ProjectID ORDER BY P.ProjectID, A.EmployeeNumber; Ch03-SQLQuery43SELECT Name,FirstName, LastName,HoursWorkedFROM EMPLOYEE AS E JOIN ASSIGNMENT AS A ON E.EmployeeNumber =A.EmployeeNumber JOIN PROJECT AS
54、 P ON A.ProjectID = P.ProjectIDORDER BY P.ProjectID, A.EmployeeNumber; Ch03-SQLQuery45運行結果12.外部連接針對前面的三表連接例子,若在PROJECT表中新增一條記錄數(shù)據(jù),如下語句完成操作。 前節(jié)介紹的連接方式在SELECT查詢語句稱為內(nèi)部連接。 在一些特殊情況下,如關聯(lián)表中一些行不匹配,部分數(shù)據(jù)就會丟失。INSERT INTO PROJECT(Name,Department,MaxHours,StartDate) VALUES (2019 Q4 Tax Preparation,Accounting,175.
55、0, 2019-12-10 );Ch03-SQLQuery46-A使用如下查詢,查看ROJECT表中數(shù)據(jù)。SELECT * FROM PROJECT;運行結果當我們再次使用前面連接EMPLOYEE、ASSIGNMENT、PROJECT查詢。SELECT Name,FirstName, LastName,HoursWorkedFROM EMPLOYEE AS E JOIN ASSIGNMENT AS A ON E.EmployeeNumber =A.EmployeeNumber JOIN PROJECT AS P ON A.ProjectID = P.ProjectIDORDER BY P.Pr
56、ojectID, A.EmployeeNumber;Ch03-SQLQuery45運行結果其結果,與沒有在PROJECT表中新增記錄前一樣。其原因是ASSIGNMENT表中不存在ProjectID 為1500的匹配值。即內(nèi)連接存在可能的數(shù)據(jù)丟失。 上面問題可以通過使用外連接(LEFT JOIN 或RIGHT JOIN)解決SELECT Name, EmployeeNumber, HoursWorkedFROM PROJECT LEFT JOIN ASSIGNMENTON PROJECT.ProjectID = ASSIGNMENT.ProjectID; Ch03-SQLQuery48運行結果一
57、、修改數(shù)據(jù)3.5 修改和刪除關系數(shù)據(jù)的SQL語句1. 語句基本格式UPDATE TableNameSET ColumnName = 列值WHERE SomeCondition;例 EMPLOYEE表當前數(shù)據(jù)如下將該表中雇員編號為11的電話號碼設置為“360-287-8810”。操作語句:UPDATE EMPLOYEE SET Phone =360-287-8810WHERE EmployeeNumber =11;然后,再執(zhí)行如下操作語句:SELECT * FROM EMPLOYEE;運行結果注意: 在使用UPDATE語句時,不能忘記使用WHERE條件,否則將更新表中該列所有值。注意: UPDA
58、TE語句可以同時更新多個列的數(shù)據(jù)。操作語句:例: 雇員表EMPLOYEE中5號員工從會計部門調(diào)入到財務部門,并且電話也變化為新部門電話。UPDATE EMPLOYEE SET Department=Finance,Phone=360-285-8420WHERE EmployeeNumber =5; 然后,再執(zhí)行如下操作語句:SELECT * FROM EMPLOYEE;運行結果二、刪除數(shù)據(jù)語句基本格式:DELETE FROM TableNameWHERE SomeCondition;例1:從PROJECT表中刪除“Marketing”部門的數(shù)據(jù)。DELETE FROM PROJECTWHERE
59、 Department=Marketing;注意: 1)在使用DELETE語句時,不但將PROJECT表中數(shù)據(jù)刪除,也會級聯(lián)刪除ASSIGNMENT表中的相關數(shù)據(jù)。2)若忘記使用WHERE條件,否則將刪除PROJECT表和ASSIGNMENT表中所有值。例2: 從DEPARTMENT表中刪除“Marketing”部門的數(shù)據(jù)。DELETE FROM DEPARTMENTWHERE DepartmentName=Marketing;注意:若該表與其它表存在參照完整性約束,則不能刪除。除非所依賴的子表已經(jīng)刪除了相關數(shù)據(jù)。一、DROP TABLE和ALTER TABLE語句3.6 修改和刪除表和約束的
60、SQL語句1.DROP TABLE語句語句基本格式: DROP TABLE TableName;注意: 語句將刪除該表的所有數(shù)據(jù)及其結構例: 如果希望刪除EMPLOYEE表及其數(shù)據(jù),可以使用如下語句。DROP TABLE EMPLOYEE;注意: 如果某表包含了參照完整性約束,直接執(zhí)行DROP TABLE 語句,將會報錯。說明:刪除EMPLOYEE表前,必須先刪除ASSIGNMENT表或至少刪除外鍵約束ASSIGN_EMP_FK,才能成功。2.ALTER TABLE語句語句基本格式: ALTER TABLE TableName Constraint;ALTER TABLE 語句可以用于添加、修
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 知乎熱議:人工智能前沿
- 行為經(jīng)濟學就業(yè)前景
- 萊州法警考試題及答案
- 劇院招聘考試題及答案
- 技術升級考試題及答案
- 護士休班考試題及答案
- 光纖接續(xù)考試題及答案
- 蛋糕裝飾師復試能力考核試卷含答案
- 制油工崗前設備巡檢考核試卷含答案
- 電焊工操作規(guī)程評優(yōu)考核試卷含答案
- 中國資產(chǎn)托管行業(yè)發(fā)展報告2025
- 聯(lián)合培養(yǎng)研究生協(xié)議
- 虛擬電廠課件
- 部隊核生化防護基礎課件
- 醫(yī)療器械胰島素泵市場可行性分析報告
- 2025年《處方管理辦法》培訓考核試題(附答案)
- 租金催繳管理辦法
- 種植業(yè)合作社賬務處理
- JJF 2266-2025血液融漿機校準規(guī)范
- 公司兩權分離管理制度
- 紫砂陶制品行業(yè)深度研究分析報告(2024-2030版)
評論
0/150
提交評論