SQL基础知识(1)

                     数据库

 

SQL功能

动词

数据查询

SELECT

数据定义

CREATE, DROP, ALTER

数据操纵

INSERT, UPDATE, DELETE

数据控制

GRANT, REVOKE

 

          SQL的数据定义语句  

定义模式

CREATE SCHEMA <模式名> AUTHORIZATION<用户名>

 

删除模式

DROP SCHEMA<模式名><CASCADE>|RESTRICT>

CASCADE(级联):表示在删除模式的同时把该模式中所有的数据库对象全部删除。

RESTRICT(限制):表示如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。只有当该模式中没有任何下属的数据库对象时才能执行DROP SCHEMA语句。

 

 

定义基本表

CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]

      [,<列名><数据类型>[列级完整性约束条件]]

      …

      [,<表级完整性约束条件>]);

 

修改基本表

      ALTERTABLE<表名>    //修改基本表

      [ADD[COLUMN] <新列名><数据类型>[完整性约束]]   //ADD子句用于增加新列等

      [ADD<表级完整性约束>]

      [DROP[COLUMN] <列名>[CASCADE|RESTERICT]]   

//DROP COLUMN子句用于删除表中的列

      [DROPCONSTRAINT<完整性约束名>[RESTRICT|CASCADE]]

      [ALTERCOLUMN<列名><数据类型>];

//ALTER COLUMN子句用于修改原有的列定义,包括修改列名和数据类型

 

删除基本表

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

 

索引的建立与删除

建立索引

CREATE[UNIQUE][CLUSTER] INDEX<索引名> ON <表名>(<列名>[次序][,<列名>[<次序>]] …);

ASC(升序)   DESC(降序)

UNIQUE表明此索引的每一个索引值只对应唯一的数据记录

CLUSTER表明要建立的索引是聚簇索引

 

修改索引

ALTER INDEX<旧索引名>RENAME TO<新索引名>;

 

删除索引

DROP INDEX<索引名>;

     

 

数据查询

数据查询一般格式为

SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…FROM<表名或视图名> [,<表名或视图名>…] | (<SELECT语句>)[AS]<别名> [WHERE<条件表达式>]

[GROUP BY<列名1>[HAVING<条件表达式>]]  //结果按<列名1>的值进行分组

[ORDER BY<列名2>[ASC | DESC];  //结果表要按<列名2>的值升序或降序排序

 

单表查询

(1)        查询指定列

例:SELECT Sno, Sname FROM Student;

(2)        查询全部列

例:SELECT * FROM Student;

(3)        查询经过计算的值

SELECT子句的<目标表达式>不仅可以是表中的属性列,也可以是表达式

例:SELECT Sname, 2014-Sage FROM Student //查询结果的第二列是一个算数表达式

(4)        消除取值重复的行(DISTINCT)

例:SELECT DISTINCT Sno FROM SC;

(5)        查询满足条件的元组(WHERE)

1)       比较大小

例:SELECT Sname,Sage FROM Student WHERE Sage < 20;

2)       确定范围(BETWEEN…AND…和NOT BETWEEN…AND…)

例:SELECT Sname,Sdept,Sage FROM Student WHERE Sage BETWEEN 20 AND 30;

3)       确定集合(IN和NOT IN)

例:SELECT Sname,Ssex FROM Student WHERE Stept IN (‘CS’,’MA’,’IS’);

4)       字符匹配(LIKE和NOT LIKE)

[NOT] LIKE ‘<匹配串>’ [ESCAPE ‘<换码字符>’]

%:代表任意长度(长度可以为0)的字符串

_:代表任意单个字符串

例:SELECT Sname,Sno,Sex FROM Student WHERE Sname LIKE ‘刘%’;

5)       涉及空值的查询(IS NULL和IS NOT NULL)

例:SELECT Sno,Cno FROM SC WHERE Grade IS NULL;

6)       多重条件查询(AND 和OR)

例:SELECT Sname FROM Student WHERE Sdept = ‘CS’ AND Sage < 20;

(6)        ORDER BY 子句(升序或者降序排序)

例:SELECT Sno, Grade FROM SC WHERE Cno = ‘3’ ORDER BY Grade DESC;

对于空值,排序时显示的次序由具体系统实现来决定

(7)        聚集函数

COUNT(*)            //统计元组个数

COUNT([DISTINCT|ALL]<列名>)  //统计一列中值的个数

SUM([DISTINCT|ALL]<列名>)  //计算一列值的总和

AVG([DISTINCT|ALL]<列名>)  //计算一列值的平均值

MAX([DISTINCT|ALL]<列名>)  //求一列值中的最大值

MIN([DISTINCT|ALL]<列名>)  //求一列值中的最小值

 

人生就和学习一样,出现了错误,只要去改正,反思,牢记,就会Be A Better Man。

 

连接查询

(1)        等值与非等值连接查询

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

其中比较运算符主要有=、>、< 、>=、 <= 、!= (或<>) 等。

此外连接谓词还可以使用下面的形式:

[<表名1>.]<列名1>BETWEEN [<表名2>.]<列名2>AND[<表名2>.]<列名3>

当连接运算符为=时,称为等值连接,使用其他运算符称为非等值连接

例:SELECT Student.*,SC.* FROM Student,SC WHERE Student.Sno = SC.Sno; //将Student与SC中同一学生的元组连接起来

自然连接:在等值连接中把目标列中重复的属性列去掉

一条SQL语句可以同时完成选择和连接查询,这时WHERE子句是由连接谓词和选择谓词组成的复合条件

例:SELECT Student.Sno,Sname FROM Student,SC WHERE Student.Sno = SC.SnoAND  //连接谓词

SC.Sno = ‘2’ ANDSC.Grade > 90;   //其他限定条件

 

自身连接:一个表与其自己进行连接

例:要为Course表取两个别名,一个是FIRST,另一个是SECOND

SELECTFIRST.Con, SECOND.Cpon FROM Course FIRST, Course SECOND WHERE FIRST.Cpon =SECOND.Cno;

 

外连接:把悬浮元组也保存在结果关系中,而在其他属性上填空值(NULL)

      例:SELECT Student.Sno,Sname,Sex,SageFROM Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno);

左外连接:只保留左边关系R中的悬浮元组

右外连接:只保留右边关系S中的悬浮元组

 

多表连接

SELECT Student.Sno,Sname,Cname,Grade FROMStudent,SC,Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;

 

嵌套查询

将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询。

SELECT Sname FROM Student WHERE Sno IN //外层查询或者父查询

 (SELECT Sno FROM SC WHERE Cno = ‘2’); //内层查询或者子查询

不相关子查询:子查询的条件不依赖于父查询,反之为相关子查询。

(1)带有比较运算符的子查询

      SELECTSno,Sname,Sdept FROM Student WHERE Sdept = (SELECT Stept FROM Student WHERESname = ‘刘晨’);

 

(2)        带有ANY(SOME)或ALL谓词的子查询

SELECTSname,Sage FROM Student WHERE Sage<ANY(SELECT Sage FROM Student WHERE Sdept= ‘CS’) AND Sdept <> ‘CS’; //<ANY:小于子查询结果中的某个值,Sdept<>’CS’:这是父查询块中的条件

 

ANY(或SOME)、ALL谓词与聚集函数、IN谓词的等价转换关系

 

   =

<>或!=

   <

  <=    

   >

  >=

 ANY

  IN

  --

<MAX

<=MAX

>MIN

>=MIN

 ALL

  --

NOT IN

<MIN

<=MIN

>MAX

>=MAX

 

(3)带有EXISTS谓词的子查询

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

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

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

      与EXISTS谓词相对应的是NOT EXISTS谓词,使用存在量词NOT EXISTS后,若内层查询结果为空,则外层的WHERE子句返回真值,否则返回假值。

 

集合查询

      多个SELECT语句的结果可进行集合操作

      集合操作只要包括并操作UNION、交操作INTERSECT和差操作EXCEPT

      例:SELECT * FROM Student WHERE Sdept= ‘CS’ UNION SELECT * FROM Student WHERE Sage <= 19;

 

基于派生表的查询

子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象

例:SELECT SnameFROM Student,(SELECT Sno FROM SC WHERE Con = ‘1’) AS SC1 WHERE Student.Sno =SC1.Sno;

通过FROM子句生成派生表时,AS关键字可以省略,但必须为派生关系指定一个别名。

 

 

 

 

 

 

 

 

你可能感兴趣的:(SQL基础知识(1))