目录
说明
正文
1.create
创建模式
创建表
创建索引
创建视图
创建角色
2.insert
插入到表
3.alter
修改表
修改索引
4.select
查询指定列
查询全部列
查询经过计算的值
使用列别名改变查询结果的列标题
消除取值重复的行
指定DISTINCT关键词,去掉表中重复的行
带有比较大小的查询
确定范围的查询
确定集合的查询
模糊查询
匹配串为含通配符的字符串的模糊查询
使用换码字符将通配符转义为普通字符的模糊查询
涉及空值的查询
多重条件查询
order by 子句
聚集函数
Group by子句
连接查询
嵌套查询
集合查询
基于派生表的查询
5.update
6.drop
删除模式
删除表
删除索引
删除视图
7.Delete
8.Grant
9.Revoke
10.Audit
Thinking
1.本文只对基本的sql语句进行总结 不对如何使用SSMS 以及如何连接做说明 详情请访问Sql Server 01
2.本文只对标准sql进行总结
表3.2 SQL的动词
SQL 功 能 |
动词 |
数 据 查 询 |
SELECT |
数 据 定 义 |
CREATE,DROP,ALTER |
数 据 操 纵 |
INSERT,UPDATE,DELETE |
数 据 控 制 |
GRANT,REVOKE |
i | 说明 |
Q | 问题 |
A | 解答 |
At | 注意 |
create schema 'S-T' authorization Wang; --前提有wang这个用户
i:1.SQL server 中,默认用户为 dbo,在没有创建模式的情况下,默认的模式名为dbo
2.authorization --授权
create table tabl1( Col1 smallint primary key,--主码 可以唯一确定一个元组
Col2 int,
Col3 char(10),
Col4 numeric(10,3),
Col5 decimal(5,2),
foreign key(Col5) references Other(Fcol) --Col5是外码 是参照了Other表的Fcol列
);
i:1.SQL数据库常用字段数据类型说明
2. PRIMARY KEY (Sno,Cno), 主码由两个属性构成,必须作为表级完整性进行定义
i:次序默认为ASC
CREATE UNIQUE INDEX Stusno ON Student(Sno);--Student表按学号升序建唯一索引,
CREATE UNIQUE INDEX Coucno ON Course(Cno);--Course表按课程号升序建唯一索引,
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);--SC表按学号升序和课程号降序建唯一索引
CREATE VIEW IS_Student --创建视图
AS
SELECT Sno,Sname,Sage --以这些在Student 表得到的条件
FROM Student
WHERE Sdept= 'IS';
i: 带有WITH CHECK OPTION子句,对该视图进行插入、修改和删除操作时,RDBMS会自动加上where 子句里的条件
CREATE VIEW IS_S1(Sno,Sname,Grade) --行列子集视图
AS
SELECT Student.Sno,Sname,Grade
FROM Student,SC
WHERE Sdept= 'IS' AND
Student.Sno=SC.Sno AND
SC.Cno= '1';
CREATE ROLE R1;
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
--将学生张成民的信息插入到Student表中。
INSERT
INTO Student
VALUES ('201215126','张成民','男’,18,'CS');
i:1.插入时 insert 后什么都不写 那么values 括号内信息的顺序 必须和表中属性顺序一致
2.插入时注意表中不能为空和有外码约束的属性
ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;
i:
--ADD
ALTER TABLE Student ADD S_entrance DATE; --不管基本表中原来是否已有数据,新增加的列一律为空值
--ALTER
ALTER TABLE Student ALTER COLUMN Sage INT;
ALTER INDEX SCno RENAME TO SCSno;
--将SC表的SCno索引名改为SCSno
SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>] …
FROM <表名或视图名>[,<表名或视图名> ]…|(SELECT 语句)
[AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
SELECT Sno,Sname
FROM Student; --查询全体学生的学号与姓名。
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student;
--或
SELECT *
FROM Student;
SELECT Sname,2016-Sage --假设当时为2016年 计算出生年份
FROM Student;
SELECT Sname NAME,'Year of Birth:' BIRTH,
2014-Sage BIRTHDAY,LOWER(Sdept) DEPARTMENT
FROM Student;
-- 如果没有指定DISTINCT关键词,则缺省为ALL
SELECT Sno FROM SC;
--等价于:
SELECT ALL Sno FROM SC;
SELECT DISTINCT Sno
FROM SC;
SELECT Sname,Sage
FROM Student
WHERE Sage < 20;
SELECT Sname, Sdept, Sage
FROM Student
WHERE Sage BETWEEN 20 AND 23;
SELECT Sname, Ssex
FROM Student
WHERE Sdept IN ('CS','MA’,'IS' );
i: % (百分号) 代表任意长度(长度可以为0)的字符串
例如a%b表示以a开头,以b结尾的任意长度的字符串
_ (下横线) 代表任意单个字符。
例如a_b表示以a开头,以b结尾的长度为3的任意字符串
where [NOT] LIKE ‘<匹配串>’ [ESCAPE ‘ <换码字符>’]
例如:查询学号为201215121的学生的详细情况。
SELECT *
FROM Student
WHERE Sno LIKE ‘201215121';
--等价于
SELECT *
FROM Student
WHERE Sno = ' 201215121 ';
--查询所有姓刘学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '刘%';
--查询名字中第2个字为"阳"字的学生的姓名和学号。
SELECT Sname,Sno
FROM Student
WHERE Sname LIKE '_ _阳%';
--查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\ ' ;
SELECT Sno,Cno
FROM SC
WHERE Grade IS NULL;
逻辑运算符:AND和 OR来连接多个查询条件的查询
i:AND的优先级高于OR 可以用括号改变优先级
--查询计算机系年龄在20岁以下的学生姓名。
SELECT Sname
FROM Student
WHERE Sdept= 'CS' AND Sage<20;
SELECT Sno, Grade
FROM SC
WHERE Cno= ' 3 '
ORDER BY Grade DESC; --查询的成绩按降序排列
MAX([DISTINCT|ALL] <列名>) MIN([DISTINCT|ALL] <列名>)
SELECT COUNT(*)
FROM Student; --查询总人数
SELECT AVG(Grade) --求平均值
FROM SC
WHERE Cno= ' 1 ';
SELECT SUM(Ccredit) --求总学分
FROM SC,Course
WHERE Sno='201215012' AND SC.Cno=Course.Cno;
细化聚集函数的作用对象
按指定的一列或多列值分组,值相等的为一组
SELECT Cno,COUNT(Sno)
FROM SC
GROUP BY Cno; --Cno为一组 进行记录有多少Sno
SELECT Sno
FROM SC
GROUP BY Sno
HAVING COUNT(*) >3;
At:WHERE子句中是不能用聚集函数作为条件表达式 这时需要正确的使用Having
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG(Grade)>=90;
i:having 和 where 的区别
WHERE子句作用于表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组。
等值与非等值连接查询
SELECT Student.*, SC.*
FROM Student, SC
WHERE Student.Sno = SC.Sno; --对比关系代数中的等值连接
自身连接
需要给表起别名以示区别
所有属性名都是同名属性,因此必须使用“别名”
SELECT FIRST.Cno, SECOND.Cpno --同一个表做两个表的属性
FROM Course FIRST, Course SECOND --同一个表
WHERE FIRST.Cpno = SECOND.Cno;
外连接
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno); --写列出左边关系中的
多表连接
两个以上的表进行连接
SELECT Student.Sno, Sname, Cname, Grade
FROM Student, SC, Course --多表连接
WHERE Student.Sno = SC.Sno
AND SC.Cno = Course.Cno;
带有IN谓词的子查询
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨 ');
SELECT Sno,Sname --最后在Student关系中
FROM Student --取出Sno和Sname
WHERE Sno IN
(SELECT Sno --然后在SC关系中找出选
FROM SC --修了3号课程的学生学号
WHERE Cno IN
(SELECT Cno --首先在Course关系中找出
FROM Course -- “信息系统”的课程号,为3号
WHERE Cname= '信息系统'
)
);
不相关子查询
即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。
SELECT Sno, Sname, Sdept
FROM Student
WHERE Sdept IN
(SELECT Sdept
FROM Student
WHERE Sname= ' 刘晨 ');
相关子查询
子查询的查询条件依赖于父查询
由外向里
①取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
②再取外层表的下一个元组
③重复这一过程,直至外层表全部检查完为止
SELECT Sno, Cno
FROM SC x
WHERE Grade >=(SELECT AVG(Grade)
FROM SC y
WHERE y.Sno=x.Sno);
带有比较运算符的子查询
当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。
SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept = --用 = 替换in
(SELECT Sdept
FROM Student
WHERE Sname= '刘晨');
带有ANY(SOME)或ALL谓词的子查询
SELECT Sname,Sage
FROM Student
WHERE Sage < ANY (SELECT Sage
FROM Student
WHERE Sdept= ' CS ')
AND Sdept <> ‘CS ' ; --父查询块中的条件
SELECT Sname,Sage
FROM Student
WHERE Sage < ALL
(SELECT Sage
FROM Student
WHERE Sdept= ' CS ') --查询所有比CS系都小的年龄
AND Sdept <> ' CS ’;
带有EXISTS谓词的子查询
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
若内层查询结果非空,则外层的WHERE子句返回真值
若内层查询结果为空,则外层的WHERE子句返回假值
SELECT Sname
FROM Student
WHERE EXISTS
(SELECT *
FROM SC
WHERE Sno=Student.Sno AND Cno= ' 1 ');
i:所有带IN谓词、比较运算符、ANY和ALL谓词的子查询
都能用带EXISTS谓词的子查询 等价替换 详见
查询的本来就是一个集合 所以巧用以下语句可以更方便的查询
并-UNION
交-INTERSECT
差-EXCEPT
SELECT *
FROM Student
WHERE Sdept= 'CS' --条件1
UNION
SELECT *
FROM Student
WHERE Sage<=19; --条件2
子查询不仅可以出现在WHERE子句中,
还可以出现在FROM子句中,
这时子查询生成的临时派生表成为主查询的查询对象。
SELECT Sno, Cno
FROM SC, (SELECT Sno, Avg(Grade)
FROM SC
GROUP BY Sno)
AS Avg_sc(avg_sno,avg_grade)
WHERE SC.Sno = Avg_sc.avg_sno
and SC.Grade >=Avg_sc.avg_grade
); --为临时派生表
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
作用:
修改指定表中满足WHERE子句条件的元组
SET子句给出<表达式>的值用于取代相应的属性列
如果省略WHERE子句,表示要修改表中的所有元组
可以修改:
修改某一个元组的值
修改多个元组的值
带子查询的修改语句
UPDATE Student
SET Sage=22
WHERE Sno=' 201215121 '; --修改Student 表中的Sno 的Sage为22
DROP TABLE <表名>[RESTRICT| CASCADE];
drop schema Wang cascade;--cascade删除模式的同时把该模式中所有的数据库对象全部删除
i: cascade的位置还可以使用
RESTRICT(限制):
DROP TABLE Student CASCADE;
--基本表定义被删除,数据被删除
--表上建立的索引、视图、触发器等一般也将被删除
DROP INDEX Stusname;
DROP VIEW BT_S ; --注意级联删除
DELETE
FROM <表名>
[WHERE <条件>];
功能:
删除指定表中满足WHERE子句条件的元组
DELETE
FROM Student
WHERE Sno= '201215128 '; --在Student 表中删除属性Sno= 201215128 的元组
GRANT <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型> <对象名>]…
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
i:WITH GRANT OPTION子句:
指定:可以再授予
没有指定:不能传播
GRANT SELECT --把查询Student表权限授给用户U1
ON TABLE Student
TO U1;
GRANT ALL PRIVILIGES --把对Student表和Course表的全部权限授予用户U2和U3
ON TABLE Student,Course
TO U2,U3;
GRANT SELECT --把对表SC的查询权限授予所有用户
ON TABLE SC
TO PUBLIC;
GRANT UPDATE(Sno), SELECT --把查询Student表和修改学生学号的权限授给用户U4
ON TABLE Student
TO U4;
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION; --把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户
--赋予R1 有对Student表进行的SELECT、UPDATE、INSERT权限
GRANT SELECT, UPDATE, INSERT
ON TABLE Student
TO R1;
REVOKE <权限>[,<权限>]...
ON <对象类型> <对象名>[,<对象类型><对象名>]…
FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
REVOKE UPDATE(Sno) --用户U4修改学生学号的权限收回
ON TABLE Student
FROM U4;
REVOKE SELECT --收回所有用户对表SC的查询权限
ON TABLE SC
FROM PUBLIC;
REVOKE INSERT --把用户U5对SC表的INSERT权限收回
ON TABLE SC
FROM U5 CASCADE ;
REVOKE R1 --可以一次性通过R1来回收王平的这3个权限(王平的权限来自于R1)
FROM 王平;
AUDIT ALTER,UPDATE --对修改SC表结构或修改SC表数据的操作进行审计
ON SC;
NOAUDIT ALTER,UPDATE --取消对SC表的一切审计
ON SC;
温故而知新,总结真的能很大程度上帮助有顺序有条理的记忆,自己去总结就会想需要注意什么,这样就会对重要的知识二次记忆,对之前忽略的细节,也可以很好的补充。
PS:谁能告诉我为什么那个目录点击是不对的位置。。。。