SQL基础之总结篇

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)组成的*/

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值