• 1、概述
  • 2、查询概述
  • 3、单表查询
  • 4、连接查询
  • 5、带有exists的相关子查询
  • 6、SQL的集合操作
  • 7、插入操作
  • 8、删除操作
  • 9、修改操作
  • 10、数据定义
  • 11、视图

1、概述

名词

笛卡尔积、主键、外键

数据完整性

  • 实体完整性:主属性不能为空值,例如选课表中学号和课程号不能为空
  • 参照完整性:表中的外键取值为空或参照表中的主键
  • 用户定义完整性:取值范围或非空限制,例如:性别(男女),年龄(0-130)

  

表连接

  • 自然连接:与等值连接(a.id=b.id)相比,连接后的表只有一列id,而不是两列(a.id和b.id)。
  • 半连接:与等值连接(a.id=b.id)相比,连接后的表只有A表的列,被B表“多次匹配”列会显示为一行。
  • 左外连接:left join
  • 右外连接:right join
  • 全外连接:full join
  • 全内连接:inner join

SQL语言的构成

  • DDL语言:数据定义,定义基本表、视图、索引;
  • DML语言:数据操纵,查询、增加、修改、删除
  • DCL语言:权限

  

2、查询概述

查询包括:单表查询、连接查询、带有exists的相关子查询、集合操作四中。select...from常用语句执行过程

select…            ⑤    投影
from…              ①    table→内存
where…             ②    选取元组
group…             ③    分组
having…            ④    选择分组
[{union|…}         ⑥    查徇结果的集      合运算
select…  ]         ①~⑤
order by…          ⑦    排序输出

3、单表查询

group by 只有出现在group by子句中的属性,才可出现在select子句中。

用order by子句对查询结果按照一个或多个列的值进行升/降排列输出,升序为ASC;降序为desc,空值将作为最大值排序

having 与 where的区别

  • where 决定哪些元组被选择参加运算,作用于关系中的元组
  • having 决定哪些分组符合要求,作用于分组

4、连接查询

连接查询包括:多表连接查询、单表连接查询(自连接)、外连接查询、嵌套查询4种

连接条件一

[表名1.] 列名1 比较运算符  [表名2.]列名2

连接条件二

[表名1.]列名1  between [表名2.]列名2 and [表名2.]列名3

连接条件中的列名称为连接字段,对应的连接字段应是可比的。

执行过程:采用表扫描的方法,在表1中找到第一个元组,然后从头开始扫描表2,查找到满足条件的元组即进行串接并存入结果表中;再继续扫描表2,依次类推,直到表2末尾。再从表1中取第二个元组,重复上述的操作,直到表1中的元组全部处理完毕。

4.1 单表连接(自连接)

用表别名把一个表定义为两个不同的表进行连接。

例:查找至少选修了2号和4号课程的学生的学号

select FIRST.sno
from SC as FIRST, SC as SECOND
where FIRST.Sno=SECOND.Sno and FIRST.cno='s2' and SECOND.cno='4'

4.2 外连接查询

外连接查询包括:Left join、right join、full join

4.3 嵌套查询

  • 在select … from … where语句结构的where子句中可嵌入一个select语句块
  • 其上层查询称为外层查询或父查询,其下层查询称为内层查询或子查询
  • SQL语言允许使用多重嵌套查询
  • 在子查询中不允许使用order by子句
  • 嵌套查询的实现一般是从里到外,即先进行子查询,再把其结果用于父查询作为条件
4.3.1 返回单个值的子查询

例:求与“刘力”同一个系的学生名,年龄

方法一:
select Sname, Sage
from student
where Sdept = (select sdept from student where  Sname = "刘力");方法二:
select FIRST.Sname, FIRST.Sage
from Student FIRST, Student SECOND
where FIRST.Sdept = SECOND.Sdept AND SECOND.Sname = "刘力";
4.3.2 返回一组值的子查询

例:求选修“C6”课程且成绩超过90分的学生

方法一:
select * from
student
where sno IN (select sno from SC where Cno="C6" AND Grade>90);方法二(连接查询 ):
select student.*
from student,SC
where Student.Sno=SC.Sno AND Cno="C6" AND Grade>90;

例:求比计算机系中某一学生年龄小的其他系的学生

方法一:
select *
from student
wheresdept!="CS" AND  sage < ANY (select Sage from Student where Sdept="CS");方法二:
select  *
from Student
where   Sdept!=’CS’ AND  Sage < (select MAX(Sage) from Student where Sdept="CS");
4.3.3 多重子查询

例:求D01部门中工资与国贸系中任意职工相同的职工姓名和工资

表结构:
Teacher(tno, tname, salary, dno)
Department(dno, dname)查询语句:
select Tname,Salary
from Teacher
where Dno = "D01" AND salary IN(select salary from  teacherwhere Dno =(select DNO from department where  Dname="国贸"));

例:求工资介于“张三”与“里司”两个之间的职工

select *
from teacher
whereSalary >= (select MIN(Salary) from teacher where Tname IN ("张三", "里司")) AND  Salary <= (select MAX(Salary) from teacher where Tname IN ("张三", "里司");
4.3.4 在from语句中使用子查询,对查询结果定义表名及列名

例:求平均成绩超过80分的学号及平均成绩

select Sno, avg_G
from (select Sno, avg(Grade) from SC group by Sno) AS RA(Sno, avg_G)
where avg_G > 80;

AS RA(Sno, avg_G),为查询作为定义表名(RA)和列名(Sno, avg_G)

5、带有exists的相关子查询

  • 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
  • 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带exists 的子查询就是相关子查询
  • exists表示存在量词,带有exists的子查询不返回任何记录的数据,只返回逻辑值“True” 或“False”

例:求所有选修了“C1”课程的学生名。

不相关子查询:
select Sname from student where sno IN ( select sno from SC where Cno = "C1" );相关子查询
select Sname from student
where exists (select * from SC where student.sno=SC.sno AND Cno = "C1" );

相关子查询执行过程:先在外层查询中取student表的第一个元组(记录),用该记录的相关的属性值(在内层where子句中给定的)处理内层查询,若外层的where子句返回‘TRUE’值,则此元组送入结果的表中。然后再取下一个元组;重复上述过程直到外层表的记录全部遍历一次为止。

  • 不关心子查询的具体内容,因此用 select *
  • exists + 子查询用来判断该子查询是否返回元组
  • 当子查询的结果集非空时,exists 为“True”;当子查询的结果集为空时,exists为“False”。
  • not exists :若子查询结果为空,返回“TRUE”值,否则返回“FALSE”

例:查询选修了所有课程的学生的姓名(续)

select Sname
from student
where not exists (select * from Coursewhere not exists (select * from SC where student.sno=SC.sno AND Course.Cno=SC.Cno)
);

例:查询至少选修了S1所选的全部课程的学生名

select Sname
from student
where not exists(select *from SC SCX            where SCX.sno="s1" AND not exists (select *from SC SCYwhere student.sno=SCY.sno AND SCX.Cno=SCY.Cno)
);

6、SQL的集合操作

  • 属性个数必须一致、对应的类型必须一致
  • 属性名可以不一致, 最终结果集采用第一个结果的属性名
  • 缺省为自动去除重复元组,除非显式说明ALL
  • order by放在整个语句的最后

6.1 “并”操作,例:查询计算机系的学生或者年龄不大于19岁的学生,并按年龄倒排序。

select * from student where Sdept="CS"
UNION
select * from student where AGE <= 19
order by AGE desc

6.2 “交”操作,例:查询计算机系的学生并且年龄不大于19岁的学生,并按年龄倒排序。

(select * from student where Sdept = "CS")
INTERSECT
(select * from student where AGE <= 19)
order by AGE desc

6.3 “差”操作,例:查询选修课程1但没有选修课程2的学生。

select Sname, Sdept
from student
where sno IN ((select sno from SC where Cno="1")EXCEPT(select sno from SC where Cno="2")
) 

7、插入操作

格式:insert  into  表名[(列名1,…)]  values  (列值1,…)

插入一已知元组的全部列值

insert into student values("2003001", "陈冬", 18, "男", "电商", "管理学院", "徐州");

插入一已知元组的部分列值

insert into SC(Sno,Cno) values ("2003001", "C003");

插入子查询的结果

例:设关系S_G(Sno,avg_G),把平均成绩大于80的男生的学号及平均成绩存入S_G中
insert into S_G(sno,avg_G) (select sno, avg(GRADE)from SCwhere Sno IN (select Sno from Student where SEX="男")group  by  Snohaving  avg(GRADE) > 80
);

8、删除操作

格式:
delete from 表名 [where 条件];
  • 只能对整个元组操作,不能只删除某些属性上的值
  • 只能对一个关系(表)起作用,若要从多个关系(表)中删除元组,则必须对每个关系分别执行删除命令

9、修改操作

update语句一次只能操作一个表。

格式1:
update 表名 [别名]
set 列名 = 表达式, ...
[where 条件];格式2:
update 表名 [别名]
set (列名, ...) = (子查询)
[where 条件];

例:工种为SALESMEN的职工的工资改为工种平均工资的110%

update EMPLOYEE
set Salary = (select 1.1 * avg(Salary) from EMPLOYEE where JOB="SALESMEN")
where JOB="SALESMEN"; 

例:将所有学生的年龄增加1岁

update student set Sage=Sage+1; 

10、数据定义

创建课程表

create table SC (sno CHAR(6) not null,Cno CHAR(6) not null,Grade smallint default null
)
primary key (sno,Cno)
foreign key (sno) references student(sno)
foreign key (Cno) references Course(Cno)
check (Grade between 0 AND 100);

常用的索引:唯一索引和聚簇索引

唯一索引
  • 对于已含重复值的属性列不能建UNIQUE索引
  • 对某个列建立UNIQUE索引后,插入新记录时DBMS会自动检查新记录在该列上是否取了重复值。这相当于增加了一个UNIQUE约束
create UNIQUE INDEX  Stusno ON Student(Sno ASC);
聚簇索引

建立聚簇索引后,基表中数据也需要按指定的聚簇属性值的升序或降序存放。也即聚簇索引的索引项顺序与表中记录的物理顺序一致

create CLUSTER INDEX Stusname ON Student(Sname);

在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中的记录将按照Sname值的升序存放。Sql server中的表示方式create clustered index。某些DMBS不支持聚簇索引,所以用前一定要查使用说明。

  • 在一个基本表上最多只能建立一个聚簇索引
  • 聚簇索引的用途:对于某些类型的查询,可以提高查询效率
  • 聚簇索引的适用范围:很少对基表进行增删操作;很少对其中的变长列进行修改操作
删除索引

删除索引时,系统会从数据字典中删去有关该索引的描述。

DROP INDEX [表名.]<索引名>;

例:删除Student表的Stusname索引

DROP INDEX Student.Stusname;

11、视图

例:建立电商系学生的视图

create view ec_student
as
select sno, sname, age from student where dept="ec"

删除视图

DROP VIEW <视图名>

一个视图被删除后,由此视图导出的其他视图也将失效,用户应该使用DROP VIEW语句将他们一一删除

转载于:https://www.cnblogs.com/jiazuzhuzhu/p/6964492.html

SQL Server中常用的SQL语句相关推荐

  1. SQL Server中常用的快捷键

    2019独角兽企业重金招聘Python工程师标准>>> 一."文本操作"快捷键 1.Ctrl + K,Ctrl + C:注释选定内容 2.Ctrl + K,Ctr ...

  2. sql azure 语法_Azure SQL Server中的CREATE DATABASE语句概述

    sql azure 语法 In this article, we will review CREATE DATABASE statement in the Azure SQL database wit ...

  3. SQL Server中的动态SQL

    In this article, we will review how to construct and execute dynamic SQL statements in SQL Server wi ...

  4. SQL Server中常用全局变量介绍

    在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值.全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数.下表就是SQL Server中一些常用的全局变量. 全局 ...

  5. SQL server中的SELECT查询语句执行顺序

    各位大牛们好第一次写博客有点小激动!以后我会把自己的心得分享给大家,求各种评论 SQL server 中SELSECT查询语句的执行顺序如下: (8) SELECT   (9) DISTINCT (1 ...

  6. nocount on_在SQL Server中设置NOCOUNT ON语句的用法和性能优势

    nocount on Have you ever noticed SET NOCOUNT ON statement in T-SQL statements or stored procedures i ...

  7. Sql server中 如何用sql语句创建视图 及 视图的作用

    1.视图的作用 视图的作用: 第一点:使用视图,可以定制用户数据,聚焦特定的数据. 解释: 在实际过程中,公司有不同角色的工作人员,我们以销售公司为例的话, 采购人员,可以需要一些与其有关的数据,而与 ...

  8. SQL Server中的空间SQL数据类型

    空间数据类型 (Spatial data type) SQL server furnishes us with the geometry and geography SQL data types fo ...

  9. SQL Server 数据库管理常用的SQL和T-SQL语句

    --按姓氏笔画排序: SELECT*FROM TableName ORDERBY CustomerName COLLATE Chinese_PRC_Stroke_ci_as --数据库加密: SELE ...

最新文章

  1. 1205: 正序数(归并排序统计正序数)
  2. 《信息学奥赛一本通》高精除以高精,求它们的商和余数。
  3. 13.multi_search_api
  4. java if用法_java中if语句的写法
  5. js禁止粘贴非数字内容
  6. Go Web编程--应用数据库
  7. 服务器2003光盘修复,windows光盘修复系统
  8. 开放 Rake 打包项目
  9. js高级学习笔记(b站尚硅谷)-7-函数中的this
  10. 【积】有向图中的louvain社区检测(二)
  11. java 的 表格控件_java最强大的表格控件
  12. ESP8266与网络调试助手通讯
  13. 【vue笔记】页面跳转顺便传个值
  14. 精密测量和超精密测量
  15. 什么样的用户标签系统,可以深入业务构建用户价值体系?
  16. VBA提高篇_12_1 VBA判断奇偶数的方法
  17. C Primer Plus 读书笔记(二)
  18. 基于Python+django的茶叶销售商城网站
  19. 面试加分项,10道海量数据处理,你会几道?
  20. 微型计算机原理与接口技术哈工程,微型计算机原理与接口技术(第2版)

热门文章

  1. VS2015 ionic 开发环境配置纪要
  2. 【Spring-web】RestTemplate源码学习——梳理内部实现过程
  3. iOS - 内购_类型
  4. jquery实现tab切换加自动滚动切换
  5. C++面试题--(五)
  6. linux shell 脚本练习,shell脚本小练习
  7. python常用英文单词怎么写,Python常用英文单词
  8. mysql怎么设置计划任务_mysql设置定时任务
  9. Spring Controller Junit例子
  10. PXA270-基于ARM9内核Processor外部NAND FLASH的控制实现