版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章结构化查询语言了解结构化查询语言SQL操作原理
学习数据库SQL操作语句使用掌握数据库对象创建掌握数据库表访问操纵掌握多表关联数据查询掌握数据库对象修改与删除掌握数据库视图使用掌握SQL
Server数据库管理工具使用【学习目标】一、基本概念3.1SQL简介SQL(StructuredQueryLanguage,结构化查询语言)是一种对数据库进行访问的数据操作子语言。其SQL语句执行命令完成对数据库访问操作。二、SQL发展20世纪70年代由IBM公司开发
1979年ORACLE公司首先提供商用的SQL
1986ANSI的数据库委员会批准了SQL作为关系型数据库语言的美国标准。1987年国际标准化组织(ISO)将其采纳为国际标准SQL86。
1989年更新成为国际标准SQL-891992年更新成为国际标准SQL-92(或称SQL2)1999年更新成为国际标准SQL-99(或称SQL3)2008年更新成为国际标准SQL:2008三、SQL应用情况绝大多数主流的关系型数据库管理系统采用了SQL标准语言实现数据库操作OracleSybaseDB2MicrosoftSQLServerAccessMySql。。。其中一些厂商数据库管理系统对SQL语句进行了扩展开发,如Sybase、MicrosoftSQLServer将操作语言扩展为Transaction-SQL;Oracle将操作语言扩展为PL/SQL。四、SQL操作机理SQL主要操作功能:SQL从数据库存取数据
SQL从数据库删除数据SQL创建新数据库SQL在数据库中创建新表SQL在数据库中创建存储过程SQL在数据库中创建视图SQL可以设置数据库对象的访问权限数据库DBMS(执行SQL)数据库应用程序返回结果提交SQLI/O数据五、SQL语言语句类别1.数据操纵语言数据操纵语言(DataManipulationLanguage,DML)是SQL语言中用于增添、修改、删除数据的语句,主要语句如下:
INSERT-向数据库表中插入数据
UPDATE-更新数据库表中的数据DELETE-从数据库表中删除数据
2.数据定义语言数据定义语言(DataDefinitionLanguage,DDL)是SQL语言中用于创建或删除数据库对象的语句。这类语句也可以定义数据表对象的主外键、索引、约束等要素。主要语句如下:CREATEDATABASE-创建新数据库
DROPDATABASE–删除数据库ALTERDATABASE-修改数据库属性CREATETABLE-创建新表ALTERTABLE–修改数据库表结构DROPTABLE-删除表CREATEINDEX-创建索引DROPINDEX-删除索引3.数据查询语言数据查询语言(DataQueryLanguage,DQL)是SQL语言中用于对数据库进行查询的语句。该语句只有Select一个语句,但其变化范型较多。4.数据控制语言数据控制语言(DataControlLanguage,DCL)是SQL语言中用于对数据访问权进行控制的语句。主要语句如下:
GRANT–授予用户对数据对象的权限
DENY–拒绝授予用户对数据对象的权限
REVOKE–撤消用户对数据对象的权限5.事务处理语言事务处理语言(TransactionProcessLanguage,TPL)是SQL语言中用于数据库内部事务处理的语句。主要语句如下:BEGINTRANSACTION–开始事务
COMMIT–提交事务
ROLLBACK–回滚事务6.游标控制语言游标控制语言(CursorControlLanguage,CCL)是SQL语言中用于数据库游标操作的语句。主要语句如下:
DECLARECURSOR–定义游标
FETCHINTO–提交游标数据
CLOSECURSOR–关闭游标六、SQL语言的数据类型1.基本数据类型字符:CHAR、VARCHAR、TEXT整数:SMALLINT、INTEGER浮点数:NUMBER(n,d)、FLOAT(n,d)
日期:DATE、DATETIME
货币:MONEY2.不同数据库所支持数据类型Access的数据类型见表3-1所示SQLServer的数据类型见表3-2所示MySQL的数据类型见表3-3所示部门信息雇员信息项目信息任务信息工程项目管理数据库数据库系统任务:
创建项目数据库ProjectDB
创建数据库表对象及其约束
完成数据库表的数据插入、修改、删除以及查询处理某企业希望通过创建一个工程项目管理数据库,实现对项目信息管理。3.2数据定义语句DDL一、数据库案例列名类型键是否非空备注DepartmentNamechar(35)主键是部门名称DepartIntroVarchar(200)否是部门简介OfficeNumberchar(15)否是办公室编号OfficePhonechar(12)否是办公电话部门(DEPARTMENT)表结构1.数据库表结构设计列名类型键是否非空备注EmployeeNumberInt主键是代理键,雇员编号NameVarchar(30)否是姓名Departmentchar(35)外键是部门Phonechar(12)否是电话EmailVarchar(100)否是邮件雇员(EMPLOYEE)表结构列名类型键是否非空备注ProjectIDInt主键是项目编号NameVarchar(30)否是项目名称Departmentchar(35)外键是部门MaxHoursNumber否是最长工时StartDateDateTime否否开始日期EndDateDateTime否否结束日期项目(PROJECT)表结构列名类型键是否非空备注ProjectIDInt主键,外键是复合键,项目编号EmployeeNumberInt主键,外键是复合键,雇员编号HoursWorkedNumeric(6,2)否否工作时数任务(ASSIGNMENT)表结构列名类型键是否非空备注DepartmentNamechar(35)主键是部门名称DepartIntroVarchar(200)否是部门简介OfficeNumberchar(15)否是办公室编号OfficePhonechar(12)否是办公电话列名类型键是否非空备注EmployeeNumberInt主键是代理键,雇员编号NameVarchar(30)否是姓名Departmentchar(35)外键是部门Phonechar(12)否是电话EmailVarchar(100)否是邮件参照完整性约束DEPARTMENT表EMPLOYEE表2.数据库表关联设计列名类型键是否非空备注DepartmentNamechar(35)主键是部门名称DepartIntroVarchar(30)否是部门简介OfficeNumberchar(15)否是办公室编号OfficePhonechar(12)否是办公电话DEPARTMENT表结构列名类型键是否非空备注ProjectIDInt主键是项目编号NameVarchar(30)否是项目名称Departmentchar(35)外键是部门MaxHoursNumeric(6,2)否是最长工期StartDateDateTime否否开始日期EndDateDateTime否否结束日期PROJECT表结构参照完整性约束列名类型键是否非空备注ProjectIDInt主键是项目编号NameVarchar(30)否是项目名称Departmentchar(35)外键是部门MaxHoursNumber否是最长工期StartDateDateTime否否开始日期EndDateDateTime否否结束日期PROJECT表结构列名类型键是否非空备注ProjectIDInt主键,外键是复合键,项目编号EmployeeNumberInt主键,外键是复合键,雇员编号HoursWorkedNumeric(6,2)否否工作时数ASSIGNMENT表结构参照完整性约束3.业务规则设计如果要删除EMPLOYEE中的某个行,若该行连接有ASSIGNMENT的外键值,则禁止对EMPLOYEE行执行删除操作。在创建表时定义参照完整性约束。如果要删除PROJECT中的某个行,则ASSIGNMENT中连接到PROJECT的对应行数据也将随之被删除。在创建表时定义级联删除约束。如果某雇员离职,则企业将删除该雇员数据,但前提是必须先有人接替这个雇员工作,然后才允许删除该雇员数据。如果企业取消某个项目,将删除该项目数据。同时,也将删除该项目所下属的任务数据。数据库中如何设计?问题:上述项目数据库设计如何通过SQL实现?二、数据库创建语句1.语句基本格式例创建一个人力资源管理数据库HR,其SQL语句如下:CREATEDATABASEHR;CREATEDATABASE<数据库名>其中CREATEDATABASE为创建数据库语句的关键词,<数据库名>为被创建数据库的标识符名称。实践操作:
在SQLServer中,创建第一个数据库HR。2.语句完整格式CREATEDATABASE<数据库名>onprimary(--默认属于primary文件组name=‘databasename_data’,--主数据文件的逻辑名称filename=‘D:\databasename_data.mdf’,--主数据文件的物理名称size=数值MB,--主数据文件的初始大小maxsize=数值MB,--主数据文件增长的最大值filegrowth=数值%--主数据文件的增长率)logon(/*--日志文件的具体描述,各参数含义同上--*/name='databasename_log',--日志文件的逻辑名称filename='所存目录:\databasename_log.ldf',--日志文件的物理名称size=数值MB,--日志文件的初始大小filegrowth=数值MB--日志文件的增长值);CREATEDATABASEProjectDBonprimary(
--默认属于primary文件组name=‘Project_data’,--主数据文件的逻辑名称filename=‘d:\Project_data.mdf',--主数据文件的物理名称size=10MB,--主数据文件的初始大小maxsize=50MB,--主数据文件增长的最大值filegrowth=10%--主数据文件的增长率)logon(name=‘Project_log’,--日志文件的逻辑名称filename=‘d:\Project_log.ldf',--日志文件的物理名称size=10MB,--日志文件的初始大小filegrowth=1MB--日志文件的增长值);例创建一个项目信息管理数据库ProjectDB,其SQL语句如下:实践操作:
采用完整参数SQL语句,创建数据库ProjectDB。三、数据库删除语句1.语句基本格式例删除前面创建的人力资源管理数据库HR,其SQL语句如下:DROPDATABASEHR;DROP
DATABASE<数据库名>;其中DROP
DATABASE
为语句命令关键词,<数据库名>为数据库名称。实践操作:
删除数据库HR。实践练习:
在SQLServer数据库管理系统环境中,创建一个选课系统数据库Catalog,完成后再删除它。四、数据库表创建语句1.语句基本格式CREATE
TABLE<表名>
(<列名1><数据类型>[列完整性约束], <列名2><数据类型>[列完整性约束],
<列名3><数据类型>[列完整性约束],…);其中CREATE
TABLE
为创建表语句的关键词,<表名>为将被创建的数据库表名称。例
雇员数据库表EMPLOYEE创建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);例
雇员数据库表EMPLOYEE创建列名类型键是否非空备注EmployeeNumberInt主键是代理键NameVarChar(30)否是DepartmentChar(35)否是缺省值“人力资源”PhoneChar(12)否否EmailVarChar(100)否是要求取值唯一说明:在Sybase或SQLServer,用INDENTITY标识代理键在Oracle数据库中用SEQUENCE标识代理键在MySQL数据库中,用AUTO_INCREMENT标识代理键实践操作:
在SQLServer中执行SQL创建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);实践练习:
课程目录数据库表STUDENT创建。列名类型键是否非空备注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));使用表约束定义主键的优点:便于定义复合主键可命名主键约束便于定义代理键例
项目数据库表PROJECT创建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否否实践操作:
在SQLSERVER中使用SQL表约束语句创建主键。DEPARTMENT表结构列名类型键是否非空备注ProjectIDInt主键是项目编号NameVarChar(30)否是项目名称DepartmentChar(35)外键是部门MaxHoursNumeric(6,2)否是最长工期StartDateDateTime否否开始日期EndDateDateTime否否结束日期PROJECT表结构参照完整性约束列名类型键是否非空备注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);例创建PROJECT表中外键及其参照完整性约束实践操作:在SQL
Server中创建PROJECT表外键及其参照完整性约束。列名类型键是否非空备注ProjectIDInt主键是NameVarChar(30)否是DepartmentChar(35)外键是MaxHoursNumber否是StartDateDateTime否否EndDateDateTime否否PROJECT表结构列名类型键是否非空备注ProjectIDInt主键,外键是EmployeeNumberInt主键,外键是HoursWorkedNumeric(6,2)否否ASSIGNMENT表结构参照完整性约束实践练习:
创建ASSIGNMENT表中外键,及其参照PROJECT和EMPLOYEE表的完整性约束列名类型键是否必需备注ProjectIDInt主键,外键是EmployeeNumberInt主键,外键是HoursWorkedNumeric(6,2)否否ASSIGNMENT表结构参照完整性约束列名类型键是否必需备注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
语句可以用于添加、修改、删除表结构的列和约束。例删除ASSIGNMENT表中外键ASSIGN_EMP_FK,其SQL操作语句如下。ALTER
TABLEASSIGNMENTDROPCONSTRAINTASSIGN_EMP_FK;五、修改表结构SQL语句2、删除表中外键1、语句基本格式在ALTTABLE语句中,可以添加CHECK关键字实现数据范围约束添加。例
在定义PROJECT表时,规定StartDate必须早于EndDate,则可通过如下语句实现。ALTER
TABLEPROJECTADD
CONSTRAINTPROJECT_Check_DatesCHECK(StartDate<EndDate);3、在表中添加约束使用ALTTABLE语句,还可以在现有表结构中添加新的属性列。例
在PROJECT表中添加一列CurrentTotalHours,以跟踪在某项目上工作的实际小时数,则可通过如下语句实现。ALTER
TABLEPROJECTADDCurrentTotalHoursNumeric(8,2)NULL;4、在表中添加列实践操作:
在PROJECT表中添加新列例
在PROJECT表中删除CurrentTotalHours列,则可通过如下语句实现。ALTER
TABLEPROJECTDROP
COLUMNCurrentTotalHours;5、在表中删除列六、删除表结构SQL语句基本语句格式:DROPTABLETableName;注意:
该语句将删除该表的所有数据及其结构例删除EMPLOYEE表及其数据,可以使用如下语句。DROPTABLEEMPLOYEE;注意:
如果某表包含了参照完整性约束,直接执行DROPTABLE语句,将会报错。说明:删除EMPLOYEE表前,必须先删除ASSIGNMENT表或至少删除外键约束ASSIGN_EMP_FK,才能成功。七、索引对象定义索引——在数据库中,索引是针对某个表中一列或多列建立的指向表中记录数据页的逻辑指针清单,其作用类似图书目录可支持对数据表的快速信息检索。其中CREATE
INDEX
为创建索引语句的关键词。<索引名>为在指定表中针对某列创建索引的名称。该语句执行后,在表中为指定列创建其列值的索引,使该列可实现快速查询。1、索引创建SQL语句基本语句格式:CREATE
INDEX<索引名>ON<表名><(列名)>;例
在学生信息表STUDENT中,为出生日期Birthday列创建索引,以便可支持按出生日期快速查询学生信息,其索引创建SQL语句如下。CREATE
INDEXBirthday_IdxONSTUDENT(Birthday);索引优点:提高数据检索速度可快速连接关联表减少分组和排序时间索引开销:创建和维护索引都需要较大开销索引会占用额外存储空间数据操纵因维护索引带来开销2、索引修改SQL语句其中ALTER
INDEX
为索引对象修改语句的关键词。<索引名>为在指定表中针对某列创建索引的名称。RENAME
TO为索引换名关键词。当该语句执行后,原有索引被换名为新名称。使用SQL语句可以对索引进行修改操作,其语句格式分别如下:ALTER
INDEX<索引名>ON<表名>RENAME
TO<新索引名>;例
在学生信息表STUDENT中,将原索引Birthday_Idx更名Bday_Idx,其索引修改SQL语句如下:ALTER
INDEXBirthday_IdxONSTUDENTRENAME
TOBday_Idx;ALTER
INDEX<索引名>ON<表名>[CLUSTERED|NONCLUSTERED];此外,索引对象修改SQL语句还可以更改索引的聚簇性质,例如修改为聚集索引或非聚集索引,其SQL语句格式如下:聚集索引与非聚集索引区别:在聚集索引中,键值的逻辑顺序决定了表中相应行的物理顺序。在非聚集索引中,键值的逻辑顺序可以与表中相应行的物理顺序不同。3、索引删除SQL语句使用SQL语句可以对索引进行删除操作,其语句格式分别如下:DROP
INDEX<索引名>;其中DROP
INDEX
为删除索引语句的关键词。<索引名>为被指定的索引名称。该语句执行后,将从表中删除该索引。例
在学生信息表STUDENT中,删除Birthday_Idx索引,其索引删除SQL语句如下:DROP
INDEXBirthday_Idx;学院信息、课程信息教师信息、学生信息开课信息、选课信息课程目录数据库数据库系统任务:
创建项目数据库Catalog
创建数据库表对象及其约束
完成数据库表的数据插入、修改、删除以及查询处理某高校希望通过创建一个课程目录数据库,实现学生选课管理。一、数据库案例3.3数据操纵SQL语句学院信息表:COLLEGE(CollegeID,CollegeName,CollegeIntro,CollegeTel)课程表:COURSE(CourseID,CourseName,CourseType,CourseCredit,CoursePeriod,TestMethod)教师表:TEACHER(TeacherID,TeacherName,TeacherGender,TeacherTitle,CollegeID,TeacherPhone)学生表:STUDENT(StudentID,StudentName,StudentGender,BirthDay,Major,StudentPhone)开课计划表:PLAN(CoursePlanID,CourseID,TeacherID,CourseRoom,CourseTime,Note)选课注册表:REGISTER(CourseRegID,CoursePlanID,StudentID,Note)二、单条数据插入例在学生信息表STUDENT中,原有数据见下图所示INSERT
INTO<基本表>[<列名表>]VALUES
(列值表);其中INSERT
INTO
为插入语句的关键词。<基本表>为被插入数据的数据库表。<列名表>给出在表中插入哪些列。数据操纵SQL语句是一类对数据库表中数据进行变动操作的语句集。它以INSERT、UPDATE、DELETE三种语句为核心,分别完成数据的插入、更新与删除处理。该语句执行后,学生信息表STUDENT的数据见下图所示。注意:在INSERT
INTO插入数据语句中,所使用的Interger和Numeric等类型数值不使用引号标注,但Char、Varchar、Date和Datetime等值类型必须使用单引号。执行如下插入数据SQL语句:INSERT
INTOSTUDENTVALUES('201222010002','刘菲','女','1995-04-23','软件工程','lufei@163.com');三、多条数据插入在数据库表插入操作中,还可以一次执行一组SQL数据插入语句,实现在表中多行数据插入。例
在学生信息表STUDENT中,一次插入多个学生数据,其插入数据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);实践操作:在SQLSERVER中执行上述插入语句。这些语句执行后,学生信息表STUDENT的数据见下图所示。注意:在INSERT
INTO插入数据语句中,若某些列的值不确定,可以在该列位置使用空值(NULL),但主键、非空列不允许使用NULL。此外,若表中主键为代理键,它不需要出现,因该值由DBMS自动提供实践练习:
在EMPLOYEE表中插入多个员工信息数据列名类型键是否非空备注EmployeeNumberInt主键是代理键NameVarChar(30)否是DepartmentChar(35)否是缺省值“人力资源”PhoneChar(12)否否EmailVarChar(100)否是要求取值唯一四、数据更新SQL语句数据更新SQL语句可以对数据表中指定数据进行修改处理,其语句基本格式如下:UPDATE<基本表>SET<列名1>=<表达式1>[,<列名2>=<表达式2>...][WHERE<条件表达式>];其中UPDATE
为数据更新语句的关键词。<基本表>为被更新数据的数据库表。SET
关键词指定对哪些列设定新值。WHERE
关键词给出需要满足的条件表达式。例
在学生信息表STUDENT中,学生“杨宾”的原有Email数据为空,现需要修改为“yangbin@163.com”。其数据修改的SQL语句如下:UPDATESTUDENTSETEmail=’yangbin@163.com’WHEREStudentName=’杨宾’;实践操作:在SQLSERVER中执行上述更新SQL语句。这个语句执行后,学生信息表STUDENT的数据下图所示。实践练习:
在下面的STUDENT表中,使用SQL语句将“刘亚”的出生日期和Email分别修改为“1995-05-15”、liuy@163.com。五、数据删除SQL语句数据删除语句DELETE将从指定数据库表中删除满足条件的数据行,其语句基本格式如下:DELETE
FROM<表名>[WHERE<条件表达式>];其中DELETE
FROM为数据删除语句的关键词。<表名>为被删除数据的数据库表。WHERE
关键词给出需要满足的条件表达式。例在学生信息表STUDENT中,删除姓名为“张亮”的学生数据,其数据删除的SQL语句如下:DELETE
FROMSTUDENTWHEREStudentName=’张亮’;实践练习:
在下面的STUDENT表中,删除“张亮”信息。3.4SQL关系查询语句一、
语句基本格式在SQL语言中,数据查询语言(DQL)是负责对数据表进行查询访问的语句,这是对数据库访问使用最多的一类SQL语句SELECT[ALL|DISTINCT]<目标列>[,<目标列>…][INTO<新表>]FROM<表名>[,<表名>…][WHERE<条件表达式>][GROUPBY<列名>[HAVING<条件表达式>][ORDERBY<列名>[ASC|DESC]];二、从单个表读取指定列例学生信息表STUDENT原始数据如下图所示。在数据库中,最简单的数据查询操作就是从单个数据表中读取指定列的数据,其基本语句格式为:SELECT<目标列>[,<目标列>…]FROM<表名>;若要从STUDENT表中读取学生的学号、姓名、专业等列数据,其数据查询SQL语句如下:SELECTStudentID,StudentName,MajorFROMSTUDENT;如果希望从STUDENT表查询所有列数据,其数据查询SQL语句如下:SELECT*FROMSTUDENT;若希望从STUDENT表中查询专业列(Major)数据,其数据查询SQL语句执行结果如下:为了使读取的数据过滤重复行,可以在查询语句中加入DISTINCT关键字,其执行结果如下。三、从单个表读取指定行SQL查询语句也可以从一个数据表中读取满足条件的指定行数据,即完成关系数据的元组选择操作,其基本语句格式如下。SELECT*FROM<表名>WHERE<条件表达式>;例
从STUDENT表中查询性别为“男”的学生数据,其数据查询SQL语句如下。SELECT*FROMSTUDENTWHEREStudentGender=’男’;实践操作:执行上述SQLSELECT语句。四、从单个表读取指定行和列例
从STUDENT表中查询性别为“男”的学生学号、学生姓名、性别、专业数据,其数据查询SQL语句如下。SELECTStudentID,StudentName,StudentGender,MajorFROMSTUDENTWHEREStudentGender=’男’;在SQL查询语句中,还可以从一个数据表中读取指定行与指定列范围内的数据,即同时完成关系数据的行列投影操作,其基本语句格式为:SELECT<目标列>[,<目标列>…]FROM<表名>WHERE<条件表达式>;实践操作:执行上述SQLSELECT语句。在WHERE子句中可以使用如下方式,指定范围数据。1)使用BETWEEN..AND关键词来限定列值范围,还可以使用关键词LIKE与通配符来限定查询条件。2)SQL查询语言的常用通配符有下划线(_)和百分号(%)。下划线(_)通配符用于代表一个未指定的字符。百分号(%)通配符用于代表一个或多个未指定的字符。五、Where条件子句例
若要从STUDENT表中查询出生日期在“1995-04-01”到“1996-04-01”的学生数据。其查询SQL语句如下:SELECT*FROMSTUDENTWHEREBirthDayBETWEEN‘1995-04-01’AND‘1996-04-01’;该语句执行后,其查询操作结果见下图所示。例
若要从STUDENT表中查询邮箱域名为“@163.com”的学生数据。其数据查询SQL语句如下:SELECT*FROMSTUDENTWHEREEmailLIKE’%@163.com’;该语句执行后,其查询操作结果见下图所示。实践练习:
从学生数据表STUDENT中查询“刘”姓的学生信息。说明:在SQL查询Where子句中,还可以使用多个条件表达式,并通过逻辑运算符(AND、OR、NOT)连接操作,进一步限定结果集的数据范围。以及使用IN或NOT
IN关键词限定列值范围。例
从STUDENT表中查询性别为“男”,并且专业为“软件工程”的学生数据,其数据查询SQL语句如下。SELECTStudentID,StudentName,StudentGender,MajorFROMSTUDENTWHEREMajor=’软件工程’ANDStudentGender=’男’;实践操作:执行上述SQLSELECT语句。IN关键字使用:
从STUDENT表中查询,使用IN关键字读取”计算机应用”专业的学生。其SQL语句如下所示。SELECTStudentID,StudentName,StudentGender,MajorFROMSTUDENTWHEREMajorIN('计算机应用');实践操作:执行上述SQLSELECT语句。六、对结果进行排序在SELECT查询语句返回的结果中,行的顺序是任意的。如果需要结果集排序,可以在SELECT语句中加入ORDERBY关键字。例
若要从STUDENT表中按学生出生日期降序输出学生数据,其数据查询SQL语句如下。SELECT*FROMSTUDENTORDERBYBirthday
DESC;在默认情况下,SQL查询的结果集是按指定列值的升序排列。可以使用关键词ASC和DESC选定排序是升序或降序。实践操作:执行上述SQLSELECT语句。如果需要结果集按多个列排序,可以分别加入关键字ASC或DESC改变。例
若要将STUDENT表查询数据,首先按出生日期降序排列,然后按姓名升序排列,其数据查询SQL语句如下:SELECT*FROMSTUDENTORDER
BYBirthdayDESC,StudentNameASC;实践练习:
从学生数据表STUDENT中查询信息,分别按姓名、出生日期升序排列输出。七、SQL内置函数和计算在SQL语言中,可以使用函数方式对SELECT查询结果集数据进行处理。这些函数可以是DBMS系统所提供的内置函数,也是用户根据需要自定义函数。典型DBMS系统提供的内置函数主要有以下几类:聚合函数算术函数字符串函数日期时间函数数据类型转换函数例
若要统计STUDENT表中的学生人数,在SELECT语句中可以使用COUNT()函数来计算,其查询SQL语句如下:SELECT
COUNT(*)AS学生人数FROMSTUDENT;例
若要找出STUDENT表中年龄最大和年龄最小的学生出生日期,其查询SQL语句如下:SELECT
Min(Birthday)
AS
最大年龄,Max(Birthday)
AS
最小年龄FROMSTUDENT;例
若要计算出STUDENT表中各个学生的Email字符串长度,其查询SQL语句如下:SELECTStudentID,StudentName,Email,LEN(Email)AS
邮箱长度FROMSTUDENT;八、SQL内置函数和分组在SQL语言中,可在查询结果集进行分组数据统计。这是通过在SELECT语句中加入GroupBy子语句来实现。例
若要分专业统计STUDENT表中的学生人数。在SELECT语句中可以使用GROUPBY分组子句完成统计,其查询SQL语句如下:SELECTMajorAS
专业,COUNT(StudentID)
AS
学生人数FROMSTUDENTGROUP
BYMajor;实践操作:执行上述SQLSELECT语句。在分组统计SQL查询语句中,还可以使用HAVING子句限定分组统计的条件。例
若要分专业统计STUDENT表中男生人数,但限定只显示人数大于2的人数,其查询SQL语句如下:SELECTMajorAS
专业,COUNT(StudentID)
AS
学生人数FROMSTUDENTWHEREStudentGender=’男’GROUPBYMajorHAVINGCOUNT(*)>2;实践操作:执行上述SQLSELECT语句。Groupby与having理解groupby有一个原则,就是select后面的所有列中,没有使用聚合函数的列,必须出现在groupby后面或者包含在having后的聚合函数里。where子句的作用是在对查询结果进行分组前将不符合where条件的行去掉,即在分组之前过滤数据条件中不能包含聚合函数。having子句的作用是筛选满足条件的组即在分组之后过滤数据条件中经常包含聚合函数。GROUPBY是分组查询,一般GROUPBY是和聚合函数配合使用注意:除了使用GROUPBY语句外,列的名称是不允许和内置函数一起混合使用。以下语句不规范。SELECT
MaxHours,
SUM(MaxHours)FROM
PROJECTWHERE
ProjectID
<=1200;DBMS产品在使用内置函数的方式也不一样。一般来说,内置函数是不能用于WHERE子句中的。以下语句不规范:SELECT
ProjectID,
MaxHoursFROM
PROJECTWHERE
MaxHours
<
AVG(MaxHours);Groupby与having理解having子句限制的是组,而不是行。通常情况下,HAVING从句被放置在SQL命令的结尾处。当同时含有where子句、groupby子句、having子句及聚集函数时,执行顺序如下:执行where子句查找符合条件的数据;使用groupby子句对数据进行分组;对groupby子句形成的组运行聚集函数计算每一组的值;最后用having子句去掉不符合条件的组。having子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.九、使用子查询处理多个表在实际应用中,通常需要关联多表才能获得所需的信息。在SELECT查询语句中,可使用子查询方式实现多表关联查询。例
在课程目录数据库中,希望能检索出“计算机学院”的教师名单。该操作需要关联教师信息表TEACHER和学院信息表COLLEGE,才能获得这些数据。这里可采用子查询方法实现两表关联查询,其查询SQL语句如下:SELECTTeacherID,TeacherName,TeacherTitleFROMTEACHERWHERECollegeIDIN
(SELECTCollegeID
FROMCOLLEGE
WHERECollegeName=’计算机学院’);实践操作:执行上述SQLSELECT语句。例:
查询Accounting部门的单个项目中,工作时间超过40小时的雇员姓名。操作语句:SELECTFirstName,LastNameFROMEMPLOYEEWHEREEmployeeNumberIN(SELECTDISTINCTEmployeeNumberFROMASSIGNMENTWHEREHoursWorked>40ANDProjectIDIN(SELECTProjectID FROMPROJECT WHEREDepartment=‘Accounting’));说明:
子查询通过嵌套可以扩展到3层以上。运行结果使用子查询查找MaxHours小于平均值的项目SELECT
ProjectID,
MaxHoursFROM
PROJECTWHERE
MaxHours
<
(SELECT
AVG(MaxHours)
FROM
PROJECT);SELECT
ProjectID,
MaxHoursFROM
PROJECTWHERE
MaxHours
<
AVG(MaxHours);十、使用连接查询多个表在处理多个表时,子查询只有在结果来自一个表的情况下才有用。但如果需要显示两个或多个表中的数据,就不能使用子查询,而需要采用连接操作。例
在课程目录系统数据库中,希望获得各个学院的教师信息。这需要关联教师信息表TEACHER和学院信息表COLLEGE,查询学院名称、教师编号、教师姓名、教师性别、职称等信息,按学院名称、教师编号分别排序输出,其查询SQL语句如下:SELECTB.CollegeNameAS
学院名称,A.TeacherIDAS
编号,A.TeacherNameAS
姓名,A.TeacherGenderAS
性别,A.TeacherTitleAS
职称FROMTEACHERASA,COLLEGEASBWHEREA.CollegeID=B.CollegeIDORDER
BYB.CollegeName,A.TeacherID;实践操作:执行上述SQLSELECT语句。例:关联查询EMPLOYEE表、PROJECT表和ASSIGNMENT表,得到雇员任务工时列表及其所在项目名称。操作语句:SELECTName,FirstName,LastName,HoursWorkedFROMEMPLOYEEASE,PROJECTASP,ASSIGNMENTASAWHEREE.EmployeeNumber=A.EmployeeNumberANDP.ProjectID=A.ProjectIDORDERBYP.ProjectID,A.EmployeeNumber;说明:
前面给出的案例是两表连接实现查询,同样也可以多表关联实现查询。十一、SQLJOIN…ON语法在SQL语言中,实现多表关联查询还可以使用JOIN…ON关键词的语句格式。其中两表关联查询的JOIN…ON连接语句格式如下:SELECT<目标列>[,<目标列>…]FROM<表名1>JOIN<表名2>ON<连接条件>;例
在课程目录系统数据库中,希望获得各个学院的教师信息。这需要关联教师信息表TEACHER和学院信息表COLLEGE,查询学院名称、教师编号、教师姓名、教师性别、职称等信息,按学院名称、教师编号分别排序输出,其查询SQL语句如下:SELECTB.CollegeNameAS
学院名称,A.TeacherIDAS
编号,A.TeacherNameAS
姓名,A.TeacherGenderAS
性别,A.TeacherTitleAS
职称FROMTEACHERASAJOINCOLLEGEASBONA.CollegeID=B.CollegeIDORDER
BYB.CollegeName,A.TeacherID;实践操作:执行上述SQLSELECT语句。十二、外部连接前节介绍的连接方式在SELECT查询语句称为内部连接。在一些特殊情况下,如关联表中一些行不匹配,部分数据就会丢失。例
在课程目录数据库中,希望能查询所有开设课程的学生选课情况,包括开设课程名称、选课学生人数。这需要关联课程信息表COURSE、开课计划表PLAN、选课注册信息表REGISTER。若使用内连接查询,该JOIN…ON连接查询的SQL语句如下:SELECTC.CourseNameAS
课程名称,T.TeacherNameAS
教师,
COUNT
(R.CoursePlanID)AS
选课人数FROMCOURSEASCJOINPLANASPONC.CourseID=P.CourseIDJOINTEACHERASTONP.TeacherID=T.TeacherIDJOINREGISTERASRONP.CoursePlanID=R.CoursePlanIDGROUP
BYC.CourseName,T.TeacherName;实践操作:执行上述SQLSELECT语句。问题:在上面的内连接查询中,只能找出有学生注册的课程名称和选课人数,但不能找出没有学生注册的课程名称和选课人数。在SQL应用中,有时候也希望输出那些不满足连接条件的元组数据。这时,可使用JOIN…ON外连接方式实现。其实现方式有三种形式,具体如下:LEFTJOIN:左外连接,即使右表中没有匹配,也从左表返回所有的行。RIGHTJOIN:右外连接,即使左表中没有匹配,也从右表返回所有的行。FULLJOIN:全外连接,只要其中一个表中存在匹配,就返回行。例
在课程目录系统数据库中,希望能查询所有开设课程的学生选课情况,包括开设课程名称、选课学生人数。这需要关联课程信息表COURSE、开课计划表CPLAN、选课注册信息表REGISTER。若使用左外连接查询,该JOIN…ON连接查询的SQL语句如下:SELECTC.CourseNameAS
课程名称,T.TeacherNameAS
教师,COUNT
(R.CoursePlanID)AS
选课人数FROMCOURSEASCJOINCPLANASPONC.CourseID=P.CourseIDJOINTEACHERASTONP.TeacherID=T.TeacherIDLEFT
JOINREGISTERASRONP.CoursePlanID=R.CoursePlanIDGROUP
BYC.CourseName,T.TeacherName;实践操作:执行上述SQLSELECT语句。一、什么是视图3.5SQL视图视图——
是一种通过其它表或视图构建的虚拟表。它本身没有自己的数据,而是使用了存储在表或其它视图中的数据。二、视图创建基本语句格式:CREATE
VIEW<视图名>[(列名1),(列名2),…]AS<SELECT查询>;例
在课程目录数据库中,若需要建立一个由学科基础课程数据构成的视图BasicCourseView,其创建SQL语句如下。CREATE
VIEWBasicCourseViewASSELECTCourseName,CourseCredit,CoursePeriod,TestMethodFROM
COURSE;当这个语句执行后,在数据库中创建了一个名称为BasicCourseView的数据库视图对象。实践操作:执行上述SQLSELECT语句。当视图在数据库中创建后,用户可以像访问数据表一样去操作访问视图。例如,使用SELECT语句查询该视图数据,并按课程名称排序输出,其SQL语句如下:SELECT*FROMBasicCourseViewORDER
BYCourseName;实践操作:执行上述SQLSELECT语句。三、视图删除当数据库不再需要某视图时,可以在数据库中删除该视图,其视图的删除语句格式如下:DROP
VIEW<视图名>;其中DROP
VIEW
为删除视图语句的关键词。<视图名>为将被删除的视图名称。例
在数据库中,若需要删除名称为BasicCourseView的视图对象,其删除该视图的SQL语句如下:DROP
VIEWBasicCourseView;四、SQL视图使用1.使用视图简化复杂SQL查询操作通过视图,数据库开发人员可以将复杂的查询语句封装在视图内,使外部程序只需要使用简单方式访问该视图,便可获取所需要的数据。例
在课程目录数据库中,希望能查询选修“数据库原理及应用”课程的学生名单。这需要关联课程信息表COURSE、开课计划表CPLAN、选课注册信息表REGISTER、学生信息表STUDENT,其查询SQL语句如下:SELECTC.CourseNameAS
课程名称,S.StudentIDAS
学号,S.StudentNameAS
姓名FROMCOURSEASC,CPLANASP,REGISTERASR,STUDENTASSWHEREC.CourseID=P.CourseIDANDC.CourseName=’数据库原理及应用’ANDP.CoursePlanID=R.CoursePlanIDANDR.StudentID=S.StudentID;这个SQL语句是较复杂和冗长,为了让外部程序简单地实现该信息查询,可以先定义一个名称为DatabaseCourseView视图,其视图创建SQL语句如下:CREATE
VIEWDatabaseCourseViewAS
SELECTC.CourseNameAS
课程名称,S.StudentIDAS
学号,S.StudentNameAS
姓名FROMCOURSEASC,CPLANASP,REGISTERASR,STUDENTASSWHEREC.CourseID=P.CourseIDANDC.CourseName=’数据库原理及应用’ANDP.CoursePlanID=R.CoursePlanIDANDR.StudentID=S.StudentID;当DatabaseCourseView视图被创建完成后,外部程序就可以通过一个简单的SELECT语句查询视图数据,其操作语句如下:SELECT*FROMDatabaseCourseView;实践操作:执行上述SQLSELECT语句。2.使用视图提高数据访问安全性通过视图可以将基本数据表部分敏感数据隐藏起来,外部用户无法得知数据表的完整数据,降低数据库被攻击的风险。此外,还可以保护部分隐私数据。例
在课程目录系统数据库中,除管理部门用户外,其他用户只能浏览教师基本信息,如教师编号、教师姓名、性别、职称、所属学院,教师其他信息被隐藏,可定义视图来处理信息,其视图创建SQL语句如下:CREATE
VIEWBasicTeacherInfoViewAS
SELECTT.TeacherIDAS
编号,T.TeacherNameAS
教师姓名,T.TeacherGender
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全身多处骨折护理
- 公司级安全培训课件
- 前台员工服务意识培训
- 《责任心培训教材》课件
- 2024服装合同书范文
- 2024中外专利技术许可合同合同范本
- 2024商铺租赁合同(范本)
- 2024年邻硝基苯酚项目评估分析报告
- 2024至2030年中国重型九脚塑料托盘行业投资前景及策略咨询研究报告
- 2024至2030年中国高光透明面漆行业投资前景及策略咨询研究报告
- XXXX年度煤矿机电设备检修计划
- 公路水运实验检测专业能力评价考试题库及答案
- 火力发电厂机组修前技术分析报告
- 南京林业大学考研811植物生理学历年真题及答案
- Excel水力计算展示-消力坎式消力池水力计算演示
- Ansys作业-瞬态热分析报告
- GB/T 42260-2022磷酸铁锂电化学性能测试循环寿命测试方法
- 门诊突发事件处理预案与流程
- VMI库存管理的课件资料
- 2023年X省中小河流治理工程《堤防工程监理工作报告》范本
- 二次函数与一元二次方程、不等式大单元教学设计方案
评论
0/150
提交评论