SQL入门教程:从基础到精通,一篇搞定!
前言
导读: SQL语言自问世以来已有超过40年的历史,几乎无处不在。我们每一次的支付记录、用户信息收集、信息传递等,都是依赖数据库及其相关产品来存储,而操控这些数据库的语言正是 SQL!
在现代互联网公司的研发和生产岗位中,SQL几乎是必备技能。如果你不会 SQL,很多工作可能无法进行。可以把 SQL 看作一项工具,利用它可以帮助你高效地完成工作,创造价值。
01 SQL 介绍
1. 什么是 SQL
SQL 是一种用于访问和管理数据库的标准计算机语言。
- SQL 代表结构化查询语言(Structured Query Language)
- SQL 使我们能够与数据库进行交互
- SQL 是 ANSI(美国国家标准协会)认可的标准语言
SQL 可以与多种数据库程序协同工作,如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 及其他数据库系统。然而,由于不同数据库的出现,导致了 SQL 的多个不同版本。为了与 ANSI 标准兼容,它们必须在某些主要的关键字(如 SELECT、UPDATE、DELETE、INSERT、WHERE 等)上保持一致,这些就是我们学习 SQL 的基础内容。
2. SQL 的类型
SQL 可以分为两个主要部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
- 数据查询语言(DQL: Data Query Language)
- 数据操纵语言(DML: Data Manipulation Language)
3. 学习 SQL 的意义
SQL 是一门 ANSI 的标准语言,用于访问和操作数据库系统。SQL 语句用于检索和更新数据库中的数据。
- SQL 可用于执行数据库查询
- SQL 可从数据库中提取数据
- SQL 可在数据库中插入新记录
- SQL 可更新数据库中的现有数据
- SQL 可从数据库中删除记录
- SQL 可创建新的数据库
- SQL 可在数据库中生成新表
- SQL 可创建存储过程
- SQL 可创建视图
- SQL 可以设置表、存储过程和视图的权限
4. 数据库的定义
数据库是一个存放数据的容器。 就像每个家庭都有冰箱用于存放食物,数据库则是用来存储数据的地方。正因如此,我们能够方便地查找所需数据。例如,您每天通过余额宝查看账户收益,实际上就是从数据库中读取相关数据。
最常见的数据库类型是关系型数据库管理系统(RDBMS),它是 SQL 的基础,同时也是现代数据库系统的根基。例如:
- MS SQL Server
- IBM DB2
- Oracle
- MySQL
- Microsoft Access
在 RDBMS 中,数据存储在称为表(tables)的数据库对象中。表是相关数据项的集合,由列和行组成。由于本文主要关注 SQL 基础内容,因此对数据库的详细解释将较少,只需对其有个大致了解即可。
让我们直接开始学习 SQL 吧!
02 SQL 基础语言学习
在了解 SQL 基础语句之前,我们先来讲讲 表 是什么。一个数据库通常包含一个或多个表,每个表通过一个名字标识(如“客户”或“订单”),表中包含带有数据的记录(行)。
以下是一个名为 “Persons” 的表的示例:
| Id | LastName | FirstName | Address | City |
|---|---|---|---|---|
| 1 | Adams | John | Oxford Street | London |
| 2 | Bush | George | Fifth Avenue | New York |
| 3 | Carter | Thomas | Changan Street | Beijing |
上面的表包含三条记录(每条对应一个人)和五个列(Id、姓、名、地址和城市)。 有了表,才能进行查询,那我们如何创建这样的表呢?
1. CREATE TABLE – 创建表
CREATE TABLE 语句用于在数据库中创建表。
语法:
CREATE TABLE 表名称 (
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
);
数据类型(data_type)定义了列可以接受的具体数据类型。以下是 SQL 中一些常用数据类型的表格:
| 数据类型 | 描述 |
|---|---|
| integer(size), int(size), smallint(size) | 仅可存放整数,括号中规定数字的最大位数 |
| decimal(size, d), numeric(size, d) | 可存放带小数的数字,“size”规定数字的最大位数,“d”规定小数点后最大位数 |
| char(size) | 存放固定长度的字符串(可包含字母、数字及特殊字符),括号中规定字符串长度 |
| varchar(size) | 存放可变长度的字符串(可包含字母、数字及特殊字符),括号中规定字符串的最大长度 |
| date(yyyymmdd) | 存放日期 |
示例: 本例演示如何创建名为 “Persons” 的表,包含 5 个列,列名分别为:“Id_P”、“LastName”、“FirstName”、“Address” 和 “City”:
CREATE TABLE Persons (
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
在这个表中,Id_P 列的数据类型为 int,包含整数,其余四列的数据类型为 varchar,最大长度为 255 个字符。
空的 “Persons” 表示例:
| Id_P | LastName | FirstName | Address | City |
|------|----------|-----------|---------|------|
可以使用 INSERT INTO 语句向空表中插入数据。
2. INSERT – 插入数据
INSERT INTO 语句用于向表中添加新行。
语法:
INSERT INTO 表名称 VALUES (值1, 值2,....);
我们也可以指定插入数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....);
示例: 以下是 “Persons” 表插入记录的两种方式: 1)插入新的行:
INSERT INTO Persons VALUES (1, 'Gates', 'Bill', 'Xuanwumen 10', 'Beijing');
2)在指定的列中插入数据:
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees');
插入成功后,数据如下:
| Id_P | LastName | FirstName | Address | City |
|------|----------|-----------|-------------------|---------|
| 1 | Gates | Bill | Xuanwumen 10 | Beijing |
| 2 | Wilson | NULL | Champs-Elysees | NULL |
接下来,我们将通过 SELECT 语句进行数据查询。
3. SELECT – 查询数据
SELECT 语句用于从表中提取数据,结果存储在一个称为结果集的表中。
语法:
SELECT * FROM 表名称;
我们也可以指定要查询的列:
SELECT 列名称 FROM 表名称;
注意: SQL 语句对大小写不敏感,SELECT 与 select 等效。
实例:
SELECT * FROM Persons;
注意: 星号(*)表示选择所有列。如果需要获取名为 “LastName” 和 “FirstName”的列的内容,可以使用以下 SELECT 语句:
SELECT LastName, FirstName FROM Persons;
4. DISTINCT – 去除重复值
如果一张表中存在多行重复数据,可以使用 DISTINCT 来去重。
语法:
SELECT DISTINCT 列名称 FROM 表名称;
实例: 如果想从 “LastName” 列中选取所有值,可以使用:
SELECT LastName FROM Persons;
如果想仅选取唯一不同的值,则需使用:
SELECT DISTINCT LastName FROM Persons;
5. WHERE – 条件过滤
若要从表中选取特定数据,可在 SELECT 语句中添加 WHERE 子句。
语法:
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值;
可在 WHERE 子句中使用以下运算符:
| 操作符 | 描述 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| 大于 | |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某个范围内 |
| LIKE | 搜索某种模式 |
实例: 如果只希望选取居住在 “Beijing” 的人:
SELECT * FROM Persons WHERE City='Beijing';
6. AND & OR – 运算符
AND 和 OR 可在 WHERE 子句中结合两个或多个条件。
- 使用 AND 运算符时,只有当两个条件都满足时,才会返回记录。
- 使用 OR 运算符时,只需其中一个条件满足即可返回记录。
语法: AND 运算符示例:
SELECT * FROM 表名称 WHERE 列 运算符 值 AND 列 运算符 值;
OR 运算符示例:
SELECT * FROM 表名称 WHERE 列 运算符 值 OR 列 运算符 值;
实例: 假设 “Persons” 表已有多条数据,可以通过以下方式使用 AND 和 OR:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter';
SELECT * FROM Persons WHERE FirstName='Thomas' OR LastName='Carter';
7. ORDER BY – 排序
ORDER BY 语句用于根据指定的列对结果集进行排序,默认按升序排序;若需按降序排序,可使用 DESC 关键字。
语法:
SELECT * FROM 表名称 ORDER BY 列1, 列2 DESC;
实例: 以字母顺序显示 LastName 名称:
SELECT * FROM Persons ORDER BY LastName;
8. UPDATE – 更新数据
UPDATE 语句用于修改表中的数据。
语法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值;
实例: 更新某一行中的列:
UPDATE Persons SET FirstName = 'Fred' WHERE LastName = 'Wilson';
9. DELETE – 删除数据
DELETE 语句用于删除表中的行。
语法:
DELETE FROM 表名称 WHERE 列名称 = 值;
实例: 删除 Persons 表中 LastName 为 “Wilson” 的行:
DELETE FROM Persons WHERE LastName = 'Wilson';
10. TRUNCATE TABLE – 清除表数据
如果只需删除表内的数据而不删除表本身,使用 TRUNCATE TABLE 命令(仅删除表格中的数据):
语法:
TRUNCATE TABLE 表名称;
11. DROP TABLE – 删除表
DROP TABLE 语句用于删除表(包括表的结构、属性及索引)。
语法:
DROP TABLE 表名称;
03 SQL 高级语言学习
1. LIKE – 查找类似值
LIKE 操作符用于在 WHERE 子句中搜索列中的特定模式。
语法:
SELECT 列名/(*) FROM 表名称 WHERE 列名称 LIKE 值;
示例: 从上面的 “Persons” 表中选取居住在以 “N” 开头的城市里的人:
SELECT * FROM Persons WHERE City LIKE 'N%';
2. IN – 锁定多个值
IN 操作符允许在 WHERE 子句中指定多个值。
语法:
SELECT 列名/(*) FROM 表名称 WHERE 列名称 IN (值1, 值2, 值3);
示例: 从 Persons 表中选取姓氏为 Adams 和 Carter 的人:
SELECT * FROM Persons WHERE LastName IN ('Adams', 'Carter');
3. BETWEEN – 选取区间数据
BETWEEN … AND 操作符用于选取介于两个值之间的数据范围。
语法:
SELECT 列名/(*) FROM 表名称 WHERE 列名称 BETWEEN 值1 AND 值2;
4. AS – 别名
通过 SQL,可以为列名和表名指定别名(Alias),使查询更易读。
语法:
SELECT 列名称/(*) FROM 表名称 AS 别名;
5. JOIN – 多表关联
JOIN 用于根据两个或多个表中列之间的关系查询数据。
语法:
SELECT 列名 FROM 表A INNER|LEFT|RIGHT|FULL JOIN 表B ON 表A主键列 = 表B外键列;
6. UNION – 合并结果集
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
语法:
SELECT 列名 FROM 表A UNION SELECT 列名 FROM 表B;
7. NOT NULL – 非空
NOT NULL 约束强制列不接受 NULL 值。
语法:
CREATE TABLE 表 ( 列 int NOT NULL );
8. VIEW – 视图
视图是基于 SQL 语句的结果集的可视化表。
语法:
CREATE VIEW 视图名 AS SELECT 列名 FROM 表名 WHERE 查询条件;
04 SQL 常用函数学习
SQL 提供了多种内建函数用于计数和计算。
函数的使用语法:
SELECT function(列) FROM 表;
1. AVG – 平均值
AVG 函数返回数值列的平均值。
语法:
SELECT AVG(列名) FROM 表名;
2. COUNT – 汇总行数
COUNT() 函数返回匹配指定条件的行数。
语法:
SELECT COUNT(*) FROM 表名;
3. MAX – 最大值
MAX 函数返回一列中的最大值。
语法:
SELECT MAX(列名) FROM 表名;
4. MIN – 最小值
MIN 函数返回一列中的最小值。
语法:
SELECT MIN(列名) FROM 表名;
5. SUM – 求和
SUM 函数返回数值列的总和。
语法:
SELECT SUM(列名) FROM 表名;
6. GROUP BY – 分组
GROUP BY 语句结合合计函数,根据一个或多个列对结果集进行分组。
语法:
SELECT 列名A, 统计函数(列名B) FROM 表名 WHERE 查询条件 GROUP BY 列名A;
7. HAVING – 句尾连接
HAVING 子句用于与合计函数结合使用。
语法:
SELECT 列名A, 统计函数(列名B) FROM 表名 WHERE 查询条件 GROUP BY 列名A HAVING 统计函数(列名B) 查询条件;
8. UCASE/UPPER – 大写
UCASE/UPPER 函数将字段值转换为大写。
语法:
SELECT UPPER(列名) FROM 表名;
9. LCASE/LOWER – 小写
LCASE/LOWER 函数将字段值转换为小写。
语法:
SELECT LOWER(列名) FROM 表名;
10. LEN/LENGTH – 获取长度
LEN/LENGTH 函数返回文本字段中值的长度。
语法:
SELECT LENGTH(列名) FROM 表名;
11. ROUND – 数值取舍
ROUND 函数将数值字段舍入为指定的小数位数。
语法:
SELECT ROUND(列名, 精度) FROM 表名;
12. NOW/SYSDATE – 当前时间
NOW/SYSDATE 函数返回当前的日期和时间。
语法:
SELECT SYSDATE FROM 表名;
题外话
如果您对网络安全感兴趣,我们提供了最新的学习路线和资源,帮助您快速入门并深入研究。希望您喜欢这篇文章,欢迎点赞和分享! 一站自学网站:xuesql.cn