❤️💕💕数据库的高级指南,如何在 MySQL、SQL Server、MS Access、Oracle、Sybase、Informix、Postgres 和其他数据库系统中使用 SQL,如何从头实现一个数据库系统,我们开始吧!Myblog:http://nsddd.top
[TOC]
我们通过SQL对数据库进行增删改查
- SQL 代表结构化查询语言
- SQL 允许您访问和操作数据库
- SQL 于 1986 年成为美国国家标准协会 (ANSI) 的标准,并于 1987 年成为国际标准化组织 (ISO) 的标准
- SQL 可以对数据库执行查询
- SQL 可以从数据库中检索数据
- SQL可以在数据库中插入记录
- SQL 可以更新数据库中的记录
- SQL 可以从数据库中删除记录
- SQL 可以创建新的数据库
- SQL 可以在数据库中创建新表
- SQL可以在数据库中创建存储过程
- SQL 可以在数据库中创建视图
- SQL 可以设置表、过程和视图的权限
尽管 SQL 是 ANSI/ISO 标准,但 SQL 语言有不同的版本。
但是,为了符合 ANSI 标准,它们都以类似的方式至少支持主要命令(例如
SELECT
,UPDATE
,DELETE
,INSERT
,WHERE
)
SELECT
- 从数据库中提取数据UPDATE
- 更新数据库中的数据DELETE
- 从数据库中删除数据INSERT INTO
- 将新数据插入数据库CREATE DATABASE
- 创建一个新的数据库ALTER DATABASE
- 修改数据库CREATE TABLE
- 创建一个新表ALTER TABLE
- 修改表DROP TABLE
- 删除一个表CREATE INDEX
- 创建索引(搜索键)DROP INDEX
- 删除索引
-
查看客户表
SELECT * FROM Customers;
-
选择
select
SELECT column1, column2, ... FROM table_name; select * from table_name; #选择所有
-
过滤
WHERE
SELECT column1, column2, ... FROM table_name WHERE condition; SELECT * FROM Customers WHERE Country='Mexico'; #选择所有国家为墨西哥的
**注意:**子句
WHERE
不仅用在SELECT
语句中,也用在UPDATE
,DELETE
等! -
AND、OR 和 NOT 运算符
# and -- 与 表示都满足 SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2 AND condition3 ...; # or -- 或 表示满足其中一个 SELECT column1, column2, ... FROM table_name WHERE condition1 OR condition2 OR condition3 ...; # NOT -- 非 表示如果条件不为真,操作员将显示一条记录 SELECT column1, column2, ... FROM table_name WHERE NOT condition; # “非”案例 -- 从“客户表”中选择“国家”不是“德国”的所有字段 SELECT * FROM Customers WHERE NOT Country='Germany'; # 案例 -- 从“客户表”中选出所有国家/地区为“德国”且城市必须为“柏林”或“慕尼黑”的字段(使用括号构成复杂表达式 SELECT * FROM Customers WHERE Country='Germany' AND (City='Berlin' OR City='München');
-
排序
ORDER BY
SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;
默认情况下,
ORDER BY
关键字按升序对记录进行排序。要按降序对记录进行排序,请使用DESC
关键字。 -
插入数据
INSERT INTO
- 第一种编写格式 – key value 一一对应
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
- 第二种编写格式 — 请确保值的顺序与表中列的顺序相同。
INSERT INTO table_name VALUES (value1, value2, value3, ...);
-
插入案例
# 在“客户”表中插入一条新记录 INSERT INTO Customers (CustomerName, ContactName, Address, City, PostalCode, Country) VALUES ('Cardinal', 'Tom B. Erichsen', 'Skagen 21', 'Stavanger', '4006', 'Norway');
-
NULL
值具有
NULL
值的字段是没有值的字段。如果表中的字段是可选的,则可以插入新记录或更新记录而不向该字段添加值。然后,该字段将保存为
NULL
值。注意:
NULL
值不同于零值或包含空格的字段。具有NULL
值的字段是在记录创建期间留空的字段! -
测试NUll值
# IS NULL 语法 -- 具有NULL的所用名称 SELECT column_names FROM table_name WHERE column_name IS NULL; # IS NOT NULL 语法 -- 不具有NULL的所用名称 SELECT column_names FROM table_name WHERE column_name IS NOT NULL;
-
更新
update
# 该UPDATE语句用于修改表中的现有记录 UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
**注意:**更新表中的记录时要小心!注意
WHERE
语句中的子句UPDATE
。该WHERE
子句指定应该更新哪些记录。如果省略该WHERE
子句,则表中的所有记录都将被更新! -
删除表中的现有数据
DELETE FROM table_name WHERE condition; # 删除所用行 -- 注意:表没有被删除 delete from table_name #从“客户”表中删除客户名字是:“Alfreds Futterkiste”: DELETE FROM Customers WHERE CustomerName='Alfreds Futterkiste';
-
MIN()
和MAX()
函数# MIN() SELECT MIN(column_name) FROM table_name WHERE condition; # MAX() SELECT MAX(column_name) FROM table_name WHERE condition;
-
COUNT()
、AVG()
和SUM()
函数# count函数 -- 该COUNT()函数返回与指定条件匹配的行数 SELECT COUNT(column_name) FROM table_name WHERE condition; # avg函数 -- 该AVG()函数返回数值列的平均值 SELECT AVG(column_name) FROM table_name WHERE condition; # sum函数 -- 该SUM()函数返回数值列的总和 SELECT SUM(column_name) FROM table_name WHERE condition; ## 案例:查找“OrderDetails”表中“Quantity”字段的总和 SELECT SUM(Quantity) FROM OrderDetails;
-
LIKE
运算符在子句WHERE
中用于搜索列中的指定模式有两个通配符经常与
LIKE
运算符一起使用- 百分号 (%) 表示零个、一个或多个字符
- 下划线符号 (_) 代表一个,单个字符
SELECT column1, column2, ... FROM table_name WHERE columnN LIKE pattern; # 选择 CustomerName 以“a”开头的所有客户: SELECT * FROM Customers WHERE CustomerName LIKE 'a%'; # 选择 CustomerName 以“a”结尾的所有客户: SELECT * FROM Customers WHERE CustomerName LIKE '%a'; # 第二个位置有‘r’的所有用户 SELECT * FROM Customers WHERE CustomerName LIKE '_r%'; # 以‘a'开头,以'o'结尾的所用客户 SELECT * FROM Customers WHERE ContactName LIKE 'a%o';
-
使用
[charlist]
通配符# 选择a - c开头的所有用户 SELECT * FROM Customers WHERE City LIKE '[a-c]%'; # 选择不以 a - c开头的所有用户 SELECT * FROM Customers WHERE City LIKE '[!a-c]%'; # 选择城市以“b”、“s”或“p”开头, 以“b”、“s”或“p”结尾 的所有客户: SELECT * FROM Customers WHERE City LIKE '[bsp]%[bsp';
-
IN
运算符 – 允许您在一个子句中指定多个值WHERE
SELECT column_name(s) FROM table_name WHERE column_name IN (value1, value2, ...); # 或者: SELECT column_name(s) FROM table_name WHERE column_name IN (SELECT STATEMENT); # 国家在德国,而且 邮政编码 大于 60000 的表 SELECT * FROM Customers WHERE Country IN ('Germany') and PostalCode > 60000; # 选择与供应商来自同一国家(而且是UK)的所有客户的: SELECT * FROM Customers WHERE Country IN (SELECT Country FROM Suppliers WHERE Country = "UK");
-
BETWEEN
运算符BETWEEN
运算符选择给定范围内的值。这些值可以是数字、文本或日期。BETWEEN
运算符是包容性 的:包括开始值和结束值。
SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2; # 选择产品价格不在 10 ~ 20 之间的所用产品 SELECT * FROM Products WHERE Price NOT BETWEEN 10 AND 20; # 选择价格在 10 到 20 编号 > 50 且不显示 CategoryID 为 1、2 或 3 的产品: SELECT * FROM Products WHERE Price BETWEEN 10 AND 20 AND CategoryID NOT IN (1,2,3) AND ProductID > 50;
- 别名通常用于使列名更具可读性。
- 别名仅在该查询期间存在。
- 使用
AS
关键字创建别名。SQL别名
SQL别名
# 别名列语法
SELECT column_name AS alias_name
FROM table_name;
# 别名表语法
SELECT column_name(s)
FROM table_name AS alias_name;
创建两个别名,一个用于 CustomerID 列,一个用于 CustomerName 列:
SELECT CustomerID AS ID, CustomerName AS Customer
FROM Customers;
**注意:**如果别名包含空格,则需要双引号或方括号:
SELECT CustomerName AS Customer, ContactName AS [Contact Person] FROM Customers;
CustomerID=4(Around the Horn)的客户的所有订单。我们使用“Customers”和“Orders”表,并分别赋予它们“c”和“o”的表别名(这里我们使用别名使SQL更短)
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerName='Around the Horn' AND c.CustomerID=o.CustomerID;
o.OrderID
表示是选择o
表中的OederID
字段。替换表中字段的名称,表中字段别名是要加as
Orders AS o
起别名为o
后Orders
表名称就不能用了,后面必须用o
我们需要将数据库分页显示
select 字段列表 from 表名 limit 起始索引 , 查询条目数
从0开始查询三条数据
select * from stu limit 0, 3;
每页显示三条数据,查询第二页数据
select * from stu limit 3, 3;
可以看到后面的数字,就是每页显示的数据,前面的数值是动态计算的
可以推出起始索引:
(当前索引) - 1 × 每页显示的条数
CREATE DATABASE databasename;
以下 SQL 语句创建一个名为“testDB”的数据库:
CREATE DATABASE testDB;
DROP DATABASE testDB;
到目前为止,我了解了很多的数据库备份的方式
- 第三方平台备份(方便简单适合小白)
- 数据库提供的备份
- shell实现备份(一切皆为文件,一切皆可备份)
- docker容器卷,也可以实现备份
BACKUP DATABASE
语句在 SQL Server 中用于创建现有 SQL 数据库的完整备份。
句法
BACKUP DATABASE databasename
TO DISK = 'filepath';
SQL BACKUP WITH DIFFERENTIAL
语句差异备份仅备份自上次完整数据库备份以来已更改的数据库部分。
句法
BACKUP DATABASE databasename
TO DISK = 'filepath'
WITH DIFFERENTIAL;
以下 SQL 语句将现有数据库“testDB”完整备份到 D 盘:
BACKUP DATABASE testDB
TO DISK = 'D:\backups\testDB.bak';
以下 SQL 语句创建数据库“testDB”的差异备份:
BACKUP DATABASE testDB
TO DISK = 'D:\backups\testDB.bak'
WITH DIFFERENTIAL;
CREATE TABLE
语句用于在数据库中创建新表。
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
列参数指定表的列的名称。
datatype 参数指定列可以保存的数据类型(例如,varchar、integer、date 等)。
#以下示例创建一个名为“Persons”的表,其中包含五列:PersonID、LastName、FirstName、Address 和 City:
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
也可以使用创建现有表的副本 CREATE TABLE
。
新表获得相同的列定义。可以选择所有列或特定列。
如果您使用现有表创建新表,则新表将使用旧表中的现有值填充。
以下 SQL 创建了一个名为“TestTables”的新表(它是“Customers”表的副本):
CREATE TABLE TestTable AS
SELECT customername, contactname
FROM customers;
该DROP TABLE
语句用于删除数据库中的现有表。
DROP TABLE table_name;
该TRUNCATE TABLE
语句用于删除表内的数据,而不是表本身。
TRUNCATE TABLE table_name;
该ALTER TABLE
语句用于添加、删除或修改现有表中的列。
该ALTER TABLE
语句还用于在现有表上添加和删除各种约束。
要在表中添加列,请使用以下语法:
ALTER TABLE table_name
ADD column_name datatype;
以下 SQL 将“电子邮件”列添加到“客户”表:
ALTER TABLE Customers
ADD Email varchar(255);
删除“Persons”表中名为“DateOfBirth”的列。
ALTER TABLE Persons
DROP COLUMN DateOfBirth;
案例
ALTER TABLE Customers
DROP COLUMN Email;
要更改表中列的数据类型,请使用以下语法:
My SQL / Oracle(10G 之前的版本):
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
查看“人员”表:
ID | LastName | FirstName | Address | City |
---|---|---|---|---|
1 | Hansen | Ola | Timoteivn 10 | Sandnes |
2 | Svendson | Tove | Borgvn 23 | Sandnes |
3 | Pettersen | Kari | Storgt 20 | Stavanger |
现在我们要在“Persons”表中添加一个名为“DateOfBirth”的列。
我们使用以下 SQL 语句:
ALTER TABLE Persons
ADD DateOfBirth date;