您的位置:首页 > 数据库

SQL基本使用语句整理

2017-05-09 13:57 351 查看
创建表
语法

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 就是虚拟表名称。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SQL 语句