非原创:论智:SQL常用语句总结zhuanlan.zhihu.com
原博客:https://blog.csdn.net/weixin_36432451/article/details/113581496
数据库
- 查看现有数据库
SHOW DATABASES;
- 新建数据库
CREATE DATABASE <数据库名>;
- 选择数据库
USE <数据库名>;
- 从.sql文件引入SQL语句
SOURCE <.sql文件路径>;
- 删除数据库
DROP DATABASE <数据库名>;
表
- 查看当前数据库中的表
SHOW TABLES;
7fd1ac702cea63d9bbdcc589f6d9c019.png
-
创建新表
CREATE TABLE <表名> (
<列名1> <列类型1>,
<列名2> <列类型2>,
<列名3> <列类型3>,
PRIMARY KEY (<列名1>),
FOREIGN KEY (<列名2>) REFERENCES <表名2>(<列名2>)
);
主键(PRIMARY KEY)用来标识一条记录(一行),所以每条记录的主键值必须是唯一的。主键可以定义在多列上,这称为联合主键(composite primary key)。
如果我们把表视作具有某种结构的数组(例如,C语言中的struct),那么外键(FOREIGN KEY)可以视作指针。
例子:
CREATE TABLE instructor (
ID CHAR(5),
name VARCHAR(20) NOT NULL,
dept_name VARCHAR(20),
salary NUMERIC(8,2),
PRIMARY KEY (ID),
FOREIGN KEY (dept_name) REFERENCES department(dept_name));
在上面的例子中,我们创建了一个教员(instructor)表,该表的主键是ID,外键是教员所在的部门名称(dept_name),关联部门(department)表。此外,教员表还包括姓名(name)、薪水(salary)。其中,姓名有约束NOT NULL,表示姓名这一项不能为空。
- 概述表中的列
使用如下语句查看表中的列的基本信息:
DESCRIBE <表名>;
下图显示了一些例子:
3a82ce9d21dbcd1ca01932ed0ddfd0ba.png
- 在表中插入新纪录
INSERT INTO <表名> (<列名1>, <列名2>, <列名3>, …)VALUES (<值1>, <值2>, <值3>, …);
也可以省略列名(依序在所有列上插入新值):
INSERT INTO <表名>VALUES (<值1>, <值2>, <值3>, …);
-
在表中更新记录
UPDATE <表名>
SET <列名1> = <值1>, <列名2> = <值2>, …
WHERE <条件>; -
清空表
DELETE FROM <表名>;
- 删除表
DROP TABLE <表名>;
查询
- SELECT
SELECT语句可以从表中选择数据:
SELECT <列名1>, <列名2>, …
FROM <表名>;
以下语句选择所有内容:
SELECT * FROM <表名>;
e0cc057ce15dd7e1f7e7b6f144f9b0f9.png
artment)表和课程(course)表中的所有内容14. SELECT DISTINCT
SELECT DISTINCT过滤掉了重复的值:
SELECT DISTINCT <列名1>, <列名2>, …
FROM <表名>;
22632f8e01763b77c46798b656d59c8c.png
- WHERE
我们之前在更新记录时已经用到了WHERE关键字,用来指明条件。这里我们稍微详细一点地介绍下WHERE。
WHERE的条件通常是:
比较文本(text)
比较数字(numbers)
AND、OR、NOT等逻辑运算
让我们来看一些例子:
SELECT * FROM course WHERE dept_name='Comp. Sci.';
SELECT * FROM course WHERE credits>3;
SELECT * FROM course WHERE dept_name='Comp. Sci.' AND credits>3;
7ccf7edf24f7c9bb145cc91ab4ec5c56.png
- GROUP BY
GROUP BY语句可以分组结果,常用于COUNT、MAX、MIN、SUM、AVG等聚合函数(aggregate functions)。
SELECT <列名1>, <列名2>, …
FROM <表名>
GROUP BY <列名>;
让我们来看一个例子,列出每个部门的课程数量:
SELECT COUNT(course_id), dept_name
FROM course
GROUP BY dept_name;
0a3669b007e218f1e3ae8ae3b8e5a7cf.png
- HAVING
乍看起来,HAVING和WHERE很像:
SELECT <列名1>, <列名2>, …
FROM <表名>
GROUP BY <列名x>
HAVING <条件>;
那么,HAVING和WHERE有什么不同呢?让我们先来看一个例子,列出开了不止一门课程的部门开设的课程数:
SELECT COUNT(course_id), dept_name
FROM course
GROUP BY dept_name
HAVING COUNT(course_id)>1;
这里HAVING不能换成WHERE,因为WHERE直接针对行操作,且在GROUP BY之前运行(即先通过WHERE筛选行,之后再将筛选出的行通过GROUP BY分组)。假设SQL中不存在HAVING语句,那么我们只能先新建一张表,将COUNT(course_id)作为新表的列,然后在新表上再通过WHERE进行筛选(当然,实际上SQL提供了派生表、CTE等机制,并不用真的手工建新表)。
85d0e90f98b80f64bf8b1cf9f3651fe5.png
- ORDER BY
ORDER BY可以对结果进行排序,在没有明确指定ASC(升序)或DESC(降序)的情况下,默认按升序排列。
SELECT <列名1>, <列名2>, …
FROM <表名>
ORDER BY <列名1>, <列名2>, …, ASC|DESC;
例子:
SELECT * FROM course ORDER BY credits;
SELECT * FROM course ORDER BY credits DESC;
1525008af4db761cfdab725f9b723fa7.png
- BETWEEN
BETWEEN语句用于指定区间。
SELECT <列名1>, <列名2>, …
FROM <表名>
WHERE <列名x> BETWEEN <值1> AND <值2>;
其中“值”可能是数字,文本,乃至日期等。
例如,列出薪资在50000和100000之间的教员:
SELECT * FROM instructor
WHERE salary BETWEEN 50000 AND 100000;
4338fc9ad1acb86e29ce55ce48414e4e.png
- LIKE
LIKE用于匹配文本中的特定模式。
SELECT <列名1>, <列名2>, …
FROM <表名>
WHERE <列名x> LIKE <模式>;
模式中可以使用以下两个通配符:
% (零个、一个或多个字符)
_ (单个字符)
例子:列出课程名中包含“to”的课程,以及课程ID以“CS-”开头的课程。
SELECT * FROM course WHERE title LIKE '%to%';
SELECT * FROM course WHERE course_id LIKE 'CS-___';
e19a8a169780b787b572acc6412f22a6.png
- IN
IN语句表示值属于某个集合。
SELECT <列名1>, <列名2>, …
FROM <表名>
WHERE <列名n> IN (<值1>, <值2>, …);
例子:列出计算机科学、物理、电子工程部门的学生。
SELECT * FROM student
WHERE dept_name IN ('Comp. Sci.', 'Physics', 'Elec. Eng.');
3573b2a6c360cb7ad902716f15917271.png
- JOIN
JOIN用来组合两张以上表中的值。下图展示了JOIN的三种类型:
0448d535bc30773204dd223397281a86.png
图片来源:http://zeroturnaround.com
SELECT <列名1>, <列名2>, …
FROM <表名1>
JOIN <表名2>
ON <表名1.列名x> = <表名2.列名x>
让我们来看三个例子,分别对应三种JOIN的类型。
第一个例子,列出课程时包含开设课程的部门详情:
SELECT * FROM course
JOIN department
ON course.dept_name=department.dept_name;
711dbd1b03c6e00435f446682db2e038.png
第二个例子,列出所有具有前置课程的课程的详情:
SELECT prereq.course_id, title, dept_name, credits, prereq_id
FROM prereq
LEFT OUTER JOIN course
ON prereq.course_id=course.course_id;
2ad05912bf7d8cc0fd69e992342591f6.png
最后一个例子,列出所有课程的详情,不管是否具有前置课程:
SELECT course.course_id, title, dept_name, credits, prereq_id
FROM prereq
RIGHT OUTER JOIN course
ON prereq.course_id=course.course_id;
8939d7577a1f43730ed6d50ceace0208.png
- 视图
视图(view)是虚拟的SQL表。它包含行和列,和一般的SQL表格很类似。视图总是显示数据库中的最新数据。
CREATE VIEW
创建视图:
CREATE VIEW <视图名> AS
SELECT <列名1>, <列名2>, …
FROM <表名>
WHERE <条件>;
DROP VIEW
删除视图:
DROP VIEW <视图名>;
例如,创建3学分的课程视图:
CREATE VIEW my_view AS
SELECT * FROM course
WHERE credits=3;
83fb6dad9fcaf1fd5839c6382194db57.png
- 聚合函数
我们之前已经提到聚合函数,这里列出最常用的一些聚合函数:
COUNT(列名) 返回行数
SUM(列名) 返回指定列的值之和
AVG(列名) 返回指定列的平均值
MIN(列名) 返回指定列的最小值
MAX(列名) 返回指定列的最大值
- 嵌套子查询
在SQL请求中,可以嵌套SELECT-FROM-WHERE表达式,称为嵌套子查询(nested subqueries)。
例如,查找2009年秋、2010年春都开的课程:
SELECT DISTINCT course_id
FROM section
WHERE semester = ‘Fall’ AND year= 2009 AND course_id IN (
SELECT course_id
FROM section
WHERE semester = ‘Spring’ AND year= 2010
);
6aaf46279c2708b5f38b3eb19d2e9e89.png
————————————————
版权声明:本文为CSDN博主「大学资源」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36432451/article/details/113581496