当前位置: 澳门新濠3559 > 数据库 > 正文

本文适用SQL Server2008语法,可用于定义通配符(模

时间:2019-12-09 01:05来源:数据库
转载自:   Sql for Oracle基本操作关键字 最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用。 一、关系型数据库和SQL 实际上准

转载自: 

 Sql for Oracle基本操作关键字

最近从图书馆借了本介绍SQL的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用。

一、关系型数据库和SQL

实际上准确的讲,SQL是一门语言,而不是一个数据库。

什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的一种标准的计算机语言。

+SQL TOP子句

TOP 子句用于规定要返回的记录的数目

SELECT column_name(s) FROM table_name WHERE ROWNUM <= number

PS:本文适用SQL Server2008语法。

1.1 SQL语言主要有3个主要的组成部分。

  1. DML(Data Manipulation Language)数据操纵语言。这个模块可以让我们检索、修改、增加、删除数据库中的数据。
  2. DDL(Data Definition Language)数据定义语言。是的我们能够创建和修改数据库本身。如:DDL提供ALTER语句,他让我们可以修改数据库中表的设计。
  3. DCL(Data Control Language)数据控制语言,用于维护数据库的安全。

在SQL术语中,记录(record)和字段(field)实际上就称为行(row)和列(column)。

+SQL LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式

SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern

提示:"%" 可用于定义通配符(模式中缺少的字母)。

一、关系型数据库和SQL

实际上准确的讲,SQL是一门语言,而不是一个数据库。

什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的一种标准的计算机语言。

1.2 主键和外键

主键之所以有必要:

  • 首先使你唯一标识表中单独的一行。主键确保了唯一性。
  • 可以很容易的将一个表和另一个表关联。
  • 主键一般就会自动默认创建索引,提高了查询速度。

外键就是说A表中的某个字段,同时是B中的主键,那么这个字段就是A表中的外键。希望A表中的这个外键的值必须是B中已经存在的值。

+SQL 通配符

在搜索数据库中的数据时,SQL 通配符可以替代一个或多个字符。

SQL 通配符必须与 LIKE 运算符一起使用。

% 替代一个或多个字符

_ 仅替代一个字符

[charlist] 字符列中的任何单一字符

[^charlist]

本文适用SQL Server2008语法,可用于定义通配符(模式中缺少的字母)。或者

[!charlist] 不在字符列中的任何单一字符

1.1 SQL语言主要有3个主要的组成部分。

  1. DML(Data Manipulation Language)数据操纵语言。这个模块可以让我们检索、修改、增加、删除数据库中的数据。
  2. DDL(Data Definition Language)数据定义语言。是的我们能够创建和修改数据库本身。如:DDL提供ALTER语句,他让我们可以修改数据库中表的设计。
  3. DCL(Data Control Language)数据控制语言,用于维护数据库的安全。

在SQL术语中,记录(record)和字段(field)实际上就称为行(row)和列(column)。

1.3 数据类型

一般来讲,有3中重要的数据类型:

  1. 数字(Numeric)
  2. 字符(Character)
  3. 以及日期/时间(Date/Time)

bit是数字型,它只允许两个值,0和1。

字符类型区别^1):

类型 长度 说明
char 固定长度
nchar 固定长度 处理unicode数据类型(所有的字符使用两个字节表示)
varchar 可变长度 效率没char高 灵活
nvarchar 可变长度 处理unicode数据类型(所有的字符使用两个字节表示)
  • 1字节=8位
  • bit就是位,也叫比特位,是计算机表示数据最小的单位。
  • byte就是字节,1byte=8bit,1byte就是1B;
  • 澳门新濠3559 ,一个字符=2字节;

+SQL IN 操作符

IN 操作符允许我们在 WHERE 子句中规定多个值。

SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...)

1.2 主键和外键

主键之所以有必要:

  • 首先使你唯一标识表中单独的一行。主键确保了唯一性。
  • 可以很容易的将一个表和另一个表关联。
  • 主键一般就会自动默认创建索引,提高了查询速度。

外键就是说A表中的某个字段,同时是B中的主键,那么这个字段就是A表中的外键。希望A表中的这个外键的值必须是B中已经存在的值。

1.3 空值

空值不等于空格或空白。使用NULL表示空值。

+SQL BETWEEN 操作符

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2

1.3 数据类型

一般来讲,有3中重要的数据类型:

  1. 数字(Numeric)
  2. 字符(Character)
  3. 以及日期/时间(Date/Time)

bit是数字型,它只允许两个值,0和1。

字符类型区别[[1]](https://www.jianshu.com/p/0949203c63b8#fn1)

类型 长度
char 固定长度
nchar 固定长度
varchar 可变长度
nvarchar 可变长度
  • 1字节=8位
  • bit就是位,也叫比特位,是计算机表示数据最小的单位。
  • byte就是字节,1byte=8bit,1byte就是1B;
  • 一个字符=2字节;

二、简单增删改查

+SQL Alias(别名)

通过使用 SQL,可以为列名称和表名称指定别名(Alias)。

别名使查询程序更易阅读和书写。

SELECT column_name(s) FROM table_name AS alias_name(表)

SELECT column_name AS alias_name FROM table_name(列)

例:SELECT po.OrderID, p.LastName, p.FirstName

FROM Persons AS p, Product_Orders AS po

WHERE p.LastName='Adams' AND p.FirstName='John'

1.3 空值

空值不等于空格或空白。使用NULL表示空值。

2.1 查(列名有空格的情况)

1 SELECT [ last name]
2 FROM Customers

用方括号将有空格的列名括起来。
PS: MySql中用重音符`(~)按键。Oracle用双引号。

+SQL JOIN

用于根据两个或多个表中的列之间的关系,从这些表中查询数据

JOIN: 如果表中有至少一个匹配,则返回行

LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

FULL JOIN: 只要其中一个表中存在匹配,就返回行

INNER JOIN:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

注释:INNER JOIN 与 JOIN 是相同的。

注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。

注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

INNER JOIN Orders

ON Persons.Id_P = Orders.Id_P

ORDER BY Persons.LastName

 

SELECT column_name(s)

FROM table_name1

INNER JOIN table_name2

ON table_name1.column_name=table_name2.column_name

 

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

FULL JOIN Orders

ON Persons.Id_P=Orders.Id_P

ORDER BY Persons.LastName

二、简单增删改查

查询顺序,SQL执行顺序

1 Select -1>选择列,-2>distinct,-3>top
2   1>…From 表
3   2>…Where 条件
4   3>…Group by 列
5   4>…Having 筛选条件
6   6>…Order by 列

+SQL UNION 和 UNION ALL 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

UNION 内部的 SELECT 语句必须拥有相同数量的列

列也必须拥有相似的数据类型。

每条 SELECT 语句中的列的顺序必须相同。

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SELECT column_name(s) FROM table_name1

UNION ALL

SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

2.1 查(列名有空格的情况)

SELECT [ last name]
FROM Customers

用方括号将有空格的列名括起来。
PS: MySql中用重音符`(~)按键。Oracle用双引号。

2.2 增

1 INSERT INTO tablename
2 (columnlist)
3 VALUES
4 (RowValues1)
5 (RowValues2)
6 (repeat any number of times)

+SQL INTERSECT子句/操作符

由两个SELECT语句返回相同的行(唯一)

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]

INTERSECT

SELECT column1 [, column2 ] FROM table1 [, table2 ][WHERE condition]

查询顺序,SQL执行顺序[[2]](https://www.jianshu.com/p/0949203c63b8#fn2)

Select -1>选择列,-2>distinct,-3>top
  1>…From 表
  2>…Where 条件
  3>…Group by 列
  4>…Having 筛选条件
  6>…Order by 列

2.3 改

1 UPDATE  table
2 SET column1=expression1,column2=expression2(repeat any number of times)
3 WHERE condition

+SQL EXCEPT子句/操作符

合并两个SELECT语句,并从那些没有被第二个SELECT语句返回的第一个SELECT语句返回行

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]

EXCEPT

SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]

2.2 增

INSERT INTO tablename
(columnlist)
VALUES
(RowValues1)
(RowValues2)
(repeat any number of times)

2.4 删

1 DELETE
2 FROM table
3 WHERE condition

删除前可以验证一下:

1 SELECT 
2 COUNT(*)
3 FROM table
4 WHERE condition

如果想要删除所有的行,可以:

 1 DELETE FROM table 

或者

 1 TRUNCATE TABLE table 

TRUNCATE TABLE优势在于速度更快,但是不提供记录事务的结果。
另外一个不同点是,TRUNCATE TABLE重新设置了用于自增型的列的当前值,DELETE不会。

+SQL SELECT INTO 语句

可用于创建表的备份复件。

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。

SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

把所有的列插入新表:

SELECT * INTO new_table_name [IN externaldatabase] FROM old_tablename

把希望的列插入新表:

SELECT column_name(s) INTO new_table_name [IN externaldatabase] FROM old_tablename

2.3 改

UPDATE  table
SET column1=expression1,column2=expression2(repeat any number of times)
WHERE condition

三、别名

关键字:AS

+SQL 约束 (Constraints)

2.4 删

DELETE
FROM table
WHERE condition

删除前可以验证一下:

SELECT 
COUNT(*)
FROM table
WHERE condition

如果想要删除所有的行,可以:

DELETE FROM table

或者

TRUNCATE TABLE table

TRUNCATE TABLE优势在于速度更快,但是不提供记录事务的结果。
另外一个不同点是,TRUNCATE TABLE重新设置了用于自增型的列的当前值,DELETE不会。

3.1 计算字段

使用计算字段可以做如下的事情:

  • 选择特定的单词或者数值
  • 对单个或者多个列进行计算
  • 把列和直接量组合在一起。

NOT NULL:

ALTER TABLE CUSTOMERS MODIFY SALARY DECIMAL (18, 2) NOT NULL;

DEFAULT**:**

ALTER TABLE CUSTOMERS MODIFY SALARY DECIMAL (18, 2) DEFAULT 5000.00;

ALTER TABLE CUSTOMERS ALTER COLUMN SALARY DROP DEFAULT;

UNIQUE KEY**:**

ALTER TABLE CUSTOMERS MODIFY AGE INT NOT NULL UNIQUE;

ALTER TABLE CUSTOMERS DROP INDEX myUniqueConstraint;

PRIMARY KEY**:**

ALTER TABLE CUSTOMERS ADD CONSTRAINT PK_CUSTID PRIMARY KEY (ID, NAME);

ALTER TABLE CUSTOMERS DROP PRIMARY KEY ;

FOREIGN KEY**:**

ALTER TABLE ORDERS ADD FOREIGN KEY (Customer_ID) REFERENCES CUSTOMERS (ID);

ALTER TABLE ORDERS DROP FOREIGN KEY;

CHECK**:**

ALTER TABLE CUSTOMERS MODIFY AGE INT NOT NULL CHECK (AGE >= 18 );

ALTER TABLE CUSTOMERS DROP CONSTRAINT myCheckConstraint;

三、别名

关键字:AS

3.2 直接量

这个直接量和表中的数据没有任何关系,就是为了说明所用,下面这种类型的表达式就叫做直接量(literal value)。
澳门新濠3559 1

 1 SELECT '直接量' AS `类型`,firstname,lastname 2 FROM `customers` ; 

澳门新濠3559 2

如图,结果中直接量就在一列中了。

+索引

有助于加快SELECT和WHERE子句查询,但它会减慢数据输入,使用UPDATE和INSERT语句。索引可创建或删除,但对数据不会有影响。

3.1 计算字段

使用计算字段可以做如下的事情:

  • 选择特定的单词或者数值
  • 对单个或者多个列进行计算
  • 把列和直接量组合在一起。

3.3 算数运算

例子1:

 1 SELECT num*price AS total 2 FROM orders 

例子2:

1 SELECT  firstname+' '+lastname AS 'fullname'
2 FROM users

在MySql中连接要是用CONCAT函数:

1 SELECT OrderID,FirstName,LastName,
2 CONCAT(FirstName,' ',LastName) AS 'fullname'
3 FROM orders

+SQL CREATE INDEX 语句

单列索引

CREATE INDEX 语句用于在表中创建索引。

唯一索引

CREATE [UNIQUE] INDEX index_name ON table_name (column_name)

组合索引(如果有频繁使用WHERE子句作为过滤器中的两个或多个列,组合索引将是最好的选择。 )

CREATE INDEX index_name on table_name (column1, column2);

隐式索引

隐式索引是自动由数据库服务器创建对象时创建的索引。索引是主键约束和唯一性约束自动创建。

撤销索引

DROP INDEX index_name

避免使用索引:

索引不应该用在小型表上。

有频繁的,大批量更新或插入操作的表。

索引不应该用于对包含大量NULL值的列。

列经常操纵不应该被索引。

3.2 直接量

这个直接量和表中的数据没有任何关系,就是为了说明所用,下面这种类型的表达式就叫做直接量(literal value)。

澳门新濠3559 3

SELECT '直接量' AS `类型`,firstname,lastname 
FROM `customers` ;

澳门新濠3559 4

如图,结果中直接量就在一列中了。

3.4 别名

1)列的别名

 1 SELECT firstname AS fn 2 FROM customers 

2) 表的别名

 1 SELECT firstname 2 FROM customers AS cu 

说明:

  1. 列的别名是为了显示用的,别名会作为查询结果的表头,不能在WHERE中使用列的别名,会出错!!!
  2. 表的别名确实是为了方便操作用的,可以在WHERE中使用列的别名进行!

+SQL ALTER TABLE 语句

ALTER TABLE 语句用于在已有的表中添加、修改或删除列。

ALTER TABLE table_name ADD column_name datatype

ALTER TABLE table_name DROP COLUMN column_name

ALTER TABLE table_name ALTER COLUMN column_name datatype

+SQL truncate table**命令 (截断)**

用于删除现有表中完整的数据。

TRUNCATE TABLE table_name;

+SQL AUTO INCREMENT 字段

通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。

CREATE SEQUENCE seq_person MINVALUE 1 START WITH 1 INCREMENT BY 1 CACHE 10

INSERT INTO Persons (P_Id,FirstName,LastName) VALUES (seq_person.nextval,'Lars','Monsen')

+SQL VIEW**(视图)**

在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。

视图无非是存储在数据库中的相关名称的SQL语句。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition

注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

SQL DROP VIEW Syntax DROP VIEW view_name

+**事务**

就是对数据库执行的工作单元。事务是完成逻辑顺序的工作,无论是在手动方式由用户或者自动地通过某种数据库程序的序列的单元。

事务具有以下四个标准属性,通常由首字母缩写ACID简称:

3.3 算数运算

例子1:

SELECT  num*price AS total
FROM orders

例子2:

SELECT  firstname+' '+lastname AS 'fullname'
FROM users

在MySql中连接要是用CONCAT函数:

SELECT OrderID,FirstName,LastName,
CONCAT(FirstName,' ',LastName) AS 'fullname'
FROM orders

四、使用函数

函数要有一组圆括号跟在关键字后边,圆括号告诉我们,这是一个函数!

原子:确保工作单元中的所有操作都成功完成; 否则,该事务被中止的故障点,操作回到操作之前的状态。

3.4 别名

1)列的别名

SELECT firstname AS fn
FROM customers

2) 表的别名

SELECT firstname 
FROM customers AS cu

说明:

  1. 列的别名是为了显示用的,别名会作为查询结果的表头,不能在WHERE中使用列的别名,会出错!!!
  2. 表的别名确实是为了方便操作用的,可以在WHERE中使用列的别名进行!

4.1 字符函数

一致性:确保数据库正确后成功提交事务更改状态。

四、使用函数

函数要有一组圆括号跟在关键字后边,圆括号告诉我们,这是一个函数!

LEFT&RIGHT

LEFT(CharacterValue,NumberOfCharacters)
含义:选择CharacterValue字段的左边NumberOfCharacters几个字符。
ps:RIGHT是右边几个字符。

隔离:事务操作彼此独立和透明。

4.1 字符函数

LTRIM&RTRIM

LTRIM(CharacterValue)
可以删除左边开始的空格。RTRIM作用类似。

持久性:可确保提交的事务的结果或仍然存在系统故障的情况下的作用。

COMMIT:保存更改。COMMIT;

ROLLBACK:回滚更改。ROLLBACK;

SAVEPOINT:回滚事务组创建点

SAVEPOINT SAVEPOINT_NAME;

ROLLBACK TO SAVEPOINT_NAME;

RELEASE SAVEPOINT SAVEPOINT_NAME;

SET TRANSACTION:事务放置的名称。

SET TRANSACTION [ READ WRITE | READ ONLY ];

LEFT&RIGHT

LEFT(CharacterValue,NumberOfCharacters)
含义:选择CharacterValue字段的左边NumberOfCharacters几个字符。
ps:RIGHT是右边几个字符。

SUBSTRING

SUBSTRING(CharacterValue,StartPositon,NumberOfCharacters)
含义:选择从开始位置(包括),N个长度的字符。

1 SELECT 
2 SUBSTRING('thewhitegoat',4,5) AS 'The Answer'

返回:white

LTRIM&RTRIM

LTRIM(CharacterValue)
可以删除左边开始的空格。RTRIM作用类似。

4.2 日期/时间函数

SUBSTRING

SUBSTRING(CharacterValue,StartPositon,NumberOfCharacters)
含义:选择从开始位置(包括),N个长度的字符。

SELECT 
SUBSTRING('thewhitegoat',4,5) AS 'The Answer'

返回:white

GETDATE

 1 DATEPART(datepart,DateValue) 

datepart可以是许多不同的值,如下都是有效值:

  • year
  • quarter
  • month
  • dayofyear
  • day
  • week
  • weekday
  • hour
  • minute
  • second

4.2 日期/时间函数

DATEDIFF

可以让我们得到任意两个日期之间相差的天数(或周数、月数等)。

 1 DATEDIFF(datepart1,startdate1,startdate2) 

 

DATEDIFF Function Expression Resulting Value
DATEDIFF(day,’7/8/2009’,’8/14/2009’) 37
DATEDIFF(week,’7/8/2009’,’8/14/2009’) 5
DATEDIFF(month,’7/8/2009’,’8/14/2009’) 1
DATEDIFF(year,’7/8/2009’,’8/14/2009’) 0

PS:MySql中,DATEDIFF函数只允许我们计算两个日期之间的天数,如果想要得到一个正数,结束的日期通常要作为第一个参数:

 1 DATEDIFF(enddate,startdate) 

Oracle中没有等价函数

GETDATE

SELECT GETDATE()

返回当前日期和时间。
PS:在MySql中,等价函数是NOW,在Oracle中是CURRENT_DATE

4.3 数值函数

DATEPART

能够分析具体的日期,并且返回诸如该日期是该月中的第几天,或者该年份中的第几周等信息。

DATEPART(datepart,DateValue)

datepart可以是许多不同的值,如下都是有效值:

  • year
  • quarter
  • month
  • dayofyear
  • day
  • week
  • weekday
  • hour
  • minute
  • second

ROUND

允许我们四舍五入。

 1 ROUND(numericvalue,decimalpalaces) 

DATEDIFF

可以让我们得到任意两个日期之间相差的天数(或周数、月数等)。

DATEDIFF(datepart1,startdate1,startdate2)
DATEDIFF Function Expression Resulting Value
DATEDIFF(day,'7/8/2009','8/14/2009') 37
DATEDIFF(week,'7/8/2009','8/14/2009') 5
DATEDIFF(month,'7/8/2009','8/14/2009') 1
DATEDIFF(year,'7/8/2009','8/14/2009') 0

PS:MySql中,DATEDIFF函数只允许我们计算两个日期之间的天数,如果想要得到一个正数,结束的日期通常要作为第一个参数:

DATEDIFF(enddate,startdate)

Oracle中没有等价函数

RAND

用来产生随机数

 1 RAND([seed]) 

没有参数时,它会返回0-1之间的一个随机数。

 1 SELECT RAND() AS 'Random Value' 

可选参数seed有的情况下,每次将返回相同的值。这让我想起了Python中的Random包。看来很多时候,一些东西是共通的啊。

4.3 数值函数

PI

PI()函数
如果想要对它保留两位小数,可以通过复合函数进行:

 1 SELECT ROUND(PI(),2) 

将会返回:3.14

ROUND

允许我们四舍五入。

ROUND(numericvalue,decimalpalaces)

4.4 转换函数

RAND

用来产生随机数

RAND([seed])

没有参数时,它会返回0-1之间的一个随机数。

SELECT RAND() AS 'Random Value'

可选参数seed有的情况下,每次将返回相同的值。这让我想起了Python中的Random包。看来很多时候,一些东西是共通的啊。

CAST函数

允许我们把数据从一种类型转换成另一种类型。

 1 CAST(expression AS DateType) 

例子:

1 SELECT 
2 '2009-04-11' AS 'Original Date',
3 CAST('2009--04-11' AS DATETIME) AS 'Converted Date'

PI

PI()函数
如果想要对它保留两位小数,可以通过复合函数进行:

SELECT ROUND(PI(),2)

将会返回:3.14

ISNULL函数,很有用

可以把NULL值转换成一个有意义的值。

1 SELECT Description,
2 ISNULL(Color,'Unknown') AS 'Color'
3 FROM Products

4.4 转换函数

五、排序函数

CAST函数

允许我们把数据从一种类型转换成另一种类型。

CAST(expression AS DateType)

例子:

SELECT 
'2009-04-11' AS 'Original Date',
CAST('2009--04-11' AS DATETIME) AS 'Converted Date'

5.1 添加排序

 1 SELECT columnlist 2 FROM tablelist 3 ORDER BY columnlist 

默认是升序,ASC,因此,上面等价于:

 1 SELECT columnlist 2 FROM tablelist 3 ORDER BY columnlist ASC 

ISNULL函数,很有用

可以把NULL值转换成一个有意义的值。

SELECT Description,
ISNULL(Color,'Unknown') AS 'Color'
FROM Products

5.2 降序

使用DESC关键字:

 1 SELECT columnlist 2 FROM tablelist 3 ORDER BY columnlist DESC 

五、排序函数

5.3 根据多列

1 SELECT 
2 FirstName,
3 LastName
4 FROM Customers
5 ORDER BY LastName, FirstName

注意:列的顺序很重要,首先按照LastName排序,然后按照FirstName排序。

5.1 添加排序

SELECT columnlist
FROM tablelist
ORDER BY columnlist

默认是升序,ASC,因此,上面等价于:

SELECT columnlist
FROM tablelist
ORDER BY columnlist ASC

5.4 根据计算字段

1 SELECT LastName+','+FirstName AS 'Name'
2 FROM Customers
3 ORDER BY Name

因此,从这儿可以知道,列别名不可以用在WHERE中,但可以用在ORDER BY中。
例子

1 SELECT FirstName,LastName
2 FROM Customers
3 ORDER BY LastName+FirstName AS 'Name'

5.2 降序

使用DESC关键字:

SELECT columnlist
FROM tablelist
ORDER BY columnlist DESC

5.5 排序补充内容

当数据升序时,出现顺序是如下:

NULL->数字->字符
注意:此时,该列中的数字其实是按照字符来算的,因此,升序时,23也是排在5之前的。

5.3 根据多列

SELECT 
FirstName,
LastName
FROM Customers
ORDER BY LastName, FirstName

注意:列的顺序很重要,首先按照LastName排序,然后按照FirstName排序。

六、基于列的逻辑-CASE

5.4 根据计算字段

SELECT LastName+','+FirstName AS 'Name'
FROM Customers
ORDER BY Name

因此,从这儿可以知道,列别名不可以用在WHERE中,但可以用在ORDER BY中。
例子

SELECT FirstName,LastName
FROM Customers
ORDER BY LastName+FirstName AS 'Name'

6.1 IF-THEN-ELSE逻辑

包含列和CASE表达式的SELECT语句,大概如下:

1 SELECT 
2 column1,
3 column2,
4 CaseExpression
5 FROM table

5.5 排序补充内容

当数据升序时,出现顺序是如下:

NULL->数字->字符
注意:此时,该列中的数字其实是按照字符来算的,因此,升序时,23也是排在5之前的。

6.2 CASE-简单格式

1 SELECT 
2 CASE ColumnOrExpression
3 WHEN value1 THEN result1
4 WHEN value2 THEN result2
5 (repeat WHEN-THEN any number of times)
6 [ELSE  DefaultResult]
7 END

CASE表达式对于把不好理解的值转换成有意义的描述是很有用的。

1 SELECT 
2 CASE CategoryCode
3 WHEN 'F' THEN 'Fruit'
4 WHEN 'V' THEN 'Vegetable'
5 ELSE 'other'
6 END AS 'Category',
7 ProductDescription As 'Description'
8 FROM Products

六、基于列的逻辑-CASE

6.3 CASE-查询格式

1 SELECT 
2 CASE 
3 WHEN condition1 THEN result1
4 WHEN condition2 THEN result2
5 (repeat WHEN-THEN any number of times)
6 [ELSE  DefaultResult]
7 END

这种格式允许在关键字WHEN后边放置较为复杂的条件表达式。

相关问题:

  • StackOverFlow-SQL Server: CASE WHEN OR THEN ELSE END => the OR is not supported

6.1 IF-THEN-ELSE逻辑

包含列和CASE表达式的SELECT语句,大概如下:

SELECT 
column1,
column2,
CaseExpression
FROM table

七、基于行的逻辑

6.2 CASE-简单格式

SELECT 
CASE ColumnOrExpression
WHEN value1 THEN result1
WHEN value2 THEN result2
(repeat WHEN-THEN any number of times)
[ELSE  DefaultResult]
END

CASE表达式对于把不好理解的值转换成有意义的描述是很有用的。

SELECT 
CASE CategoryCode
WHEN 'F' THEN 'Fruit'
WHEN 'V' THEN 'Vegetable'
ELSE 'other'
END AS 'Category',
ProductDescription As 'Description'
FROM Products

7.1 应用查询条件

终于派到WHERE出场了,注意写法顺序,再写一遍:

1 Select -1>选择列,-2>distinct,-3>top
2   1>…From 表
3   2>…Where 条件
4   3>…Group by 列
5   4>…Having 筛选条件
6   6>…Order by 列

6.3 CASE-查询格式

SELECT 
CASE 
WHEN condition1 THEN result1
WHEN condition2 THEN result2
(repeat WHEN-THEN any number of times)
[ELSE  DefaultResult]
END

这种格式允许在关键字WHEN后边放置较为复杂的条件表达式。

相关问题:

  • StackOverFlow-SQL Server: CASE WHEN OR THEN ELSE END => the OR is not supported

7.2 限制行-TOP

 1 SELECT 2 TOP Number 3 Columnlist 4 FROM table 

七、基于行的逻辑

7.3 TOP和ORDER BY结合

关键字TOP的另一个用途是,把它和ORDER BY子句结合起来,基于特定分类,得到带有最大值的一定数量的行。

假设你想看到Shakespeare所著的销量最多的书。

SELECT 
TOP1
Title AS 'Book Title',
CurrentMonthSales AS 'Quantuty Sold'
FROM Books
WHERE Author='Shakespeare'
ORDER BY CurrentMonthSales DESC

 

ps: 学会利用google搜索,例如,我想要知道oracle中类似top作用的关键字是什么,可以:

澳门新濠3559 5

7.1 应用查询条件

终于派到WHERE出场了,注意写法顺序,再写一遍:

Select -1>选择列,-2>distinct,-3>top
  1>…From 表
  2>…Where 条件
  3>…Group by 列
  4>…Having 筛选条件
  6>…Order by 列

八、布尔逻辑

关键字:AND/OR/NOT/BETWEEN/IN/IS/NULL

7.2 限制行-TOP

SELECT 
TOP Number 
Columnlist
FROM table

8.1 OR

OR子句意味着,如果确定任意条件为真,那么就该选中该行。

1 SELECT userid,name,phone
2 FROM users
3 WHERE age<18
4 OR age>60

7.3 TOP和ORDER BY结合

关键字TOP的另一个用途是,把它和ORDER BY子句结合起来,基于特定分类,得到带有最大值的一定数量的行。

假设你想看到Shakespeare所著的销量最多的书。

SELECT 
TOP1
Title AS 'Book Title',
CurrentMonthSales AS 'Quantuty Sold'
FROM Books
WHERE Author='Shakespeare'
ORDER BY CurrentMonthSales DESC

ps: 学会利用google搜索,例如,我想要知道oracle中类似top作用的关键字是什么,可以:

澳门新濠3559 6

8.2 使用圆括号

1 SELECT CustomerName,
2 Sate,
3 QuantityPurchased
4 FROM Orders
5 WHERE State ='IL'
6 OR State='CA'
7 AND QuantityPurchased>8

本来想要的结果是对来自IL或者CA的客户,同时,只看数量大于8的订单。但是上面执行的结果不是这样的,因为,SQL总是会先处理AND操作符!!!然后才会处理OR操作符。所以,上述语句中,先看到AND并执行如下的条件

 1 State= 'CA' 2 AND QuantityPurchased>8 

因此,要用括号来规定顺序:

1 SELECT CustomerName,
2 Sate,
3 QuantityPurchased
4 FROM Orders
5 WHERE (State ='IL'
6 OR State='CA')
7 AND QuantityPurchased>8

八、布尔逻辑

关键字:AND/OR/NOT/BETWEEN/IN/IS/NULL

8.3 NOT操作符

NOT操作符表示对后边的内容否定或者取反。

1 SELECT CustomerName,State
2 FROM Orders
3 WHERE NOT (State='IL' OR Sate='NY')

这个其实可以用AND改写的!!!
NOT操作符在逻辑上不是必须的。

8.1 OR

OR子句意味着,如果确定任意条件为真,那么就该选中该行。

SELECT userid,name,phone
FROM users
WHERE age<18
OR age>60

8.4 BETWEEN操作符

1 SELECT CustomerName,
2 Sate,
3 QuantityPurchased
4 FROM Orders
5 WHERE QuantityPurchased BETWEEN 8 AND 10

8.2 使用圆括号

SELECT CustomerName,
Sate,
QuantityPurchased
FROM Orders
WHERE State ='IL'
OR State='CA'
AND QuantityPurchased>8

本来想要的结果是对来自IL或者CA的客户,同时,只看数量大于8的订单。但是上面执行的结果不是这样的,因为,SQL总是会先处理AND操作符!!!然后才会处理OR操作符。所以,上述语句中,先看到AND并执行如下的条件

State= 'CA'
AND QuantityPurchased>8

因此,要用括号来规定顺序:

SELECT CustomerName,
Sate,
QuantityPurchased
FROM Orders
WHERE (State ='IL'
OR State='CA')
AND QuantityPurchased>8

8.5 IN操作符

假设你想看到IL或者NY的行:

1 SELECT *
2 FROM Orders
3 WHERE State='IL'
4 OR State='CA'

可以改写成:

1 SELECT *
2 FROM Orders
3 WHERE State IN ('IL','CA')

8.3 NOT操作符

NOT操作符表示对后边的内容否定或者取反。

SELECT CustomerName,State
FROM Orders
WHERE NOT (State='IL' OR Sate='NY')

这个其实可以用AND改写的!!!
NOT操作符在逻辑上不是必须的。

8.9 布尔逻辑-IS NULL

为了将某字段NULL值的行或0的行包括进来:

1 SELECT *
2 FROM Products
3 WHERE weight=0
4 OR weight IS NULL

或者

1 SELECT *
2 FROM Products
3 WHERE ISNULL(weight,0)=0

8.4 BETWEEN操作符

SELECT CustomerName,
Sate,
QuantityPurchased
FROM Orders
WHERE QuantityPurchased BETWEEN 8 AND 10

九、模糊匹配

8.5 IN操作符

假设你想看到IL或者NY的行:

SELECT *
FROM Orders
WHERE State='IL'
OR State='CA'

可以改写成:

SELECT *
FROM Orders
WHERE State IN ('IL','CA')

9.1 LIKE和%搭配

%通配符可以表示任意的字符,它可以表示0个,1个,任意多个字符。

8.9 布尔逻辑-IS NULL

为了将某字段NULL值的行或0的行包括进来:

SELECT *
FROM Products
WHERE weight=0
OR weight IS NULL

或者

SELECT *
FROM Products
WHERE ISNULL(weight,0)=0

9.2 通配符

除了%以外,还有下划线(_)、方括号起来的characterlist,以及用方括号括起来的脱字符号(^)加上characterlist。

  • 下划线表示一个字符
  • [characterlist]表示括号中字符的任意一个
  • [^characterlist]表示不能是括号中字符的任意一个
    例子:

    1 SELECT 2 FirstName, 3 LastName 4 FROM Actors 5 WHERE FirstName LIKE '[CM]ARY'

检索以C或者M开头并以ARY结尾的所有行。

九、模糊匹配

9.3 按照读音匹配

SOUNDEX和DIFFERENCE

9.1 LIKE和%搭配

%通配符可以表示任意的字符,它可以表示0个,1个,任意多个字符。

十、汇总数据

9.2 通配符

除了%以外,还有下划线(_)、方括号起来的characterlist,以及用方括号括起来的脱字符号(^)加上characterlist。

  • 下划线表示一个字符
  • [characterlist]表示括号中字符的任意一个
  • [^characterlist]表示不能是括号中字符的任意一个
    例子:
SELECT 
FirstName,
LastName
FROM Actors
WHERE FirstName LIKE '[CM]ARY'

检索以C或者M开头并以ARY结尾的所有行。

10.1消除重复

使用DISTINCT

 1 SELECT DISTINCE name,age 2 FROM users 

如果age不同,即使name相同,那么这一行就不会被删除重复。

9.3 按照读音匹配

SOUNDEX和DIFFERENCE

10.2 聚合函数

COUNTSUMAVGMINMAX,他们提供了对分组数据进行计数、求和、取平均值、取最小值和最大值等方法。

1 SELECT 
2 AVG(Grade) AS 'Average Quiz Score'
3 MIN(Grade) AS 'Minimum Quiz Score'
4 FROM Grades
5 WHERE GradeType='Quiz'

十、汇总数据

COUNT函数可以有3中不同方式使用它。

1.COUNT函数可以用来返回所有选中行的数目,而不管任何特定列的值。
例如:下面语句返回GradeType为’HomeWork’的所有行的数目:

1 SELECT 
2 COUNT(*) AS 'Count of Homework Rows'
3 FROM Grades
4 WHERE GradeType='HomeWork'

这种方式,会计数所有行的个数,即使其中有*NULL**。

2.第二种方式指定具体的列

1 SELECT 
2 COUNT(Grades) AS 'Count of Homework Rows'
3 FROM Grades
4 WHERE GradeType='HomeWork'

第一种方式返回3,这一种方式返回2,为什么???因为,这种方式要满足Grades这一列有值,NULL值的行不会计数。

3.使用关键字DISTINCT。

1 SELECT 
2 COUNT(DISTINCT FeeType) AS 'Number of Fee Types'
3 FROM Fees

这条语句计数了FeeType列唯一值的个数。

10.1消除重复

使用DISTINCT

SELECT DISTINCE name,age
FROM users

如果age不同,即使name相同,那么这一行就不会被删除重复。

10.3 分组数据-GROUP BY

1 SELECT
2 GradeType AS 'Grade Type',
3 AVG(Grade)AS 'Average Grade'
4 FROM Grades
5 GROUP BY GradeType
6 ORDER BY GradeType

感觉像EXCEL中的分类汇总功能。
如果想把Grade为NULL值的当做0,那么可以用:

1 SELECT
2 GradeType AS 'Grade Type',
3 AVG(ISNULL(Grade,0))AS 'Average Grade'
4 FROM Grades
5 GROUP BY GradeType
6 ORDER BY GradeType
  • GROUP BY子句中的列的顺序是没有意义的;
  • ORDER BY子句中的列的顺序是有意义的。

10.2 聚合函数

COUNTSUMAVGMINMAX,他们提供了对分组数据进行计数、求和、取平均值、取最小值和最大值等方法。

SELECT 
AVG(Grade) AS 'Average Quiz Score'
MIN(Grade) AS 'Minimum Quiz Score'
FROM Grades
WHERE GradeType='Quiz'

10.4 基于聚合查询条件-HAVING

当针对带GROUP BY的一条SELECT语句应用任何查询条件时,人们必须要问查询条件是应用于单独的行还是整个组。

实际上,WHERE子句是单独的执行查询条件。SQL提供了一个名为HAVING的关键字,它允许对组级别使用查询条件。
例子:
查看选修了类型为选修“A”,平均成绩在70分以上的学生姓名,平均成绩。

1 SELECT 
2 Name,
3 AVG(ISNULL(Grades,0)) AS 'Average Grades'
4 FROM Grades
5 WHERE GradeType='A'
6 GROUP BY Name
7 HAVING AVG(ISNULL(Grades,0))>70
8 ORDER BY Name

修要修类型为A,那么,这是这对行的查询,因此这里要用WHERE。
但是,还要筛选平均成绩,那么,这是一个平均值,建立在聚合函数上的,并不是单独的行,这就需要用到关键字HAVING。需要先将Student分组,然后把查询结果应用到基于全组的一个聚合统计上。

WHERE只保证我们选择了GradeType是A的行,HAVING保证平均成绩至少70分以上。

注意:如果想要在结果中添加GradeType的值,如果直接在SELECT后边添加这个列,将会出错。这是因为,所有列都必须要么出现在GROUP BY中,要么包含在一个聚合函数中。

1 SELECT 
2 Name,
3 GradeType,
4 AVG(ISNULL(Grades,0)) AS 'Average Grades'
5 FROM Grades
6 WHERE GradeType='A'
7 GROUP BY Name,GradeType
8 HAVING AVG(ISNULL(Grades,0))>70
9 ORDER BY Name

COUNT函数可以有3中不同方式使用它。

1.COUNT函数可以用来返回所有选中行的数目,而不管任何特定列的值。
例如:下面语句返回GradeType为'HomeWork'的所有行的数目:

SELECT 
COUNT(*) AS 'Count of Homework Rows'
FROM Grades
WHERE GradeType='HomeWork'

这种方式,会计数所有行的个数,即使其中有NULL*。

2.第二种方式指定具体的列

SELECT 
COUNT(Grades) AS 'Count of Homework Rows'
FROM Grades
WHERE GradeType='HomeWork'

第一种方式返回3,这一种方式返回2,为什么???因为,这种方式要满足Grades这一列有值,NULL值的行不会计数。

3.使用关键字DISTINCT。

SELECT 
COUNT(DISTINCT FeeType) AS 'Number of Fee Types'
FROM Fees

这条语句计数了FeeType列唯一值的个数。

十一、组合表

10.3 分组数据-GROUP BY

SELECT
GradeType AS 'Grade Type',
AVG(Grade)AS 'Average Grade'
FROM Grades
GROUP BY GradeType
ORDER BY GradeType

感觉像EXCEL中的分类汇总功能。
如果想把Grade为NULL值的当做0,那么可以用:

SELECT
GradeType AS 'Grade Type',
AVG(ISNULL(Grade,0))AS 'Average Grade'
FROM Grades
GROUP BY GradeType
ORDER BY GradeType
  • GROUP BY子句中的列的顺序是没有意义的;
  • ORDER BY子句中的列的顺序是有意义的。

11.1 内连接来组合表-Inner Join

通过书中的描述,我感觉内连接更像是用来将主键表、外键表连接起来的工具。
例如:
A表:

userid name age
1 michael 26
2 hhh 25
3 xiang 20

B表:

orderid userid num price
1 1 2 3
2 2 6 6
3 1 5 5

如上表格,那么要连接这两个表格,查询订单1的客户姓名,年龄,订单号:
方式一:

1 SELECT name,age,orderid
2 FROM A,B
3 WHERE A.userid=B.userid
4 AND orderid=1

方式二,使用现在的内连接实现:

1 SELECT name,age,orderid
2 FROM A
3 INNER JOIN B
4 ON A.userid=B.userid
5 AND orderid=1

ON关键字指定两个表如何准确的连接。

内连接中表的顺序:FROM 子句指定了A表,INNER JOIN 子句指定B表,我们调换A,B顺序,所得到的结果相同的!只是显示列的顺序可能会不同而已。

不建议使用方式一的格式。关键字INNER JOIN ON的优点在于显示地表示了连接的逻辑,那是它们唯一的用途。WEHERE的含义不够明显。因为它是条件的意思啊,不是连接的!

10.4 基于聚合查询条件-HAVING

当针对带GROUP BY的一条SELECT语句应用任何查询条件时,人们必须要问查询条件是应用于单独的行还是整个组。

实际上,WHERE子句是单独的执行查询条件。SQL提供了一个名为HAVING的关键字,它允许对组级别使用查询条件。
例子:
查看选修了类型为选修“A”,平均成绩在70分以上的学生姓名,平均成绩。

SELECT 
Name,
AVG(ISNULL(Grades,0)) AS 'Average Grades'
FROM Grades
WHERE GradeType='A'
GROUP BY Name
HAVING AVG(ISNULL(Grades,0))>70
ORDER BY Name

修要修类型为A,那么,这是这对行的查询,因此这里要用WHERE。
但是,还要筛选平均成绩,那么,这是一个平均值,建立在聚合函数上的,并不是单独的行,这就需要用到关键字HAVING。需要先将Student分组,然后把查询结果应用到基于全组的一个聚合统计上。

WHERE只保证我们选择了GradeType是A的行,HAVING保证平均成绩至少70分以上。

注意:如果想要在结果中添加GradeType的值,如果直接在SELECT后边添加这个列,将会出错。这是因为,所有列都必须要么出现在GROUP BY中,要么包含在一个聚合函数中。

SELECT 
Name,
GradeType,
AVG(ISNULL(Grades,0)) AS 'Average Grades'
FROM Grades
WHERE GradeType='A'
GROUP BY Name,GradeType
HAVING AVG(ISNULL(Grades,0))>70
ORDER BY Name

11.2 外连接

外连接分为左连接(LEFT OUTER JOIN)、右连接(RIGHT OUTER JOIN)、全连接(FULL OUTER JOIN)。

OUTER是可以省略的。

十一、组合表

左连接(LEFT JOIN)

1 SELECT name,age,orderid
2 FROM A
3 LEFT JOIN B
4 ON A.userid=B.userid
5 AND orderid=1

外连接的强大之处在于,主表中的数据必然都会保留,从表中列没有值的情况,用NULL补充。

LEFT JOIN 左边的表为主表,右边的表为从表。

11.1 内连接来组合表-Inner Join

userid name age
1 michael 26
2 hhh 25
3 xiang 20

通过书中的描述,我感觉内连接更像是用来将主键表、外键表连接起来的工具。
例如:
A表:

userid name age
1 michael 26
2 hhh 25
3 xiang 20
orderid userid num price
1 1 2 3
2 2 6 6
3 1 5 5

B表:

orderid userid num price
1 1 2 3
2 2 6 6
3 1 5 5

如上表格,那么要连接这两个表格,查询订单1的客户姓名,年龄,订单号:
方式一:

SELECT name,age,orderid
FROM A,B
WHERE A.userid=B.userid
AND orderid=1

方式二,使用现在的内连接实现:

SELECT name,age,orderid
FROM A
INNER JOIN B
ON A.userid=B.userid
AND orderid=1

ON关键字指定两个表如何准确的连接。

内连接中表的顺序:FROM 子句指定了A表,INNER JOIN 子句指定B表,我们调换A,B顺序,所得到的结果相同的!只是显示列的顺序可能会不同而已。

不建议使用方式一的格式。关键字INNER JOIN ON的优点在于显示地表示了连接的逻辑,那是它们唯一的用途。WEHERE的含义不够明显。因为它是条件的意思啊,不是连接的!

11.3 自连接

自连接必然用到表的别名。

1 SELECT A.name,B.name as ManagerName
2 FROM worker as A
3 LEFT JOIN worker as B
4 ON A.managerid=B.id

11.2 外连接

外连接分为左连接(LEFT OUTER JOIN)、右连接(RIGHT OUTER JOIN)、全连接(FULL OUTER JOIN)。

OUTER是可以省略的。

11.4 创建视图

 1 CREATE VIEW ViewName AS 2 SelectStatement 3 [WITH CHECK OPTION] 

视图中不能包含ORDER BY子句。

[WITH CHECK OPTION]表示对视图进行UPDATE,INSERT,DELETE操作时任然保证了视图定义时的条件表达式。

删除视图:

 1 DROP VIEW ViewName 

修改视图:

 1 ALTER VIEW ViewName AS 2 SelectStatement 

左连接(LEFT JOIN)

SELECT name,age,orderid
FROM A
LEFT JOIN B
ON A.userid=B.userid
AND orderid=1

外连接的强大之处在于,主表中的数据必然都会保留,从表中列没有值的情况,用NULL补充。

LEFT JOIN 左边的表为主表,右边的表为从表。

视图的优点

  1. 简化用户的操作
  2. 使用户以多角度看待同一数据
  3. 对重构数据库提供了一定程度的逻辑独立性
  4. 对机密数据提供安全保护

11.3 自连接

自连接必然用到表的别名。

SELECT A.name,B.name as ManagerName
FROM worker as A
LEFT JOIN worker as B
ON A.managerid=B.id

十二、补充

11.4 创建视图

CREATE VIEW ViewName AS
SelectStatement
[WITH CHECK OPTION]

视图中不能包含ORDER BY子句。

[WITH CHECK OPTION]表示对视图进行UPDATE,INSERT,DELETE操作时任然保证了视图定义时的条件表达式。

删除视图:

DROP VIEW ViewName

修改视图:

ALTER VIEW ViewName AS
SelectStatement

12.1 子查询

可以用3种主要的方式来指定子查询,总结如下:

  • 当子查询是tablelist的一部分时,它指定了一个数据源。
  • 当子查询是condition的一部分时,它成为查询条件的一部分。
  • 当子查询是columnlist的一部分时,它创建了一个单个的计算的列。

视图的优点

  1. 简化用户的操作
  2. 使用户以多角度看待同一数据
  3. 对重构数据库提供了一定程度的逻辑独立性
  4. 对机密数据提供安全保护

12.2 索引

索引是一种物理结构,可以为数据库表中任意的列添加索引。

索引的目的是,当SQL语句中包含该列的是偶,可以加速数据的检索。

索引的缺点是,在数据库中,索引需要更多的存储硬盘。另一个负面因素是,索引通常会降低相关的列数据更新速度。这是因为,任何时候插入或者修改一行记录时,索引都必须重新计算该列中的值的正确的排列顺序。

可以对任意的列进行索引,但是只能指定一个列作为主键。指定一个列作为主键意味着两件事情:首先这个列成为了索引,其次保证这列包含唯一的值。

 1 CREATE INDEX Index2 2 ON MyTable (ColumnFour) 

删除一个索引:

 1 DROP INDX Index2 2 ON MyTable 

十二、补充

参考:

  • SQL总结(一)基本查询
  • SQL Server 常用高级语法笔记
  • 史上最全的SQL Server复习笔记一

2018-03-09    21:26:41

12.1 子查询

可以用3种主要的方式来指定子查询,总结如下:

  • 当子查询是tablelist的一部分时,它指定了一个数据源。
  • 当子查询是condition的一部分时,它成为查询条件的一部分。
  • 当子查询是columnlist的一部分时,它创建了一个单个的计算的列。

12.2 索引

索引是一种物理结构,可以为数据库表中任意的列添加索引。

索引的目的是,当SQL语句中包含该列的是偶,可以加速数据的检索。

索引的缺点是,在数据库中,索引需要更多的存储硬盘。另一个负面因素是,索引通常会降低相关的列数据更新速度。这是因为,任何时候插入或者修改一行记录时,索引都必须重新计算该列中的值的正确的排列顺序。

可以对任意的列进行索引,但是只能指定一个列作为主键。指定一个列作为主键意味着两件事情:首先这个列成为了索引,其次保证这列包含唯一的值。

CREATE INDEX Index2
ON MyTable (ColumnFour)

删除一个索引:

DROP INDX Index2
ON MyTable

参考:

  • SQL总结(一)基本查询
  • SQL Server 常用高级语法笔记
  • 史上最全的SQL Server复习笔记一

  1. varchar和Nvarchar区别 ↩

  2. SQL总结(一)基本查询 ↩

编辑:数据库 本文来源:本文适用SQL Server2008语法,可用于定义通配符(模

关键词: