创建表
语法

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

    列级完整性约束条件有NULL[可为空]、NOT NULL[不为空]、UNIQUE[唯一],可以组合使用,但是不能重复和对立关系同时存在。

示例

-- 创建用户表
CREATE TABLE User
(
  Id INT NOT NULL UNIQUE PRIMARY KEY,
  Name VARCHAR(50) NOT NULL,
  Age INT NULL,
  Gender VARCHAR(8) NULL
);

删除表
语法

DROP TABLE <表名>;

示例

-- 删除用户表
DROP TABLE User;

清空表
语法

TRUNCATE TABLE <表名>;

示例

-- 删除用户表
TRUNCATE TABLE User;

修改表
语法

-- 添加列
ALTER TABLE <表名> [ADD <新列名> <数据类型>[列级完整性约束条件]]
-- 删除列
ALTER TABLE <表名> [DROP COLUMN <列名>]
-- 修改列
ALTER TABLE <表名> [MODIFY COLUMN <列名> <数据类型> [列级完整性约束条件]]

示例

-- 添加用户表`Phone`列
ALTER TABLE User ADD Phone VARCHAR(20) NULL;
-- 删除用户表`Phone`列
ALTER TABLE User DROP COLUMN Phone;
-- 修改用户表`Phone`列
ALTER TABLE User MODIFY Phone VARCHAR(20) NULL;

SQL查询语句
语法

SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]…
  FROM <表名或视图名>[,<表名或视图名>]…
  [WHERE <条件表达式>]
  [GROUP BY <列名> [HAVING <条件表达式>]]
  [ORDER BY <列名> [ASC|DESC]…]

    SQL查询语句的顺序:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。SELECT、FROM是必须的,HAVING子句只能与GROUP BY搭配使用。

示例

SELECT * FROM User
  WHERE Id>10
  GROUP BY Age HAVING AVG(Age) > 20
  ORDER BY Id DESC

SQL插入语句
语法

-- 插入不存在的数据
INSERT INTO <表名> [(字段名[,字段名]…)] VALUES (常量[,常量]…);
-- 将查询的数据插入到数据表中
INSERT INTO <表名> [(字段名[,字段名]…)] SELECT 查询语句;

示例

-- 插入不存在的数据
INSERT INTO User (Name,Age,Gender) VALUES ('lilei',30,'male');
-- 将查询的数据插入到数据表中
INSERT INTO User (Name,Age,Gender)
  SELECT Name,Age,Gender FROM Student_T WHERE Id >10;

SQL更新语句
语法

UPDATE <表名> SET 列名=值表达式[,列名=值表达式…]
  [WHERE 条件表达式]

示例

-- 将Id在(10,100)的Age加1
UPDATE User SET Age= Age+1 WHERE Id>10 AND Id<100

SQL删除语句
语法

DELETE FROM <表名> [WHERE 条件表达式]

示例

-- 删除Id小于10的数据记录
DELETE FROM User WHERE Id<10;

创建索引
语法

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

    UNIQUE:表明此索引的每一个索引值只对应唯一的数据记录
    CLUSTER:表明建立的索引是聚集索引
    次序:可选ASC(升序)或DESC(降序),默认ASC

示例

-- 建立用户表索引:单一字段Id索引倒序
CREATE UNIQUE INDEX INDEX_SId ON User (Id DESC);
-- 建立用户表索引:多个字段Id、Name索引倒序
CREATE UNIQUE INDEX INDEX_SId_SName ON User (Id DESC,Name DESC);

删除索引
语法

DROP INDEX <索引名>;

示例

-- 删除用户表索引 INDEX_SId
DROP INDEX INDEX_SId;

创建视图
语法

CREATE VIEW <视图名>
  AS SELECT 查询子句
  [WITH CHECK OPTION]

    查询子句:子查询可以是任何SELECT语句,但是常不允许含有ORDER BY子句和DISTINCT短语;
    WITH CHECK OPTION:表示对UPDATE、INSERT、DELETE操作时要保证更新。

示例

CREATE VIEW VIEW_User_Male
AS SELECT * FROM User WHERE Gender = 'male'
WITH CHECK OPTION

删除视图
语法

DROP VIEW <视图名>;

示例

DROP VIEW VIEW_User_Male;

SQL的访问控制

    访问控制是控制用户的数据存储权限,由DBA来决定。
    SQL标准语句包括SELECT、INSERT、UPDATE和DELETE

语法

-- 1.授权
GRANT <权限>[,<权限>]…
  [ON <对象类型> <对象名>]
  TO <用户>[,<用户>]…
  [WITH GRANT OPTION]
-- 2.收回授权
REVOKE <权限>[,<权限>]…
  [ON <对象类型> <对象名>]
  FROM <用户>[,<用户>]…

    WITH GRANT OPTION:若指定此子句,表示该用户可以将权限赋给其他用户

示例

-- 授权
GRANT SELECT,INSERT,UPDATE ON TABLE TO USER_Admin WITH GRANT OPTION
-- 收回授权
REVOKE SELECT,INSERT,UPDATE ON TABLE FROM USER_Admin

别名/更名

语法

SELECT 字段名1 [AS] 别名 [,字段名1 AS 别名]… FROM <表名>

    AS可以省略
    当别名中含有非字母和下划线时或者是关键字时,需要加上单/双引号

示例

SELECT Id AS '学号',Name '姓名',Class ClassName FROM Students;

子查询(嵌套查询)

    子查询也称嵌套查询,是指一个SELECT查询语句可以嵌入另一个SELECT查询语句之中。SQL中允许多级嵌套,子查询在实际使用中非常多。
    连接查询:涉及两个及以上的表查询为连接查询。

--查询二班学生成绩
SELECT * FROM Scores WHERE SId IN(SELECT Id FROM Students WHERE Class='二班')

聚合函数查询

    聚合函数:是一个值的集合为输入,返回单个值的函数。
    SQL预定义了5个聚集函数:AVG(平均值)、MIN(最小值)、MAX(最大值)、SUM(求和)、COUNT(计数)。
    具体的数据库还会预定义一些其他常用的函数,比如字符串相聚合函数、时间聚合函数……。

SELECT AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students;

分组查询

    使用GROUP BY子句可进行分组查询
    注意:分组查询的时候要在GROUP BY子句后面跟上所有查询字段的列表

--根据班级分组查询各班平均年龄、最大 年龄、最小年龄、年龄总和、班级人数
SELECT Class,AVG(Age),MAX(Age),MIN(Age),SUM(Age),COUNT(Id) FROM Students GROUP BY Class;

HAVING子句

    如果需要在分组前的数据进行限制,可以使用HAVING子句
    HAVING子句只能与GROUP BY搭配使用

--根据班级分组查询各班平均年龄并且班级人数大于3人
SELECT Class,AVG(Age) FROM Students GROUP BY Class HAVING COUNT(Id)>3;

HAVING子句和WHERE的区别

    WHERE语句在GROUP BY语句之前,SQL会在分组之前计算WHERE语句;
    HAVING语句在GROUP BY语句之后,SQL会在分组之后计算HAVING语句。

模糊查询

语法

SELECT 字段列表 FROM 表名 WHERE 字段 LIKE '<通配符>'

    模糊查询是通过关键字LIKE和通配符实现的
    _:任何单个字符(一个'_'只匹配一个字符,多个字符就使用多个_)
    %:包含零个或更多字符的任意字符串(匹配任意内容)
    []:指定范围的字符(只匹配[]内的字符)
    [^]:不在指定范围的字符(只匹配除[]内的字符)
    SQL中通配符可以混合使用

去重复(DISTINCT)

    DISTINCT:用于返回唯一不同的值,主要是用于某一字段。

    语法

    SELECT DISTINCT <列名>|* FROM <表名>

    示例

    --查询所有班级名称
    SELECT DISTINCT Class FROM Students

组合查询

    SQL组合查询可以使用以下关键字进行操作:

        UNION(并集):比较两个查询的结果,返回两个集合所有非重复行。
        INTERSECT(交集):比较两个查询的结果,返回由左右双侧输入查询输出的非重复行。
        EXCEPT(差集):比较两个查询的结果,返回左侧查询集合中不包含左右集合交集部分的非重复行。
        注意:
        使用 EXCEPT 或 INTERSECT 的两个查询的结果集组合起来的基本规则:
        所有查询中的列数和列的顺序必须相同;数据类型必须兼容。

语法

[SQL查询表达式1]
  UNION | INTERSECT | EXCEPT
[SQL查询表达式2];

连接查询

    常用的连接查询有如下几种:
    内连接(INNER JOIN):返回连接的对象都满足条件的行。
    左连接(LEFT JOIN):返回左边数据所有数据,即使右边没有数据
    (没有对应数据显示为NULL)。
    右连接(RIGHT JOIN):返回右边数据所有数据,即使左边没有数据
    (没有对应数据显示为NULL)。
    全连接(FULL JOIN):返回左右交叉数据。
    提示:INNER JOIN 与 JOIN 是相同的。

语法

SELECT 字段列表 FROM <数据表|视图> INNER JOIN <数据表|视图> ON 条件表达式;

虚拟表

    SQL虚拟表是通过SELECT查询语句返回的一个结果集。
    当虚拟表构建出来后,可以直接当作实际数据表一样查询操作,在实际使用中会经常使用到。

    语法

    SELECT 字段列表1 FROM
    (SELECT 字段列表2 FROM <表名> [WHERE子句]) <虚拟表名称> 
    [WHERE子句]

    示例

    SELECT * FROM ( SELECT S.Id,S.Name CName,S.Grades,S.IsPassed,S.SId,ST.Name,ST.Class 
    FROM Students ST LEFT JOIN (SELECT Scores.*,C.Name FROM
    Scores LEFT JOIN Courses C ON Scores.CId=C.Id) S ON ST.Id=S.SId ) T

        示例中的SELECT Scores.*,C.Name FROMScores LEFT JOIN Courses C ON Scores.CId=C.Id中 C 和最后面 T 就是虚拟表名称。