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约束:it

约束类型:io

约束 描述
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关系型数据库管理系统,可用如下几个步骤解决该问题:

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

二、将语句中的表名修改成克隆表的名字,而后执行该语句,这样即可获得一张与原表彻底相同的克隆表;

三、若还须要克隆表中的数据,需使用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;

尽管建立索引的目的是为了提高数据库的性能,可是仍是有些状况应当避免使用索引,下面的几条指导原则给出了什么时候须要考虑是否使用索引:

一、小的数据库不该当使用索引;

二、须要频繁进行大批量的更新或插入操做的表不宜建立索引;

三、若是列中包含大数或者NULL值,不宜建立索引;

四、频繁操做的列不宜建立索引;

 SQL子查询:

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

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

子查询能够在SELECT,INSERT,UPDATE和DELETE语句中,同=,<,>,>=,<=,IN,BETWEEN运算符一块儿使用;

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

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

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

三、子查询不能使用OREDER BY,不过主查询能够。在子查询中,GROUP BY能够起到同ORDER BY同样的做用;

4、返回多行数据的子查询只能同多指操做符一块儿使用,好比IN操做符;

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

六、BETWEEN操做符不能同子查询一块儿使用,但BETWEEN操做符能够用在子查询中;

七、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查询的形式存在的数据表的成分,是一种虚拟的表;容许用户有如下的操做:

一、以用户或者某些类型的用户感受天然或者直观的方式来组织数据;

二、限制对数据的访问,从而使得用户仅可以看到或者修改他们须要的数据;

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

建立视图:

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的条目;

更新视图:

视图能够在特定的状况下更新:

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

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

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

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

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

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

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

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

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

十、视图必须包含原始数据表中全部的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];