1、SQL运行先后顺序
(8)SELECT (9)DISTINCT (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table> ``
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

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

SQL SERVER用法
SELECT TOP number|percent columns
FROM table_name

MySQL类似TOP语法
SELECT columns
FROM table_name LIMIT number

TOP主要用在对查询结果进行分页,这样可以减少显示的数据量,提高查询效率。
后面接数字则显示指定的条数,后面接百分数(例:50 PERCENT)则显示总体数据的百分比。一般与
ORDER BY结合使用。

3、DELETE
DELETE FROM table_name;
DELETE 就是将不需要的那些数据按给定的条件(WHERE)删除掉,如果想删除表中的所有数据就不需要带WHERE了。

4、LIKE

image

5、BETWEEN
BETWEEN运算符是包含性的:包括开始和结束值,等价于>= AND <=

请注意,BETWEEN AND在处理日期可能会有你意向不到的结果
SQL中 between and是包括边界值的,not between不包括边界值,不过如果使用between and 限定日期需要注意,如果and后的日期是到天的,那么默认为00:00:00 例如:and 后的日期为2018年09月28日,就等价于2018-09-28 00:00:00 ,那么2018-09-28 11:24:54.000的数据就查不到了,如果要查到2018-09-28这一整天的数据,那么在取值的时候需要加1天,即BETWEEN '2018-06-28' AND '2018-09-29',这样返回的就是6月28日(含)到9月28日(含)的所有数据了。

6、JOIN
• INNER JOIN:如果表中有至少一个匹配,则返回行
• LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
• RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
• FULL JOIN:只要其中一个表中存在匹配,则返回行

INNER JOIN关键字选择两个表中具有匹配值的记录。
image

LEFT JOIN 关键字返回左表(表1)中的所有行,即使在右表(表2)中没有匹配。如果在正确的表中没有匹配,结果是NULL。
image

RIGHT JOIN 关键字返回右表(table2)的所有行,即使在左表(table1)上没有匹配。如果左表没有匹配,则结果为NULL。
image
image

当左(表1)或右(表2)表记录匹配时,FULL OUTER JOIN关键字将返回所有记录。
image

7、UNION
使用前提:
UNION中的每个SELECT语句必须具有相同的列数
• 这些列也必须具有相似的数据类型
• 每个SELECT语句中的列也必须以相同的顺序排列

image

UNION结果集中的列名总是等于UNION中第一个SELECT语句中的列名。
UNION将只选择不同的值,即会排除重复数据只保留一个。使用UNION ALL选择重复值!

8、SELECT INTO
SELECT INTO 语句从一个表中复制数据,然后将数据插入到另一个新表中。

我们可以把所有的列都复制到新表中:
SELECT *
INTO newtable [IN externaldb]
FROM table1;
或者只复制希望的列插入到新表中:
SELECT column_name(s)
INTO newtable [IN externaldb]

提示:SELECT INTO 语句可以用于在另一种模式下创建一个新的空表,即只有表结构,没有数据。只需添加WHERE子句,使查询返回时没有数据:
SELECT *
INTO newtable
FROM table1
WHERE 1=0;
FROM table1;

INSERT INTO SELECT 语句从表中复制数据,并将数据插入现有的表中。目标表中的任何现有行都不会受到影响。
我们可以将所有列从一个表中复制到另一个已经存在的表中:
INSERT INTO table2
SELECT * FROM table1;
或者我们可以把想要的列复制到另一个现有的表中:
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;

9、CREATE
CREATE DATABASE database_name -- 创建数据库

CREATE TABLE table_name(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
); -- 创建表

在表上创建一个普通可以重复数据的索引
语法
CREATE INDEX index_name ON table_name(column_name)

在表上创建一个唯一(数据不重复)的索引,只需添加UNIQUE关键字即可
语法
CREATE UNIQUE INDEX index_name ON table_name(column_name)

在表上创建一个普通的联合索引
语法
CREATE INDEX index_name ON table_name(column_name1,column_name2)

10、AITER
ALTER TABLE table_name ADD column_name datatype; -- 在现有表添加新列

ALTER TABLE table_name DROP COLUMN column_name; -- 在现有表中删除列

ALTER COLUMN column_name datatype; -- 使用 ALTER TABLE 更改现有的数据表中列的数据类型

ALTER TABLE table_name ALTER COLUMN column_name datatype NOT NULL; -- 使用 ALTER TABLE 给某列添加 NOT NULL 约束

11、视图
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
注释:视图总是显示最新数据!每当用户查询视图时,数据库引擎就使用视图的 SQL 语句重新构建数据。

DROP VIEW view_name -- 删除视图

12、AS
如果别名包含空格,则需要双引号或方括号:
SELECT 姓名 AS Customer,城市 AS [City Name] FROM Customers;
需要注意的是ON和WHERE以及其他涉及条件筛选的地方,不能使用重命名后的名称,GROUP BY 也不行。
此外在进行重命名时AS是可以省略的。

13、HAVING
HAVING 子句对 GROUP BY 子句所产生的组施加条件
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

14、COUNT
COUNT(*) 函数返回表中的记录数
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目

15、日期函数
YEAR()
MONTH()
DAY()

DATEPART(dp,d)函数返回指定日期中相应的部分的整数值
datepart取值
年度 YEAR、YYYY、YY
SELECT DATEPART(YEAR,GETDATE()) -- 2019
月份 MONTH、MM、M
SELECT DATEPART(MONTH,GETDATE()) -- 2
日期 DAY、DD、D
SELECT DATEPART(DAY,GETDATE()) -- 14
周 WEEK、WK、WW
SELECT DATEPART(WEEK,GETDATE()) -- 7 (一年中的第7周)
每周星期几 WEEKDAY、DW
SELECT DATEPART(WEEKDAY,GETDATE()) -- 5 (是从星期日开始计算往后的第几天)
季度 QUARTER、QQ、Q
SELECT DATEPART(QUARTER,GETDATE()) -- 1
一年中第几天 DAYOFYEAR、DY、Y
SELECT DATEPART(DAYOFYEAR,GETDATE()) -- 45
小时 HOUR、HH
SELECT DATEPART(HOUR,GETDATE()) -- 23
分钟 MINUTE、MI、N
SELECT DATEPART(MINUTE,GETDATE()) -- 11
秒 SECOND、SS、SS
SELECT DATEPART(SECOND,GETDATE()) -- 45
毫秒 MILLISECOND、MS
SELECT DATEPART(MILLISECOND,GETDATE()) -- 120

DATENAME(dp,d)函数返回指定日期中相应的部分的字符串,用法与DATEPART类似。
SELECT DATENAME(MONTH,GETDATE()) -- 02

SELECT DATENAME(WEEKDAY,GETDATE()) -- 星期四

SELECT DATENAME(DAY,GETDATE()) -- 14

SELECT DATENAME(WEEK,GETDATE()) -- 7 一年中的第7周

SELECT DATENAME(DAYOFYEAR,GETDATE()) -- 45 一年中的第45天

DATEADD(dp,num,d)函数用于执行日期的加运算,返回指定日期值加上一个时间段后的新日期。dp指定日期中进行加法运算的部分值,
例如:YEARMONTH,DAY,HOUR,MINUTE,SECOND,MILLISECOND等,num指定与dp相加的值,如果该值为非整数值,将舍弃该值的小数部分,d为执行加法运算的日期。

dateadd (datepart,numer,date数据)
numer:用于与detepart相加的值。如果指定了非整数值,则将舍弃该值的小数部分。
date数据:一个用于解析为time、date、smalldatetime、datetime、datetime2、
或datetimeoffset值的表达式、列表达式、用户定义的变量或字符串文字。
datepart:时间部分

SELECT DATEADD(YEAR,2,GETDATE()) -- 2021-02-14 23:17:52.550 (年份往后增加2年)

SELECT DATEADD(MONTH,2,GETDATE()) -- 2019-04-14 23:17:52.550 (月份往后增加2个月)

SELECT DATEADD(DAY,2,GETDATE()) -- 2019-02-16 23:17:52.550 (日期往后增加2天)

SELECT DATEADD(YEAR,-2,GETDATE()) -- 2017-02-14 23:37:09.477 (年份往前减少2年)

SELECT DATEADD(MONTH,-2,GETDATE()) -- 2018-12-14 23:37:09.477 (月份往前减少2个月)

SELECT DATEADD(DAY,-2,GETDATE()) -- 2019-02-12 23:37:09.477 (日期往前减少2天)

datediff(datepart,startdate,enddate)
执行中将使用enddate减以startdate的值,如果startdate晚于enddate将返回负值。执行结果如果超出整数范围将提示错误。
SELECT DATEDIFF(YEAR,'2018-5-19','2019-2-14') -- 1

SELECT DATEDIFF(YEAR,'2020-5-19','2019-2-14') -- -1

SELECT DATEDIFF(MONTH,'2018-2-14','2019-8-11') -- 18

SELECT DATEDIFF(MONTH,'2020-2-14','2019-8-11') -- -6

16、常用字符处理函数
CHARINDEX(需要查找位置的子字符串,父字符串,从哪个位置开始找)
返回:被查找的子字符串在父字符串中的位置
从第一个位置查找‘SQL学习之路’中的‘路’字在哪个位置
示例:
SELECT CHARINDEX('路','SQL 学习之路',1) -- 7

PATINDEX(%需要查找的子字符串%,父字符串)
返回指定表达式中模式第一次出现的开始位置,子字符串可使用通配符%,而上面的CHARINDEX则不可以
SELECT PATINDEX('%数据%','SQL数据库开发') -- 4