Skip to content

Latest commit

 

History

History
652 lines (436 loc) · 15.2 KB

File metadata and controls

652 lines (436 loc) · 15.2 KB

第3节 Sql基本语法

❤️💕💕数据库的高级指南,如何在 MySQL、SQL Server、MS Access、Oracle、Sybase、Informix、Postgres 和其他数据库系统中使用 SQL,如何从头实现一个数据库系统,我们开始吧!Myblog:http://nsddd.top


[TOC]

前言

sql简介

我们通过SQL对数据库进行增删改查

什么是 SQL?

  1. SQL 代表结构化查询语言
  2. SQL 允许您访问和操作数据库
  3. SQL 于 1986 年成为美国国家标准协会 (ANSI) 的标准,并于 1987 年成为国际标准化组织 (ISO) 的标准

SQL能做什么?

  1. SQL 可以对数据库执行查询
  2. SQL 可以从数据库中检索数据
  3. SQL可以在数据库中插入记录
  4. SQL 可以更新数据库中的记录
  5. SQL 可以从数据库中删除记录
  6. SQL 可以创建新的数据库
  7. SQL 可以在数据库中创建新表
  8. SQL可以在数据库中创建存储过程
  9. SQL 可以在数据库中创建视图
  10. SQL 可以设置表、过程和视图的权限

尽管 SQL 是 ANSI/ISO 标准,但 SQL 语言有不同的版本。

但是,为了符合 ANSI 标准,它们都以类似的方式至少支持主要命令(例如 SELECT, UPDATE, DELETE, INSERT, WHERE)

一些最重要的 SQL 命令

  1. SELECT- 从数据库中提取数据
  2. UPDATE- 更新数据库中的数据
  3. DELETE- 从数据库中删除数据
  4. INSERT INTO- 将新数据插入数据库
  5. CREATE DATABASE- 创建一个新的数据库
  6. ALTER DATABASE- 修改数据库
  7. CREATE TABLE- 创建一个新表
  8. ALTER TABLE- 修改表
  9. DROP TABLE- 删除一个表
  10. CREATE INDEX- 创建索引(搜索键)
  11. 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';

SQL高级部分

  • 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';

    image-20220913171644130

  • 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");

    image-20220913172516210

    image-20220913173026540

  • 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;

    image-20220913173717601

SQL 别名用于为表或表中的列提供临时名称。

  • 别名通常用于使列名更具可读性。
  • 别名仅在该查询期间存在。
  • 使用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;

适用在sql语句中的别名

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起别名为oOrders表名称就不能用了,后面必须用o

image-20220913180009695

分页查询

我们需要将数据库分页显示

select 字段列表 from 表名 limit 起始索引 , 查询条目数

从0开始查询三条数据

select * from stu limit 0, 3;

每页显示三条数据,查询第二页数据

select * from stu limit 3, 3;

可以看到后面的数字,就是每页显示的数据,前面的数值是动态计算的

可以推出起始索引:(当前索引) - 1 × 每页显示的条数

sql数据库操作

创建数据库

CREATE DATABASE databasename;

以下 SQL 语句创建一个名为“testDB”的数据库:

CREATE DATABASE testDB;

删除数据库

DROP DATABASE testDB;

数据库备份

到目前为止,我了解了很多的数据库备份的方式

  • 第三方平台备份(方便简单适合小白)
  • 数据库提供的备份
  • shell实现备份(一切皆为文件,一切皆可备份)
  • docker容器卷,也可以实现备份

BACKUP DATABASE

BACKUP DATABASE语句在 SQL Server 中用于创建现有 SQL 数据库的完整备份。

句法

BACKUP DATABASE databasename
TO DISK = 'filepath';

SQL BACKUP WITH DIFFERENTIAL

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;

删除表

SQL DROP TABLE 语句

DROP TABLE语句用于删除数据库中的现有表。

DROP TABLE table_name;

SQL 截断表

TRUNCATE TABLE语句用于删除表内的数据,而不是表本身。

TRUNCATE TABLE table_name;

表更表 –ALTER

SQL ALTER TABLE 语句

ALTER TABLE语句用于添加、删除或修改现有表中的列。

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;

SQL ALTER TABLE 示例

查看“人员”表:

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;

END 链接