SQL SERVER语法

一.绪论
1.1关系模型
关系:一个关系对应一张表
元组:对应行
属性:对应列
主码:也称码键。某个属性组,可以唯一确定一个元组。
域:属性的取值范围来自某个域。
例如,学生年龄属性的域(15-28岁)
分量:元组中的一个属性值。
关系模式:对关系的描述。

三.SQL语句
1.概述
1.1基本表
一个关系对应一个基本表。
一个或多个基本表对应一个存储文件。
1.2视图
从一个或几个基本表导出的表。
数据库中只存放视图的定义而不存放数据。
视图是一个虚表。
用户可以再视图上再定义视图。

2.数据定义
2.1定义模式
2.1.1为用户Z创建一个模式TEST,并在其中定义一个表TAB1。
CREATE SCHEMA TEST AUTHORIZATION Z
CREATE TABLE TAB1 (COL SAMLLINT,
COL2 INT,
COL3 CHAR(20)
2.1.2删除模式
DROP SCHEMA<模式名><CASCADE|RESTRICT>
前者:级联,删除模式时把数据库对象全部删除。
后者:限制,如果该模式中定义了下属的数据库对象,如表、视图等,则拒绝该删除语句的执行。

2.2基本表定义
建立学生表
CREATE TABLE Student
(Sno CHAR(9) PRIMARY KEY,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);

建立课程表
CREATE TABLE Course
(Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) ,
Cpno CHAR(4).
FOREIGN KEY(Cpno) REFERENCES Course(Cno)
);

修改基本表
增加 入学时间列 类型为日期型
ALTER TABLE Student ADD S_entrance DATE;

建立索引
CREATE UNIQUE INDEX Stusno ON Student(Sno);

3.数据查询
3.1消除取值重复的行 DISTINCT
SELECT DISTINCT Sno
FROM SC;

3.2查询年龄不在20-23岁之间的学生姓名,系别。
SELECT Sname,Sdept
FROM Student
WHERE Sage NOT BETWEEN 20 AND 23;

3.3查询所有姓刘学生的姓名、学号和性别
SELECT Sname,Sno,Ssex
FROM Student
WHERE Sname LIKE’刘%’;

查询姓“欧阳”且全名为三个汉字的学生的姓名
SELECT Sname
FROM Student
WHERE Sname LIKE’欧阳_’;

3.4查询所有有成绩的学生学号
SELECT Sno
FROM SC
WHERE Grade IS NOT NULL;

3.5 AND优先级高于OR,可以用括号改变优先级

3.6查询选修3号课程的学生的学号及其成绩,结果按分数降序排列
SELECT Sno,Grade
FROM SC
WHERE Cno=‘3’
ORDER BY Grade DESC;

3.7聚集函数
COUNT(*):统计元组个数
COUNT(DISTINCT|ALL)统计一列中值的个数
SUM 一列值总和
AVG 一列值平均值
MAX MIN

3.8查询选修了课程的学生人数
SELECT COUNT(DISTINCT SNO)
FROM SC;

3.9 GROUP BY子句分组
求各个课程号及相应的选课人数
SELECT Cno,COUNT(Cno)
FROM SC
ORDER BY Cno;

查询选修了3门以上课程的学生学号
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*)>3;

查询平均成绩大于等于90分的学生学号和平均成绩
错误示例:
SELECT Sno,AVG(Grade)
FROM SC
WHERE AVG(Grade)>=90 WHERE子句中不能用聚集函数作为条件表达式
GROUP BY Sno;

正确
SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;

3.10二者区别
WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组

3.11按系并区分男女统计各系学生的人数、并按照人数降序排列
SELECT Sdept,Ssex,Count(Sno)
FROM Student
GROUP BY Sdept,Ssex
ORDER BY COUNT(Sno) DESC;

4.连接查询
4.1等值与非等值连接查询
查询选修2号课程且成绩在90分以上的所有学生的学号和姓名
SELECT Student.Sno,Sname
FROM SC
WHERE Student.Sno=SC.Sno AND
SC.Cno=‘2’ AND SC.Grade>90;

4.2自身连接
需要给表起别名以示区别
属性都是同名属性,必须使用别名前缀

查询每一门课的直接先修课的名称
SELECT FIRST.Cname,SECOND.Cname
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.Cno;

4.3外连接
1 外连接以指定表为连接主体,将主体表中不满足连接条件的元组一并输出。
2 左外连接
列出左边关系中所有的元组
3 右外连接同上

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUT JOIN SC ON
(Student.Sno=SC.Sno )

5.嵌套查询
1 将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中查询。
2 子查询不能用ORDER BY

5.1带有IN谓词子查询
查询刘晨所在系
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname='刘晨’);

5.2带有比较运算符的子查询
找出每个学生超过他选修课程平均成绩的课程号
SELECT Sno,Cno
FROM SC x
WHERE Grade>=(SELECT AVG(Grade)
FROM SC x
WHERE y.Sno=x.Sno)

5.3带有ANY(SOME)或ALL谓词
1 使用ANY或ALL必须同时使用比较运算

5.4带有EXISTS谓词
只返回逻辑真值,true或false。子查询表达式用*表示。

查询所有选修了1号课程的学生姓名
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT*
FROM SC
WHERE Sno=Student.Sno AND Cno=‘1’)

6.集合查询
并操作UNION
交操作INTERSECT
差操作EXCEPT

7.插入数据
1 插入元组
INSERT INTO Student
VALUES(‘20121516’,‘张三‘,’男‘,’18‘,’CS’);
2 插入子查询结果
2.1对每一个系,求学生的平均年龄,并把结果存入数据库。
第一步:建表
CREATE TABLE D
(Sdept CHAR(15)
Avg_age SMALLINT);
第二步:插入数据
INSERT INTO D(Sdept ,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

8.修改语句
将所有学生年龄增加1岁。
UPDATE Student
SET Sage=Sage+1;

9.删除数据
DELETE FROM Student
WHERE Sno=‘201215128’;

猜你喜欢

转载自blog.csdn.net/weixin_44317247/article/details/113739709