SQL进阶(三)

SQL Alias 别名:

SQL别名用于为表或表中的列提供临时名称,使列名具有可读性,一个别名只存在于查询期间;

列的SQL Alias语法:

SELECT column_name AS alias_name

FROM table_name;

表的SQL Alias语法:

SELECT column_name(s)

FROM table_name AS alias_name;

SQL约束:

约束类型:

约束 描述
NOT NULL约束 保证列中数据不能有NULL值
DEFAULT约束 提供该列数据未指定时所采用的默认值
UNIQUE约束 保证列中各数据各不相同
主键约束 唯一标识表中的行/记录
外键约束 唯一标识其他表中的行/记录
CHECK约束 此约束保证列中所有值满足某一条件
索引 用于在数据库中快速创建或检索数据

SQL创建约束:

CREAT TABLE table_name

(

  column1 datatype constraint,

  column2 datatype constraint,

  column3 datatype constraint,

  ...

)

删除约束:

任何现有约束都可以通过ALTER TABLE命令中指定DROP CONSTRAINT 选项的方式删除掉;

如:删除Employees表中的主键约束,可用如下命令:

ALTER TABLE Employees DROP CONSTRAINT Employees_PK;

UNIQUE 约束:

每个表可以有多个UNIQUE约束,但只能有一个PRIMARY KEY约束;

在SQL Server,Oracle,MS Access中,UNIQUE约束可向NOT NULL约束一样写于列的datatype后面;

在MySQL中:为“person”表中的“P_Id”列创建UNIQUE约束:

CREAT TABLE person

(

  P_Id int NOT NULL,
  LastName varchar(255) NOT NULL,
  FirstName varchar(255),
  Address varchar(255),
  City varchar(255),
  UNIQUE (P_Id)

)

如需命名UNIQUE约束,并定义多个列的UNIQUE约束,需用如下语法(适用于MySQl、SQL Server,Oracle,MS Access):

CONSTRAINT unique_name UNIQUE(column1,column2...)

当表已经创建时,如需在“p_Id”列创建UNIQUE约束,需用如下语法(适用于MySQl、SQL Server,Oracle,MS Access):

ALTER TABLE Persons

ADD UNIQUE(p_Id);

撤销UNIQUE约束:

MySQL:

ALTER TABLE table_name

DROP INDEX unique_name

撤销UNIQUE约束(SQL Server、Oracle、MS Access):

ALTER TABLE table_name

DROP CONTRAINT unique_name;

 PRIMARY KEY约束:

PRIMARY KEY 唯一标识数据库中的每条记录,主键必须包含唯一值,主键列不能包含NULL值,每个表都应该有一个主键且只能有一个主键;

PRIMARY KEY在用法上同UNIQUE,请参照UNIQUE,在此不多做阐释。

FOREIGN KEY约束:

一个表中的FOREIGN KEY 指向另一个表中的PRIMARY KEY,FOREIGN KEY 约束能预防表之间连接破坏的行为。

MySQL:在“Orders”表中在“P_Id”列创建外键约束:

CREAT TABLE Orders

  O_Id int NOT NULL,

  OrderNo int NOT NULL,

  P_Id int,

  PRIMARY KEY(O_Id),

  FOREIGN KEY (P_Id)REFERENCES Persons(P_Id)

);

SQL Server,Oracle,MS Access:

CREAT  TABLE Oreders

  O_Id int NOT NULL PRIMARY KEY,

  OrederNo int NOT NULL,

  P_Id int FOREIGN KEY REFERENCES Persons(P_Id)

);

如需命名FOREIGN KEY并定义多个列的FOREIGN KEY约束,使用如下语句(适用于SQL Server,Oracle,MS Access,MySQL):

CREAT TABLE Orders

O_Id int  NOT NULL,

OrderNo int NOT NULL,

P_Id int,

PRIMARY KEY(O_Id),

CONSTRAINT fk_PerOrders FOREIGN KEY(P_Id)REFERENCES Persons(P_Id)

DEFAULT约束:

DEFAULT 约束用于向表中插入默认值,如果没有规定其他的值,会将默认值插入到表中;

CREAT TABLE Persons

  P_Id int NOT NULL,

  LastName varchar(255) NOT NULL,

  FirstName varchar(255),

  Address varchar(255),

  City varchar(255) DEFAULT “sandnes”

);

若表已经被创建时,需创建DEFAULT约束使用如下语句:

MySQL:

ALTER TABEL Persons

ALTER City SET DEFAULT “sandnes”;

SQL Server,MS Access:

ALTER TABLE Persons

ADD CONSTRAINT DF_Persons_City DEFAULT ("sandnes") FOR City;

Oracle:

ALTER TABLE Persons

MODIFY City DEFAULT “sandnes”;

CHECK约束:

CHECK约束用于对列中的值进行约束;如果对单个列进行约束,那么该列只允许特定的值;如果对一个表进行约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制;

CHECK用法同UNIQUE用法,约束写于括号内;

SQL JOIN连接:

SQL JOIN语句用于将数据库中两个或两个以上表中的记录组合起来,连接通过公有值将不同表中的字段组合在一起;

关于SQL INNER JOIN、RIGHT JOIN、LEFT JOIN、FULL JOIN在SQL高级语句(二)中已有详细阐述,在此不多做阐释。

现介绍一种新的连接方式:

笛卡尔连接:又称为交叉连接,返回两个或者更多连接表中记录的笛卡尔乘积,也就是说,他相当于连接谓词总是为真或者缺少连接谓词的内连接。基本语法如下:

SELECT table1.column1,table2.column2...

FROM tabel1,table2...

SQL UNION语句:

SQL UNION语句用于将两个或更多的SELECT语句运算结果组合起来。在SQL高级语句(二)中已有详细阐述,在此不多做阐释。

有两个子句(即运算法)有UNION语句非常像:

INTERSECT子句:用于组合两个SELECT语句,但是只返回两个SELECT语句的结果中都有的行;

EXCEPT子句:组合两个SELECT语句,并将第一个SELECT语句的结果中存在,但是第二个SELECT语句的结果中不存在的行返回。

SQL克隆数据表:

某些情况下,我们可能需要原样拷贝某张数据库表,但是,CREAT TABLE却不能满足我们的需求,因为复制表必须和原表拥有一样的索引,默认值等;

若使用MySQL关系型数据库管理系统,可用以下几个步骤解决该问题:

1、使用SHOW CREAT TABLE table_name命令来获取一条指定原表的结构,索引等信息的CREAT TABLE语句;

2、将语句中的表名修改为克隆表的名字,然后执行该语句,这样便可得到一张与原表完全相同的克隆表;

3、若还需要克隆表中的数据,需使用INSERT INTO...SELECT语句。

SQL索引:

建立索引是加快表查询速度的有效手段。当我们需要在一本书中查找某些信息时,往往是通过目录找到所需信息对应的页码,然后再从该页码中找到所要的信息,这种做法比直接翻阅书的内容速度要更快。如果把数据库比作一本书,那么表的索引就是这本书的目录,可以通过索引大大加快表的查询;

同UNIQUE约束一样,索引可以是唯一的,这种情况下,索引会阻止列中(或者列的组合,其中某些列有索引)出现重复的条目;

CREAT INDEX命令:

CREAT INDEX index_name ON table_name;

单列索引(即基于某一字段创建的索引):

CREAT INDEX index_name

ON table_name (column_name);

唯一索引:

唯一索引不止用于提升查询性能,还用于保证数据完整性,唯一索引不允许向表中插入重复值;

CREAT UNIQUE INDEX index_name

ON table_name(column_name);

聚簇索引:

聚簇索引在表中两个或更多列的基础上建立;

CREAT INDEX index_name

ON table_name(column1,column2...);

创建单列索引还是聚簇索引要看每次查询中,哪些列在作为过滤条件的WHERE子句中最常出现;

隐式索引:

隐式索引由数据库服务器在创建某些对象时自动生成,如对于主键约束和唯一约束,数据库服务器就会自动创建索引;

DROP INDEX命令:

DROP INDEX index_name;

尽管创建索引的目的是为了提升数据库的性能,但是还是有些情况应当避免使用索引,下面的几条指导原则给出了何时需要考虑是否使用索引:

1、小的数据库不应当使用索引;

2、需要频繁进行大批量的更新或插入操作的表不宜创建索引;

3、如果列中包含大数或者NULL值,不宜创建索引;

4、频繁操作的列不宜创建索引;

 SQL子查询:

又称为内查询或嵌套查询,是嵌套在SQL查询的WHERE子句中的查询;

子查询用于为主查询返回所需数据,或者对检索数据进行进一步的限制。

子查询可以在SELECT,INSERT,UPDATE和DELETE语句中,同=,<,>,>=,<=,IN,BETWEEN运算符一起使用;

使用子查询必需遵循下面几个规则:

1、子查询必须在圆括号中;

2、子查询的SELECT子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较;

3、子查询不能使用OREDER BY,不过主查询可以。在子查询中,GROUP BY可以起到同ORDER BY一样的作用;

4、返回多行数据的子查询只能同多指操作符一起使用,比如IN操作符;

5、子查询不能直接用于集合函数中;

6、BETWEEN操作符不能同子查询一起使用,但BETWEEN操作符可以用在子查询中;

7、SELECT列表中不能包含对BLOB、ARRAY、CLOB或NCLOB类型值的引用;

SELECT语句中的子查询:

SELECT column_name[,column_name]

FROM table1[,table2]

WHERE column_name OPERATOR(如IN、=,<等)

  (

  SELECT column_name[,column_name]

  FROM table1[,table2]

  [WHERE]

  )

INSERT 语句中的子查询:

INSERT INTO  table_name[(column1 [,column2])]

  SELECT [ *|column1 [,column2]

  RROM table1 [,table2]

  [WHERE VALUE OPERATOR]

UPDATE中的子查询:

UPDATE tabel

SET column_name = new_value

[WHERE OPERATOR [VALUE]

  (SELECT column_name

  FROM table_name

  [WHERE])

DELETE语句中的子查询:

DELETE FROM table_name

[WHERE OPERATOR [value]

  (SELECT column_name

  FROM table_name

  [WHERE])

ALTER TABLE 语句:

ALTER命令用于添加删除或更改现有表中的列;

添加新列:

ALTER TABLE table_name ADD column_name datatype;

删除列:

ALTER TABLE table_name DROP COLUMN column_name;

更改列的数据类型:

ALTER TABLE table_name MODIFY COLUMN column_name datatype;

添加NOT NULL约束:

ALTER TABLE table_name MODIFY column_name datatype NOT NULL;

 添加唯一约束:

ALTER TABLE table_name

ADD CONSTRAINT MyUniqueConstraint UNIQUE(column1,column2..)

添加CHECK约束:

ALTER TABLE

ADD CONSTRAINT MyCheckConstraint CHECK(condition);

添加主键约束:

ALTER TABLE table_name

ADD CONSTRAINT MyPrimaryKey PRIMARY KEY(column1,column2...)

删除约束:

ALTER TABLE tabel_name

DROP CONSTRAINT constraintName;

MySQL删除约束:

ALTER TABLE table_name

DROP INDEX constraint_name;

MySQL删除主键列约束:

ALTER TABLE table_name

DROP PEIMARY KEY

SQL处理重复数据:

SQL中DISTINCT关键字与SELECT语句一起使用,可以达到消除重复记录,只返回唯一记录的目的;

SELECT DISTINCT column1,column2,....columnN

FROM table_name

WHERE [condition]

SQL视图:

视图是存储在数据库中的具有名字的SQL语句,或者说是以预定义的SQL查询的形式存在的数据表的成分,是一种虚拟的表;允许用户有以下的操作:

1、以用户或者某些类型的用户感觉自然或者直观的方式来组织数据;

2、限制对数据的访问,从而使得用户仅能够看到或者修改他们需要的数据;

3、从多个表中汇总数据,以产生报表;

创建视图:

CREAT VIEW view_name AS

SELECT column1,column2...

FROM table_name

WHERE [condition];

CREAT CHECK OPTION:

CREAT CHECK OPTION是CREATE VIEW语句的一个可选项。WITH CHECK OPTION用于保证所有的UPDATE和INSERT语句都满足视图中的条件,如果不能满足就会报错,如:

CREAT VIEW customers_view AS

SELECT name,age

FROM customers

WHERE age IS NOT NULL

WITH CHEKC OPTION;

这的WITH CHECK OPTION使得视图拒绝任何avg字段为NULL的条目;

更新视图:

视图可以在特定的情况下更新:

1、SELECT子句不能包含DISTINCT关键字;

2、SELECT子句不能包含任何汇总函数;

3、SELECT子句不能包含任何集合函数;

4、SELECT子句不能包含任何集合运算符;

5、SELECT子句不能包含ORDER BY 子句;

6、FROM子句中不能有多个数据表;

7、WHERE子句不能包含子查询;

8、查询语句中不能包含HAVING语句或GROUP BY;

9、计算得出的列不能更新;

10、视图必须包含原始数据表中所有的NOT NULL列,从而使INSERT查询生效;

向视图中插入新行,删除视图中的行的规则同UPDATE命令;

删除视图:

DROP VIEW view_name;

SQL HAVING子句:

HAVING子句用于过滤指定条件,从而控制查询结果中哪些组可以出现在最终结果里面;WHERE子句对被选择的列施加条件,而HAVING子句则对GROUP BY子句所产生的组施加条件;

SELECT column1,column2

FROM table1,table2

WHERE [condition]

GROUP BY column1,column2

HAVING [condition]

ORDER BY column1,column2;

SQL事务:

事务是在数据库上按照一定逻辑顺序执行的任务序列,既可以由用户手动执行,也可以由某种数据库程序自动执行;事务实际上就是对数据库的一个或多个更改,当我们在数据库上创建更新或者删除记录师,我们就已经使用事务了;控制事务以保证数据的完整性,并对数据库错误做出处理;

事务的属性:(ACID)

原子性:保证任务中的所有操作都执行完毕,否则事务会在出现错误时终止,并回滚之前所有操作到原始状态;

一致性:如果事务执行成功,则数据库的状态进行了正确的转变;

隔离性:保证不同的事务相互独立,透明的执行;

持久性:即使出现系统故障,之前成功执行的事务的结果也会持久存在;

事务控制的四个命令:

COMMIT:提交更改;

ROLLBACK:回滚更改;

SAVEPOINT:在事务内部创建一系列可以ROLLBACK的还原点;

SET TRANSACTION:命名事务;

COMMIT:

COMMIT命令用于保存事务对数据库的更改,会将上次COMMIT命令或者ROLLBACK命令执行以来所有的事务都保存到数据库中,语法如下:

COMMIT;

ROLLBACK:

用于撤销尚未保存到数据库中的事务;只能撤销上次自COMMIT命令或者ROLLBACK命令执行以来的事务,语法如下:

ROLLBACK;

SAVEPOINT命令:

SAVEPOINT是事务中的一个状态点,使得我们可以将事务回滚到特定的点,而不是将整个事务都撤销,语法如下:

SAVEPOINT savepoint_name;

而ROLLBACK是撤销一系列的事务,若要回滚至某一保存点需使用:

ROLLBACK TO savepoint_name;

RELEASE SAVEPOINT命令:

RELEASE SAVEPOINT用于删除之前创建的保存点,语法如下:

RELEASE SAVEPOINT savepoint_name;

SET TRANSATION命令:

SET TRANSATION命令可以用来初始化数据库事务,指定随后的事务的各种特征。如将某个事务指定为只读或读写:

SET TRANSATION [READ WRITE|READ ONLY];

原文地址:https://www.cnblogs.com/liumuz/p/8885195.html