1、 SELECT TOP 子句
SELECT TOP 子句用于规定要返回的记录的数目。SELECT TOP 子句对于拥有数千条记录的大型表来说,是非常有用的。注意:并非所有的数据库系统都支持 SELECT TOP 语句。 MySQL 支持 LIMIT 语句来选取指定的条数数据, Oracle 可以使用 ROWNUM 来选取。
--SQL Server / MS Access 语法--
SELECT TOP number|percent column_name(s)
FROM table_name;
--MySQL 语法--
SELECT column_name(s)
FROM table_name
LIMIT number;
--举例--
SELECT * FROM Persons
LIMIT 5;
--下面的 SQL 语句从 "Websites" 表中选取头两条记录--
SELECT *
FROM Websites
LIMIT 2;
--Oracle 语法--
SELECT column_name(s) FROM table_name
WHERE ROWNUM <= number;
--举例--
SELECT * FROM Persons
WHERE ROWNUM <=5;
2、LIKE 操作符
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
--SQL LIKE 语法--
SELECT column1, column2, ...
FROM table_name
WHERE column LIKE pattern;
/*参数说明:
column1, column2, ...:要选择的字段名称,可以为多个字段。如果不指定字段名称,则会选择所有字段。
table_name:要查询的表名称。
column:要搜索的字段名称。
pattern:搜索模式。*/
--下面的 SQL 语句选取 name 以字母 "G" 开始的所有客户:--
SELECT * FROM Websites
WHERE name LIKE 'G%';
--下面的 SQL 语句选取 name 包含模式 "oo" 的所有客户:--
SELECT * FROM Websites
WHERE name LIKE '%oo%';
--下面的 SQL 语句选取 name 不包含模式 "oo" 的所有客户:--
SELECT * FROM Websites
WHERE name NOT LIKE '%oo%';
3、通配符
通配符可用于替代字符串中的任何其他字符。在 SQL 中,通配符与 SQL LIKE 操作符一起使用。
SQL 通配符用于搜索表中的数据。
通配符 | 描述 |
---|---|
% | 替代 0 个或多个字符 |
_ | 替代一个字符 |
[charlist] | 字符列中的任何单一字符 |
[^charlist] 或 [!charlist] | 不在字符列中的任何单一字符 |
# 创建新表
create table websites
(
id int comment '序号',
name varchar(50) comment '网站名称',
url char(50) comment '网址',
alexa int comment '排名',
country varchar(10) comment '国家'
)
comment '网站表';
# 删除表内数据
delete from websites;
# 增加表信息
insert into websites (id, name, url, alexa, country)
values (1,'Google','https://www.google.cm/',1,'USA'),
(2,'淘宝','https://www.taobao.com/',12,'CN'),
(3,'Fackbook','https://www.facebook.com/',3,'USA'),
(4,'微博','http://www.weibo.com/',19,'CN');
# 选取 url 以字母 "https" 开始的所有网站:
SELECT * FROM Websites
WHERE url LIKE 'https%';
# 选取 url 包含模式 "oo" 的所有网站:
SELECT * FROM Websites
WHERE url LIKE '%oo%';
# 选取 name 以一个任意字符开始,然后是 "oogle" 的所有客户
SELECT * FROM Websites
WHERE name LIKE '_oogle';
# 选取 name 以 "G" 开始,然后是一个任意字符,然后是 "o",然后是一个任意字符,然后是 "le" 的所有网站:
SELECT * FROM Websites
WHERE name LIKE 'G_o_le';
# MySQL 中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。
# 选取 name 以 "G"、"F" 或 "s" 开始的所有网站:
SELECT * FROM Websites
WHERE name REGEXP '^[GFs]';
# 选取 name 以 A 到 H 字母开头的网站:
SELECT * FROM Websites
WHERE name REGEXP '^[A-H]';
# 选取 name 不以 A 到 H 字母开头的网站:
SELECT * FROM Websites
WHERE name REGEXP '^[^A-H]';
# 从 "Websites" 表中选取头两条记录:
SELECT *
FROM Websites
LIMIT 2;
# 选取 name 以字母 "k" 结尾的所有客户:
SELECT *
FROM Websites
WHERE name LIKE '%k';
# 选取 name 为 "Google" 或 "微博" 的所有网站:
SELECT *
FROM Websites
WHERE name IN ('Google','微博');
# 选取 alexa 介于 1 和 15 之间的所有网站:
SELECT * FROM Websites
WHERE alexa BETWEEN 1 AND 15;
# 显示不在1-15范围内的网站,请使用 NOT BETWEEN:
SELECT * FROM Websites
WHERE alexa NOT BETWEEN 1 AND 15;
# 选取 alexa 介于 1 和 15 之间但 country 不为 USA 和 IND 的所有网站
SELECT * FROM Websites
WHERE (alexa BETWEEN 1 AND 15) AND country NOT IN ('USA', 'IND');
# 选取 name 以介于 'A' 和 'H' 之间字母开始的所有网站
SELECT * FROM Websites
WHERE name BETWEEN 'A' AND 'H';
# 选取 name 不介于 'A' 和 'H' 之间字母开始的所有网站:
SELECT * FROM Websites
WHERE name NOT BETWEEN 'A' AND 'H';
4,别名
可以为表名称或列名称指定别名。通过使用 SQL,可以为表名称或列名称指定别名。基本上,创建别名是为了让列名称的可读性更强。
--列的 SQL 别名语法--
SELECT column_name AS alias_name
FROM table_name;
--表的 SQL 别名语法--
SELECT column_name(s)
FROM table_name AS alias_name;
# 指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。提示:如果列名称包含空格,要求使用双引号或方括号:
SELECT name AS n, country AS c
FROM Websites;
# 把三个列(url、alexa 和 country)结合在一起,并创建一个名为 "site_info" 的别名:
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;
5,SQL JOIN 子句
- SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
- 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行。
--语法:--
SELECT column1, column2, ...
FROM table1
JOIN table2 ON condition;
--参数说明:--
column1, column2, ...:要选择的字段名称,可以为多个字段。如果不指定字段名称,则会选择所有字段。
table1:要连接的第一个表。
table2:要连接的第二个表。
condition:连接条件,用于指定连接方式。
--创建新表--
create table access_log
(
aid int comment '辅助',
site_id int comment '网站序号',
count int comment '总数',
date varchar(20) comment '日期'
)
comment '访问记录';
--增加表信息--
insert into access_log(aid, site_id, count, date)
values (1,1,45,'2026-05-10'),
(2,3,125,'2026-05-13'),
(3,1,230,'2026-05-14'),
(4,2,15,'2026-05-16'),
(5,4,640,'2026-05-17'),
(6,1,334,'2026-05-19'),
(7,2,368,'2026-05-20'),
(8,1,545,'2026-05-22'),
(9,3,302,'2026-05-26');
/*"Websites" 表中的 "id" 列指向 "access_log" 表中的字段 "site_id"。上面这两个表是通过 "site_id" 列联系起来的。然后,如果我们运行下面的 SQL 语句(包含 INNER JOIN)*/
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;
-
注意:不同的 SQL JOIN,在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:
- INNER JOIN:如果表中有至少一个匹配,则返回行;
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行;
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行;
- FULL JOIN:只要其中一个表中存在匹配,则返回行。
6,INNER JOIN 关键字
INNER JOIN 关键字在表中存在至少一个匹配时返回行。
--SQL INNER JOIN 语法--
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
或:
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name=table2.column_name;
--参数说明:--
columns:要显示的列名。
table1:表1的名称。
table2:表2的名称。
column_name:表中用于连接的列名。
注释:INNER JOIN 与 JOIN 是相同的。
--创建新表1--
create table access_log
(
aid int comment '辅助',
site_id int comment '网站序号',
count int comment '总数',
date varchar(20) comment '日期'
)
comment '访问记录';
--增加表1信息--
insert into access_log(aid, site_id, count, date)
values (1,1,45,'2026-05-10'),
(2,3,125,'2026-05-13'),
(3,5,230,'2026-05-14'),
(4,2,15,'2026-05-16'),
(5,4,640,'2026-05-17'),
(6,1,334,'2026-05-19'),
(7,2,368,'2026-05-20'),
(8,6,545,'2026-05-22'),
(9,3,302,'2026-05-26');
----创建新表2--
create table websites
(
id int comment '序号',
name varchar(50) comment '网站名称',
url char(50) comment '网址',
alexa int comment '排名',
country varchar(10) comment '国家'
)
comment '网站表';
--增加表2信息--
insert into websites (id, name, url, alexa, country)
values (1,'Google','https://www.google.cm/',1,'USA'),
(2,'淘宝','https://www.taobao.com/',12,'CN'),
(3,'Facebook','https://www.facebook.com/',3,'USA'),
(4,'微博','http://www.weibo.com/',19,'CN'),
(5,'腾讯','https://www.qq.com',29,'CN'),
(6,'stackoverflow','http://stackoverflow.com/',0,'IND');
/*情况一:请注意,"Websites" 表中的 "id" 列指向 "access_log" 表中的字段 "site_id"。上面这两个表是通过 "site_id" 列联系起来的*/
# 然后,如果我们运行下面的 SQL 语句(包含 INNER JOIN):
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;
--情况二:下面的 SQL 语句将返回所有网站的访问记录--
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count;
使用 join 时,on 和 where 条件的区别如下:
1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
7,LEFT JOIN 关键字
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
--LEFT JOIN 语法--
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
--或--
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
--注释:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。--
-- Websites 作为左表,access_log 作为右表--
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id
ORDER BY access_log.count DESC;
8,RIGHT JOIN 关键字
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
-- RIGHT JOIN 语法--
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
--或--
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
--注释:在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN--
--把 Websites 作为左表,access_log 作为右表--
SELECT websites.name, access_log.count, access_log.date
FROM websites
RIGHT JOIN access_log
ON access_log.site_id=websites.id
ORDER BY access_log.count DESC;
9,FULL OUTER JOIN 关键字
FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
--FULL OUTER JOIN 语法--
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
MySQL中不支持 FULL OUTER JOIN,可以在 SQL Server使用。
- (table1) inner join (table2). 取交集。
- (table1) left join (table2) . 取 A 全部,B 没有对应的值为 null。
- (table1) right join (table2). 取 B 全部 A 没有对应的值为 null。
- (table1)full outer join (table2). 取并集,彼此没有对应的值为 null。
- 对应条件写在 on 后面。
10,UNION 操作符
UNION 操作符合并两个或多个 SELECT 语句的结果。UNION 操作符用于合并两个或多个 SELECT 语句的结果集。UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
--UNION 语法--
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
--注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL--
--UNION ALL 语法--
SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;
--注释:UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名--
11,SELECT INTO 语句
通过 SQL,您可以从一个表复制信息到另一个表。SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。
/*注意:
MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。
当然你可以使用以下语句来拷贝表结构及数据*/
CREATE TABLE 新表
AS
SELECT * FROM 旧表
--SELECT INTO 语法--
我们可以复制所有的列插入到新表中:
SELECT *
INTO newtable [IN externaldb]
FROM table1;
--或者只复制希望的列插入到新表中--
SELECT column_name(s)
INTO newtable [IN externaldb]
FROM table1;
--新表将会使用 SELECT 语句中定义的列名称和类型进行创建。您可以使用 AS 子句来应用新名称--
12,INSERT INTO SELECT 语句
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。
--从一个表中复制所有的列插入到另一个已存在的表中--
INSERT INTO table2
SELECT * FROM table1;
--或者我们可以只复制指定的列插入到另一个已存在的表中--
INSERT INTO table2
(column_name(s))
SELECT column_name(s)
FROM table1;
--举例1:复制表 "students" 中的数据插入到 表"courses" 中--
INSERT INTO courses (name, country)
SELECT student_name, country FROM students;
--举例2:复制 id=1 的数据到表"courses" 中--
INSERT INTO courses (name, country)
SELECT student_name, country FROM students
WHERE id=1;
13,CREATE DATABASE 语句
CREATE DATABASE 语句用于创建数据库。
--CREATE DATABASE 语法--
CREATE DATABASE dbname;
--举例:下面的 SQL 语句创建一个名为 "my_db" 的数据库--
CREATE DATABASE my_db;
--数据库表可以通过 CREATE TABLE 语句来添加--
14,CREATE TABLE 语句
CREATE TABLE 语句用于创建数据库中的表。表由行和列组成,每个表都必须有个表名。
--CREATE TABLE 语法--
CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
/*column_name 参数规定表中列的名称
data_type 参数规定列的数据类型(例如 varchar、integer、decimal、date 等等)。
size 参数规定表中列的最大长度。*/
15,约束(Constraints)
SQL 约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。
CREATE TABLE + CONSTRAINT 语法
CREATE TABLE table_name
(
column_name1 data_type(size) constraint_name,
column_name2 data_type(size) constraint_name,
column_name3 data_type(size) constraint_name,
....
);
在 SQL 中,有如下约束:
- NOT NULL - 指示某列不能存储 NULL 值。
- UNIQUE - 保证某列的每行必须有唯一的值。
- PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
- FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
- CHECK - 保证列中的值符合指定的条件。
- DEFAULT - 规定没有给列赋值时的默认值。
(1) NOT NULL 约束
NOT NULL 约束强制列不接受 NULL 值。NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。
---举例:强制 "ID" 列、"LastName" 列以及 "FirstName" 列不接受 NULL 值--
CREATE TABLE Persons (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Age int
);
--添加 NOT NULL 约束:在一个已创建的表的 "Age" 字段中添加 NOT NULL 约束--
ALTER TABLE Persons
MODIFY Age int NOT NULL;
--删除 NOT NULL 约束:在一个已创建的表的 "Age" 字段中删除 NOT NULL 约束如下所示--
ALTER TABLE Persons
MODIFY Age int NULL;
(2)UNIQUE 约束
UNIQUE 约束唯一标识数据库表中的每条记录。UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
--在 "Persons" 表创建时在 "P_Id" 列上创建 UNIQUE 约束:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
UNIQUE (P_Id)
)
--ALTER TABLE 时的 SQL UNIQUE 约束:当表已被创建时,如需在 "P_Id" 列创建 UNIQUE 约束--
ALTER TABLE Persons
ADD UNIQUE (P_Id)
--如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法--
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
--撤销 UNIQUE 约束:如需撤销 UNIQUE 约束,请使用下面的 SQL--
ALTER TABLE Persons
DROP INDEX uc_PersonID
(3)PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。主键必须包含唯一的值。主键列不能包含 NULL 值。每个表都应该有一个主键,并且每个表只能有一个主键。
--情况一:创建表时的 SQL PRIMARY KEY 约束--
-- 在 "Persons" 表创建时在 "P_Id" 列上创建 PRIMARY KEY 约束--
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)
--如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束,请使用下面的 SQL 语法--
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
/*注释:在上面的实例中,只有一个主键 PRIMARY KEY(pk_PersonID)。然而,pk_PersonID 的值是由两个列(P_Id 和 LastName)组成的*/