SQL语句速成
作者:blue
时间:2024.7.19
[TOC]
1.建表
CREATE TABLE table_name
(
列名 列类型 PRIMARY KEY(主键)
列名 列类型
列名 列类型
FOREIGN KEY (列名) REFERENCES 表名(列名) --这表示该列的是外键以及他的外键约束
)
2.插入语句
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二种形式需要指定列名及被插入的值:
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
3.查询语句
SELECT <目标列名序列> -- 需要哪些列
FROM <表名> [JOIN <表名> ON <连接条件>] -- 来自哪些表
[WHERE <行选择条件>] -- 根据什么条件
[GROUP BY <分组依据列>]
[HAVING <组选择条件>]
[ORDER BY <排列依据列>]
- SELECT 子句用于指定输出的字段
- FROM 子句用于指定数据的来源
- WHERE 子句用于指定数据的行选择条件
- GROUP BY 子句用于对检索到的记录进行分组
- HAVING 子句用于指定对分组后结果的选择条件
- ORDER BY 子句用于对查询的结果进行排序
where子句的部分查询条件
查询条件 | 谓词 |
---|---|
比较 | =, >, >=, <=, <, <>, != |
确定范围 | BETWEEN … AND …, NOT BETWEEN … AND… |
确定集合 | IN, NOT IN |
字符匹配 | LIKE, NOT LIKE |
空值 | IS NULL, IS NOT NULL |
多重条件 | AND, OR |
1.比较大小
-- 查询计算机系所有学生的姓名
SELECT Sname FROM Student WHERE Sdept='计算机系'
-- 查询考试成绩大于90的学生的学号、课程号和成绩
SELECT Sno, Cno, Grade FROM SC WHERE Grade > 90
2.确定范围
注意:
BETWEEN ... AND ... :包括边界
NOT BETWEEN ... AND ... :不包括边界
-- 查询学分在2~3之间的课程的课程名称、学分和开课学期
SELECT Cname, Credit, Semester FROM Course WHERE Credit BETWEEN 2 AND 3
-- 等价于
SELECT Cname, Credit, Semester FROM Course
WHERE Credit >= 2 AND Credit <=3
-- 查询学分不在2~3之间的课程的课程名称、学分和开课学期
SELECT Cname, Credit, Semester FROM Course
WHERE Credit NOT BETWEEN 2 AND 3
-- 等价于
SELECT Cname, Credit, Semester FROM Course
WHERE Credit < 2 OR Credit > 3
-- 查询出生在1997年的学生的全部信息
SELECT * FROM Student
WHERE Sbirthday BETWEEN '1997-01-01' AND '1997-12-31'
3.确定集合
-- 查询‘计算机系’和‘机电系’学生的学号、姓名和所在系
SELECT Sno, Sname, Sdept FROM Student
WHERE Sdept IN ('计算机系', '机电系')
-- 查询不在‘计算机系’和‘机电系’学生的学号、姓名和所在系
SELECT Sno, Sname, Sdept FROM Student
WHERE Sdept NOT IN ('计算机系', '机电系')
4.字符串匹配
匹配串中有如下四种通配符:
_:匹配任意一个字符
%:匹配0到多个字符
[]:匹配[ ]中任意一个字符。如[abcd]表示匹配a, b, c, d中的一个。
若要比较的字符是连续的,也可以用连字符'-'表达,比如匹配 abcd中任意一个
可写成 [a-d]
[^ ]:不匹配[ ]中的任意一个字符,用法与[ ]一致,也可以用'-'表示连续字符
-- 查询姓‘李’的学生的学号、姓名和所在系
SELECT Sno, Sname, Sdept FROM Student
WHERE Sname LIKE '李%'
-- 查询姓名中第二个字是‘冲’的学生的学号、姓名和所在系
SELECT Sno, Sname, Sdept FROM Student
WHERE Sname LIKE '_冲%'
-- 查询学号最后不是‘2’或者‘3’的学生的学号、姓名和所在系
SELECT Sno, Sname, Sdept FROM Student
WHERE Sno NOT LIKE '%[23]'
5.涉及空值查询
-- 查询还没有考试的学生的学号、相应的课程号
SELECT Sno, Cno FROM SC
WHERE Grade IS NULL
-- 查询有备注的学生的学号、姓名和备注
SELECT Sno, Sname, Memo FROM Student
WHERE Memo IS NOT NULL
6.多重条件查询
-- 查询‘计算机系’有备注的学生的学好、姓名、所在系和备注
SELECT Sno, Sname, Sdept, Memo FROM Student
WHERE Memo IS NOT NULL AND Sdelt = '计算机系'
-- 查询 ‘机电系’和‘计算机系’1997年出生的学生的学号、姓名、所在系和生日
SELECT Sno, Sname, Sdept, Sbirthday FROM Student
WHERE (Sdept = '计算机系' OR Sdept = '机电系')
AND Sbirthday BETWEEN '1997-01-01' AND '1997-12-31'
7.对查询结果进行排序
/*
语法格式:
ORDER BY <列名> [ASC | DESC][, ...n]
ASC 表示升序
DESC 表示降序
默认ASC
*/
-- 将‘C01’号课程的成绩按升序排列
SELECT Cno, Grade FROM SC
WHERE Cno='C01' ORDER BY Grade
-- 将‘1001’号学生的成绩按降序排列
SELECT Cno, Grade FROM SC
WHERE Sno='1001' ORDER BY Grade DESC
8.SQL常用聚合函数:
COUNT():统计表中*元组的个数
COUNT([DISTINCT] <列名>):统计本列的列值个数,DISTINCT表示去掉重复值后再统计
SUM(<列名>):计算列值的和值(必须是数值类型)
AVG(<列名>):计算列值的平均值(必须是数值类型)
MAX(<列名>):得到列的最大值
MIN(<列名>):得到列的最小值
使用HAVING 子句。HAVING子句用于对分组后的统计结果再进行筛选,它的功能与WHERE类似,但它用于组而不是单个记录。在HAVING中能使用聚合函数,但在WHERE不能。
4.更新语句
UPDATE <表名> SET <字段名=值> WHERE <筛选条件>;
例子:在学生表中,将学生编号Sid为6的学生姓名Sname修改为:杨红梅
update students set Sname='杨红梅' where Sid = 6;
5.删除语句
1.delete语句
DELETE FROM table_name
WHERE condition;
- table_name:要删除的表名称。
- condition:删除条件,用于指定哪些数据要删除。
WHERE 子句规定哪条记录或者哪些记录需要删除。如果您省略了 WHERE 子句,所有的记录都将被删除!
2.drop语句
DROP TABLE删除一个或多个表。可以使用以下语法:
DROP TABLE table1_name, table2_name, ...;
6.视图创建
CREATE VIEW viewname [<属性列名>,<属性列名>,<属性列名>,……]
AS
SELECT语句
7.权限的授予与撤销
grant语句,用于向用户授予权限
grant <权限列表> on <数据库对象> to <用户列表> [with grant option]
[with grant option]表示被授予权限的用户具有转授权
revoke语句
revoke <权限列表> on <数据库对象> from [RESTRICT|CASCADE]
RESTRICT:限制级联收回,当用户没有将权限转授给其他用户的时候,才能收回用户的权限,否则系统拒绝执行该收权动作
CASCADE:把用户拥有数据对象的上的授权及其转授出去的授权同时收回
8.alter
1:删除列
ALTER TABLE 表名 DROP COLUMN 列名
2:增加列
ALTER TABLE 表名 ADD COLUMN 列名 属性 【约束】
9.索引创建与删除
在定义表的基本语句时,为表添加clustered(聚集索引)或nonclustered(非聚集索引)
单独创建索引
create [clustered|nonclustered] index <索引名>
删除索引
drop index <索引名> on <表名>