Sql Server 13:Sql Server总结

目录

 

说明

 

正文

 

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 注意

 

 

1.create

 

创建模式

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;

2.insert

INSERT
	INTO <表名> [(<属性列1>[,<属性列2 >…)]
	VALUES (<常量1> [,<常量2>]… );

插入到表

--将学生张成民的信息插入到Student表中。
   	INSERT
    INTO  Student
    VALUES ('201215126','张成民','男’,18,'CS'); 

i:1.插入时 insert 后什么都不写 那么values 括号内信息的顺序 必须和表中属性顺序一致

  2.插入时注意表中不能为空和有外码约束的属性

 

3.alter

 

ALTER TABLE <表名>
[ ADD[COLUMN] <新列名> <数据类型> [ 完整性约束 ] ]
[ ADD <表级完整性约束>]
[ DROP [ COLUMN ] <列名> [CASCADE| RESTRICT] ]
[ DROP CONSTRAINT<完整性约束名>[ RESTRICT | CASCADE ] ]
[ALTER COLUMN <列名><数据类型> ] ;

i:

ADD 子句用于增加新列、新的列级完整性约束条件和新的表级完整性约束条件
DROP COLUMN 子句用于删除表中的列
如果指定了 CASCADE 短语,则自动删除引用了该列的其他对象
如果指定了 RESTRICT 短语,则如果该列被其他对象引用,关系数据库管理系统将拒绝删除该列
DROP CONSTRAINT 子句用于删除指定的完整性约束条件
ALTER COLUMN 子句用于修改原有的列定义,包括修改列名和数据类型
 

修改表

  --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

 

4.select

 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;

指定DISTINCT关键词,去掉表中重复的行

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;

多重条件查询

逻辑运算符:ANDOR来连接多个查询条件的查询

i:AND的优先级高于OR 可以用括号改变优先级

 --查询计算机系年龄在20岁以下的学生姓名。

 SELECT Sname
       FROM  Student
       WHERE Sdept= 'CS' AND Sage<20;

order by 子句

        SELECT Sno, Grade
        FROM    SC
        WHERE  Cno= ' 3 '
        ORDER BY Grade DESC; --查询的成绩按降序排列

聚集函数

统计元组个数       COUNT ( * )
统计一列中值的个数     COUNT ( [DISTINCT| ALL ] < 列名 > )
计算一列值的总和 SUM ( [DISTINCT| ALL ] < 列名 >
计算一列值的平均值 AVG ( [DISTINCT| ALL ] < 列名 > )
求一列中的最大值和最小值

    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; 

Group by子句

     细化聚集函数的作用对象

如果未对查询结果分组,聚集函数将 作用于整个查询结果
对查询结果分组后,聚集函数将 分别作用于每个组

                 按指定的一列或多列值分组,值相等的为一组

     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;

外连接

Sql Server 13:Sql Server总结_第1张图片

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= '刘晨');

带有ANYSOME)或ALL谓词的子查询

Sql Server 13:Sql Server总结_第2张图片

    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 ’;

Sql Server 13:Sql Server总结_第3张图片

带有EXISTS谓词的子查询

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”

若内层查询结果非空,则外层的WHERE子句返回真值

若内层查询结果为,则外层的WHERE子句返回假值

SELECT Sname
     FROM Student
     WHERE EXISTS
     (SELECT *
      FROM SC
      WHERE Sno=Student.Sno AND Cno= ' 1 ');

i:所有IN谓词、比较运算符、ANYALL谓词的子查询

用带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
  ); --为临时派生表

5.update

UPDATE  <表名>
SET  <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];

作用:

修改指定表中满足WHERE子句条件的元组

SET子句给出<表达式>的值用于取代相应的属性列

如果省略WHERE子句,表示要修改表中的所有元组

可以修改:

修改某一个元组的值

修改多个元组的值

带子查询的修改语句

 

         UPDATE  Student
         SET Sage=22
         WHERE  Sno=' 201215121 ';  --修改Student 表中的Sno 的Sage为22

6.drop

DROP TABLE <表名>[RESTRICT| CASCADE];

删除模式

drop schema Wang cascade;--cascade删除模式的同时把该模式中所有的数据库对象全部删除

i: cascade的位置还可以使用

RESTRICT(限制):

如果该模式中定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。
仅当该模式中没有任何下属的对象时才能执行。

 

 

删除表

     DROP TABLE  Student  CASCADE;
            --基本表定义被删除,数据被删除
            --表上建立的索引、视图、触发器等一般也将被删除 

删除索引

  DROP INDEX Stusname;

删除视图

DROP VIEW BT_S ; --注意级联删除

7.Delete

       DELETE
       FROM     <表名>
       [WHERE <条件>];

功能:

删除指定表中满足WHERE子句条件的元组

        DELETE
         FROM Student
         WHERE Sno= '201215128 '; --在Student 表中删除属性Sno= 201215128 的元组

 

8.Grant

       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;

 

 

9.Revoke

    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 王平;

10.Audit

AUDIT ALTER,UPDATE  --对修改SC表结构或修改SC表数据的操作进行审计
ON  SC;
NOAUDIT  ALTER,UPDATE  --取消对SC表的一切审计
ON  SC;

Thinking

温故而知新,总结真的能很大程度上帮助有顺序有条理的记忆,自己去总结就会想需要注意什么,这样就会对重要的知识二次记忆,对之前忽略的细节,也可以很好的补充。

PS:谁能告诉我为什么那个目录点击是不对的位置。。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(DB实验,sql)