数据库SQL语句解析

SQL语言

在DBMS中以交互式执行SQL命令
针对数据的操作,核心功能只用9个动词完成.
一.SQL语言概述
SQL语言-三级模式支持
1.外模式
基本表:本身独立存在的表,一个关系对应一个表.
一个(或多个)基本表对应一个存储文件
视图:从一个或多个基本表或视图导出的表.
是虚表,只存放视图的定义而不存放对应数据.
2.模式(Scheme)
定义:
模式是数据库中全体数据的逻辑结构和特征的描述
1>所有用户的公共数据视图
2>是型的描述,不涉及具体值
3>反映的是数据的结构及联系
4>模式是相对稳定的
5>一个数据库只有一个模式

学生选课数据库模式一
选课(学号,姓名,性别,专业,班级,课程号,
课程名,学分,学时,成绩,学期)

学生选课数据库模式二
学生(学号,姓名,性别,专业,班级)
课程(课程号,课程名,学分,学时)
选课(学号,课程名,成绩,学期)
3.三级模式支持
数据库SQL语句解析_第1张图片
小结:
SQL作为大多数数据库使用的共同数据存取语言和标准接口,使不同数据库系统之间操作有了共同基础
SQL成为数据库领域中的主流语言
SQL通过视图,基本表,存储文件实现三级模式结构

二.创建与管理数据库与表-
SQL表示法:
创建数据库
create database database_name On
([name],[filename],[size][maxsize,[filegrowth])
log on([name],[filename],[size] [maxsize],[filegrowth])
创建基本表
1>.
CREATE TABLE <表名> (<列名><数据类型> [<列级完整性约束条件>]…
[,<表级完整性约束条件>]);
2>.
创建基本表的约束
列级约束
CREATE TABLE 图书
(图书varchar(15) primary key,
图书名称 varchar(30),
主编 varchar(30),
出版社 varchar(15),
单价 float);
表级约束
CREATE TABLE 借阅
(读者编号 char(6),
图书号 varchar(15),
借阅日期 date,
还书日期 date,
constraint PK**_JY primary key(读者编号,图书号))**;

表级约束实例

CREATE TABLE 借阅
(读者编号 char(6),
图书号 varchar(15),
借阅日期 date,
还书日期 date,
primary key(读者编号,图书号),
/主码由两个属性构成,必须作为表级完整性进行定义/
constraint PK_JY2 foreign key(读者编号) references 读者(读者编号),
/表级完整性约束条件,读者编号为外键,被参照表是读者/
constraint PK_JY3 foreign key(图书号) references 图书(图书号)
/表级完整性约束条件,图书号为外键,被参照表是图书/);

3.修改基本表
定义:随着应用环境和应用需求的变化,有时需要修改已建立好的基本表;
ALTER TABLE <表名>
ADD <列名> <数据类型> [<列级完整性约束>] |
DROP [CONSTRAINT] <完整性约束名> |
DROP COLUMN <列名> <数据类型>
ALTER COLUMN <列名> <数据类型>
4.删除基本表
删除表:
当某个表,我们不再需要的时候.可以使用DROP语句删除它:
其一般格式为:
DROP TABLE <表名>
例: 删除图书表.
DROP TABLE 图书;
基本表定义一旦被删除,表中的数据,此表上建立的索引和视图都将自动被删除掉.
因此,执行删除基本表的操作一定要格外小心.

小结:
*创建与管理数据库的方法和实现语句.
*创建管理基本表的方法和实现语句.
*基本表中的约束的定义与实现.
*基本表中的数据类型.

三.创建与管理索引
1.问题的引出一如何更快的查询表?
2.索引的定义
索引是SQL在基本上列上建立的一种数据库对象,也可称其为索引文件,它和建立于其上的基本不是分开存储的.建立索引的主要目的是提高数据检索性能.索引可以被创建或删除,这对数据毫无影响.但是,一旦索引被删除,数据查询的速度可能会变慢.
3.索引的分类
*聚集索引:
聚集索引将聚簇内数据行按照键值在表内进行排序,存储对应的数据记录.
这样表的物理存储顺序与索引的顺序一致.
*非聚集索引:
索引中每个索引项并不包含行记录的数据本身,而是包含索引值及一个指向数据本身存储位置的一个指针.索引带有的指针项指向数据的存储位置.索引中的项目按索引值的顺序存储.要查找的数据,则按照另外一种方式存储.
4.索引的创建
索引创建
SQL中使用CREATE INDEX语句创建索引,其一般格式为:
CREATE [UNIQUE] [CLUSTERD] INDEX <索引名> ON <表名>
(<列名>[<次序>],[<列名>[<次序>]]…);

说明:
(1)其中<表名>是要创建索引的基本表的名字.索引可以建立在该表的一列或多列上.
(2)每个<列名>后面还可以用<次序>指定索引索引值的排列次序,次序可选ASC(升序)或 DESC(降序),默认值为ASC.
(3)UNIQUE表示索引的每一个索引值只对应唯一的数据记录.
(4)CLUSTERED表示索引是聚簇索引.
(5)SQL中的索引是非显示索引.
5.索引使用的注意事项.
*索引并非越多越好.
*避免对经常更新的表进行过多的索引,并且索引中涉及到的列应尽可能的少.
*数据量比较小的表最好不要使用索引.
*在条件表达式中经常用到的,不同值较多的列上可以建立索引.而在不同值比较少的列上不要建立索引.
*当唯一性是某种数据本身的特征时,指定唯一索引.
*在频繁进行排序和分组的列上建立聚簇索引.更可以省去对结果集的排序操作.

小结
*索引的概念与作用.
*创建索引的基本语句.
*索引使用的注意事项.

四.表单查询
1.问题的引出-什么是查询操作
2.查询语句基本格式
SELECT [ ALL | DISTINCT ] <目标列表达式> [, <目标列表达式> ] …
FROM <表名或视图> [, [ <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC | DESC ] ];
3.单表查询
单表查询
就是指仅涉及到一个表的查询.在单表查询中,我们根据查询的方式不同,可以分为五类单表查询
单表查询分类:
1.选择表中的若干列.
2.选择表中的若干元组.
3.ORDER BY子句排序.
4.聚集函数.
5.GROUP BY 子句,又叫分组查询.

4.选择若干列
三个小类:
*查询指定的列.
*查询全部的列.
*查询表达式

查询全部的列表达式:
也就是说SELECT子句中的目标列表表
达式不仅仅可以是属性列。也可以是
属性列值所参与的表达式,也就是说
是经过计算过后的值。:
查询所有图书的图书名称及其单价和
100的差值。
SELECT 图书名称,单价
-100
FROM 图书;
如果需要将某个表中的列都查询出
来,一种方法列出全部的列名,另
外一种方法就是使用通配符
*

SELECT *
FROM 图书;
等价于:
SELECT 图书号,图书名称,主编,
出版社,单价
FROM 图书;

5.选择表中的若干元组
基本表:
*消除取值重复的行.
*查询满足条件的元组.
消除重复的行:
两个本来并不完全相同的元
组,投影到指定的某些列上
后,可能变成相同的行了,
可以用DISTINCT取消它们:
SELECT DISTINCT 读者编号
FROM 借阅;

选择表中的若干元组实例
实例1
满足指定条件的元组可以通过使用WHERE子句来实现.
查询清华大学出版社所有图书的图书名称.
SELECT 图书名称
FROM 图书
WHERE 出版社= ‘清华大学出版社’;

实例2:
确定我们要查找的属性值在(或者不在)某一个指定的范围内,就可以在WHERE子句中使用
(NOT)BETWEEN…AND谓词;
查询单价在30-50之间的图书.
SELECT *
FROM 图书
WHERE 单价 BETWEEN 30 AND 50;

选择表中的若干元组实例(续)
实例3:
WHERE子句和IN(或者NOT IN)谓词配合还可以实现查找属性值是不是属于指定集合的元组;
用IN运算符完成集合查询的功能.
SELECT 图书号,图书名称
FROM 图书
WHERE 出版社 IN( ‘清华大学出版社’, ‘高等教育出版社’ );

LIKE谓词:
WHERE 子句使用LIKE (NOT LIKE) 谓词,可以用来进行字符串的匹配查找.
匹配串可以是一个完整的字符串,也可以含有通配符%和_(下划线).
字符串本身就含有通配符%号或者_,这个时候我们要使用ESCAPE ‘<换码字符>’ 对通配符进行转义.

6.LIKE谓词实例
实例4
查询主编为莫言的图书的详细情况.
SELECT *
FROM 图书
WHERE 主编 LIKE ‘莫言’;
等价于:
SELECT *
FROM 图书
WHERE 主编= ‘莫言’;
实例5:
查询所有姓莫的主编的图书名称,主编和出版社.
SELECT 图书名称,主编,出版社
FROM 图书
WHERE 主编 LIKE ‘莫%’ ;
查询所有姓莫且名字只有一个字的主编的图书名称,主编.
SELECT 图书名称,主编
FROM 图书
WHERE 主编 LIKE ‘莫_ _’ ;
实例6:
对通配符进行转义:
查询图书名称为 “数据库_第2版” 的图书号,图书名称和主编.
SELECT 图书号,图书名称,主编
FROM 图书
WHERE 图书名称 LIKE ‘数据库_第2版’ ESCAPE ‘’ ;

小结:
*查询语句的基本格式.
*单表查询的5个分类
*LIKE谓词的用法.
*通配符的使用方法.

五.排序,分组查询
1.对查询结果进行排序
排序问题:
在现实生活中很多的数据库的操作中,我们需要对操作结果进行排序,例如想知道某一个班级中,某门课程学生最高分是多少?最低分是多少?我们该如何使用SQL语句完成这样的操作?
排序操作1:
查询莫言编写的图书的"图书名称"和"单价",查询结果按单价降序排序.
SELECT 图书名称,单价
FROM 图书
WHERE 主编= ‘莫言’
ORDER BY 单价 DESC;
排序操作2:
还可以在多列上进行排序操作:
查询所有的图书信息查询结果按照出版社名升序排列,同一出版社的按照单价降序排序.
SELECT *
FROM 图书
ORDER BY 出版社 , 单价 DESC;
2.聚集函数
聚集函数:
在对数据库的数据进行查询的操作中,常常需要对操作结果进行统计工作,可以使用聚集函数来完成部分统计工作!

实例:
统计查询学生总人数,
SELECT COUNT (*)
FROM 学生
统计参加选课的学生的人数.
SELECT COUNT (DISTINCT 学号)
FROM 选课

常用的聚集函数
COUNT ( [ DISTINCT | ALL ]*):统计元组的个数.
COUNT ( [ DISTINCT | ALL ] <列名>):统计一列中值的个数.
SUM ( [ DISTINCT | ALL ] <列名> ):计算一列值的总和.
AVG ( [ DISTINCT | ALL ] <列名> ):计算一列值的平均值.
MAX ( [ DISTINCT | ALL ] <列名> ):来一列值的最大值.
MIN ( [ DISTINCT | ALL ] <列名> ): 来一列值的最小值.

3.分组查询
分组查询:
很多场景下,需要把查询结果按照某一列或者多列的值进行分组,也就是说在这些列上值相等会被分成一个小组.为什么要进行分组?是因为需要对结果进行汇总统计计算.这些计算常常是对一个分组进行的,而不是对表的所有记录进行的.
分组操作:
GROUP BY子句可以将查询结果按某一列或多列值分组,值相等的为一组.同时,我们还可以使用HAVING短语设置逻辑条件来筛选组.

例1:
查询各个出版社的图书数量.
SELECT 出版社,COUNT (图书号)
FROM 图书
GROUP BY 出版社
例2:
查询借阅了3本以上图书的读者的读者编号.
SELECT 读者编号
FROM 借阅
GROUP BY 读者编号
HAVING COUNT (*) >3 ;
*WHERE子句与HAVING 短语的区别在于作用对象不同.WHERE子句作用于基本表或视图,从中选择满足条件的元组.HAVING短语作用于组,从中选择满足条件的组.
4.保存分组查询结果
保存结果:
在实际应用中,有时需要将查询结果保存成一个表.这个功能可以用SELECT语句中INTO子句来实现.
格式如下:
SELECT <属性列> INTO <新表名>
FROM <表名>
实例:
查询每门课程的平均分,并把它输出到一个新表中保存
SELECT 课程号 AVG (成绩)
平均分 INTO 课程成绩表
FROM 选课
GROUP BY 课程号

小结:
*排序查询的定义及其实现语句
*聚集函数的作用及其实现语句
*GROUP BY 子句实现分组查询的语句.

六.连接查询
1.连接查询的定义:
问题:
实际开发中,不可能把一个管理系统涉及到的所有信息都放在一个表中,上面讲解的查询都是针对一个表的查询操作.实际上数据库中通常多个表之间是存在联系的,通过这些联系可以为应用程序提供一些涉及到多个表的复杂的信息.
连接查询:
SQL为这种多个表之间存在关联的查询提供了检索数据的方法,我们称之为连接查询.连接查询包括等值连接查询,自然连接查询,非等值连接查询,自身连接查询,外连接查询和复合条件连接查询等.
2.连接查询的一般格式
连接查询的WHERE子句中用来连接连个表的条件称为连接条件或者连接谓词.
连接查询的一般语句格式:
[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
其中,比较运算符主要有:
=,>,<,>=,<=,!=(或者<>)等
此外连接谓词还可以使用下面形式:
[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名3>.]<列名3>

3.等值连接与非等值连接
等值连接:
在连接铲鲟中,当连接运算符为"="时,称为等值连接.
查询每个读者及其借阅图书的情况.
SELECT 读者.,借阅.
FROM 读者,图书
WHERE 读者.读者编号=借阅.读者编号;
自然连接:
指等值连接中的连接字段相同,并且在SELECT子句中去除了重复字段的连接.
SELECT 读者.读者编号,读者姓名,…
FROM 读者,借阅
WHERE 读者.读者编号=借阅.读者编号;
4.自身连接
自身连接:
连接操作,不仅可以在两个不同的表之间进行.也可以在一个表与其自身进行连接,这样的连接运算叫做自连接.我们知道参与连接的两个表其实是同一个表,所以为了加以区分,我们需要对表起别名.
实例:
查询和莫言所编写的某本书为同一个出版社的图书名称,主编和出版社.
SELECT T2.图书名称,T2.主编,T2.出版社
FROM 图书T1,图书T2
WHERE T1.出版社=T2.出版社
AND T1.主编= ‘莫言’;

5.外连接查询
外连接:
在通常的连接操作中只有满足连接条件的元组才能作为结果输出.
有些情况下我们想在输出结果中把不符合满足连接条件的元组也给输出出来.这时我们就需要使用的外连接操作.
实例:
查询每个读者及其借书情况(即使没有借书也列出该读者的基本情况).
SELECT 读者.读者编号,读者姓名,性别,…
FROM 读者 LEFT OUTER
JOIN 借阅 ON 读者.读者编号=借阅.读者编号.
6.复合条件查询
复合连接:
前面所讲解的各个连接查询中,WHERE子句中只有一个条件.
WHERE子句中也可以有多个连接条件,称为复合条件连接.

实例:
查询每个读者的读者姓名,借阅的图书名称及借阅日期,要求所借图书的出版社均是高等教育出版社.
SELECT 读者姓名,图书名称,借阅日期
FROM 图书,读者,借阅
WHERE 图书.图书号=借阅.图书号 AND
读者.读者编号=借阅.读者编号 ADN
出版社=‘高等教育出版社’ ;

小结:
*连接查询的定义及其一般格式句
*连接查询的种类及其实现语句
*复合条件的连接及外连接查询.

七.嵌套查询
嵌套查询的定义:
在SQL中,一个SELECT-FROM-WHERE语句称为一个查询块.将一个查询块嵌套在另外一个查询块的WHERE子句或者HAVING短语的条件中的查询称为嵌套查询.
父(子)查询
嵌套在WHERE子句或者HAVING短语的查询块,我们通常叫它为子查询或者内层查询,相应的上层的查询块就叫做外层查询或者父查询.
1.带有IN谓词的子查询
带IN谓词的子查询就是要判断给定的值
是否在子查询的结果集中。当父查询表
达式与子查询的结果集中的某个值相等
时返回真值,否者返回假值。我们也可
以在IN关键字之前使用NOT来表示要查
询的表达式的值不在查询结果集中。
实例
查询与“李明”在同一个部门的读者。
SELECT *
FROM 读者
WHERE 所在部门 IN
( SELECT 所在部门
FROM 读者
WHERE 读者姓名=
‘李明’);
相关查询与不相关查询
• 不相关子查询:
本例中的子查询只执行一次,其结果用于父查询。子查询的查询条件
不依赖于父查询,这类子查询称为不相关子查询,整个查询语句称为
不相关嵌套查询。
• 相关子查询:
如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询,
整个查询语句称为相关嵌套查询。
2、带有比较运算符的子查询
定义
带有比较运算符的子查询是指父查询
与子查询之间用比较运算符进行连接。
当用户能确切知道内层查询返回的是
单值时,可以用>、<、=、>=、<=、!=
或<>等比较运算符。
子查询一定要跟在比较符之后,否则
会出现错误。
实例
查询年龄比“李明”大的读者的读者姓名。
SELECT 读者姓名
FROM 读者
WHERE 出生日期<
(SELECT 出生日期
FROM 读者
WHERE 读者姓名=
‘李明’);
3、带有ANY、ALL关键字的子查询

定义
子查询返回单值时,在前面我
们谈到了可以用比较运算符。
但是子查询如果要返回的是多
值。我们就需要用到ANY或者
ALL谓词进行修饰。而且我们要
谨记使用这两个谓词的时候必
须同时配合使用比较运算符。
实例
查询其他出版社中比清华大学出版社某
一本图书单价低的图书名称和单价。
SELECT 图书名称,单价
FROM 图书
WHERE 出版社<> ‘清华大学出版社’
AND 单价< ANY(SELECT 单价
FROM 图书
WHERE出版社=
‘清华大学出版社’);
替代方法
本查询也可以用聚集函数来实现。
SELECT 图书名称,单价
FROM 图书
WHERE 出版社<> ‘清华大学出版社’ AND 单价 < (SELECT MAX(单价)
FROM 图书
WHERE 出版社 = ‘清华大学出版社’ );
4、带有EXISTS谓词的嵌套查询
定义
EXISTS谓词称为存在量词,表示
子查询的结果非空时返回真值。
所以该子查询的返回的结果是逻
辑值。正是因为子查询只返回真
值和假值,所以我们在子查询中
不用列出列名。
实例
例:查询所有借阅了A002号图书的读者姓名.
SELECT 读者姓名
FROM 读者
WHERE EXITS
(SELECT *
FROM 借阅
WHERE 读者编号=读者.读者编号 AND 图书号=‘A002’);
小结:
*嵌套查询的定义及其一般格式句.
*嵌套查询的种类及其实现语句.
*嵌套查询的实现.
八.数据操纵
1.问题的提出
前面我们所查询的这些数据信息,是如何存入到数据库中的?如果我们存入的信息出现了错误,或者,随着时间的流逝我们需要更新或者删除其中的数据,我们该如何操纵?
数据操纵:
从广义上来说包括数据的插入,删除和修改.现有的商用的数据库管理系统对数据操纵基本上都可以通过窗口或者是SQL语言实现.
2.插入数据
INSERT
INTO <表名>[ (<列名1>[,<列名2>,…])]
VALUES([<常量1>[,<常量2>,…]]);
实例1:
将一个新图书元组插入到图书表中.
INSERT
INTO 图书
VALUES( ‘A019’, ‘数据库’, ‘王珊’ , ‘高等教育出版社’,33.8);

实例2:
将一个新图书元组插入到图书表中.插入一条借阅记录(‘140128’,‘A002’).
INSERT
INTO 借阅 (读者编号,图书号)
VALUES ( ‘140128’, ‘A002’ );
注意:借阅表有4个属性:读者编号,图书号,借阅日期和还书日期,而这里的INTO子句没有出现借阅日期和还书日期,因此插入的记录在借阅日期和还书日期两列上取空值.

3.插入子查询结果
在SQL中,可以使用SELECT语句查询除的结果代替VALUES子句,一次向基本表中插入多个元组.
格式为:
INSERT
INTO <表名>[(<列名1>[,<列名2>,…])]
<子查询>;
执行过程:
说明:
(1)SQL先处理<子查询>,得到查询结果,再将结果插入到<表名>所指的基本表中.
(2)<子查询>结果集合中的列数,列序和数据类型必须与<表名>所指的基本表中相应各项匹配或兼容.
实例:
求各个出版社图书的总书并存放于一张新表CBS(出版社,总数)中.
(1)建表
CREATE TABLE CBS
(出版社 varchar(15),
总数 int);
(2)插入
INSERT
INTO CBS (出版社,总数)
SELECT 出版社,COUNT(*)
FROM 图书
GROUP BY 出版社;
4.修改数据
SQL中修改数据的语句为UPDATE,格式为:
UPDATE<表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];

实例1
*修改某一个元组的值
[例]将A002号图书的单价改为28.
UPDATE 图书
SET 单价=28
WHERE 图书号='A002;
实例2:
*修改多个元组的值
[例]将所有图书的单价减少1元.
UPDATE 图书
SET 单价=单价-1;
实例3:
*带子查询的修改语句
[例]将读者李明的所有借阅记录的借阅日期置为系统当前日期,还书日期置为NULL.
UDDATE 借阅
SET 借阅日期=GETDATE(),还书日期=NULL
WHERE ‘李明’ =
(SELECT 读者姓名
FROM 读者
WHERE 读者.读者编号=借阅.读者编号);
5.删除数据
删除语句的一般格式为:
DELETE
FROM <表名>
[WHERE<条件>];
实例1:
*删除某一个元组的值
[例]将A002号图书的图书记录删除.
DELETE
FROM 图书
WHERE 图书号=‘A002’;
实例2:
*删除多个元组的值
[例]删除所有的借书记录.
DELETE
FROM 借阅;
这条DELETE语句将借阅表成为空表,它删除了借阅表的所有元组.
实例3:
*带子查询的删除语句
[例]删除莫言所编图书的所有借阅记录
DELTE
FROM 借阅
WHERE ‘莫言’=
(SELECT 主编
FROM 图书
WHERE 图书.图书号=借阅.图书号);
小结:
*插入数据的实现方式及种类.
*修改数据的实现方式及种类
*删除数据的实现方式及种类

关注和评论是对我最大的支持,我会竭尽所能帮助大家

你可能感兴趣的:(数据库,数据库,mysql)