SQL|青训营笔记

166 阅读11分钟

这是我参与「第四届青训营 」笔记创作活动的第12天

SQL

1、数据库(DataBase/DB):用于存储和管理数据的仓库

数据库特点:

  • 持久化存储数据。其实数据库就是一个文件系统
  • 方便存储和管理数据
  • 使用了统一的方式操作数据库--SQL

2、SQL(Structured Query Language):结构化查询语言,使我们有能力访问数据库

其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”

3、SQL通用语法:

  • SQL语句可以单行或多行书写,以分号结尾

  • 可使用空格和缩进来增强语句的可读性

  • MySQL数据库的SQL语句不区分大小写,关键字建议使用大写

  • 3种注释:

    1. 单行注释:-- 注释内容(两个横杠一个空格)或# 注释内容(MySQL特有)
    2. 多行注释:/*注释 */
  • 注:SQL对大小写不敏感

4、数据库表

一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”)。表包含带有数据的记录(行)。

下面的例子是一个名为 "Persons" 的表:

IDLASTNAMEFIRSTNAMEADDRESSCITY
1AdamsJohnOxford StreetLondon
2BushGeorgeFifth AvenueNew York
3CarterThomasChangan StreetBeijing

上面的表包含三条记录(每一条对应一个人)和五个列(Id、姓、名、地址和城市)。

4、SQL分类:

可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。

  • DDL(操作数据库、表):数据定义语言,用来定义数据库对象:数据库,表,关键字:create,drop,alter等

    SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。

    SQL 中最重要的 DDL 语句:

    • CREATE DATABASE - 创建新数据库
    • ALTER DATABASE - 修改数据库
    • CREATE TABLE - 创建新表
    • ALTER TABLE - 变更(改变)数据库表
    • DROP TABLE - 删除表
    • CREATE INDEX - 创建索引(搜索键)
    • DROP INDEX - 删除索引
  • DQL(查询表中数据):数据查询语言,用来查询数据库中表的记录(数据)。关键字:select,where等

  • DML(增删改表中的数据):数据操作语言,用来对数据库中表的数据进行增删改,关键字:insert,delete,update等

    查询和更新指令构成了 SQL 的 DML 部分:

    • SELECT - 从数据库表中获取数据
    • UPDATE - 更新数据库表中的数据
    • DELETE - 从数据库表中删除数据
    • INSERT INTO - 向数据库表中插入数据
  • DCL(授权):数据控制语言(了解),用来定义数据库的访问权限和安全级别,及创建用户,关键字:GRANT,REVOKE等

5、DDL:操作数据库、表

  • 创建:

    1. 创建数据库:create database 数据库名称
    2. 创建数据库:判断不存在,再创建
    3. create database if not exists 数据库名称;
    4. 创建数据库,并指定字符集
    5. create database 数据库名称 character set 字符集名;
  • 查询:

    1. 查询所有数据库名称:show databases;

    2. 查询某个数据库的字符集:查询某个数据库的创建语句

      show create database 数据库名称

  • 删除:

    1. 删除数据库:drop database 数据库名称;

    2. 判断数据库存在,存在再删除

      drop database if exists 数据库名称;

  • 使用数据库:

    1. 查询当前正在使用的数据库名称:select database();
    2. 使用数据库:use 数据库名称;

操作表:

  • 创建:Create table 表名{

    列名1,数据类型1,

    列名2,数据类型2,

    ……

    列名n,数据类型n}

    注意:最后一列不需要加逗号(,)

    1. 数据库类型:

      1.int :整数类型:age int,

      2.double:小数类型:score double(5,2)

      3.date:日期,只包含年月日,yyy-MM-dd

      4.datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm-dd

      5.timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd

      HH:mm:ss

    注:如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值

    6.varchar:字符串

    name varchar(20):姓名最大20个字符

    zhangsan 8个字符 张三 2个字符

    eg:创建表

    create table student(

    id int,

    name varchar(32),

    age int,

    score double(4,1),

    birthday date,

    insert_time_timestamp

    );

    复制表:

    create table 表名 like 被复制的表名;

  • 查询:

    1. 查询某个数据库中所有表名称:show tables;
    2. 查询表结构:desc 表名;
  • 删除:drop table 表名;

    drop table if exists 表名;

  • 修改:

    1.修改表名:

    alter table 表名 rename to 新的表名;

    2.修改表的字符集:

    alter table 表名 character set 字符集名称;

    3.添加一列:

    alter table 表名 add 列名 数据类型;

    4.修改列名称 类型:

    alter table 表名 change 列名 新列别 新数据类型;

    alter table 表名 modify 列名 新数据类型;

    5.删除列:

    alter table 表名 drop 列名;

6、DML:增删改表中数据

1.添加数据:

insert into 表名(列名1,列名2,……列名n)values(值1,值2,……值n);

注意:

  1. 列名和值要一一对应

  2. 如果表名后,不定义列名,则默认给所有列添加值:

    insert into 表名 values (值1,值2,……值n);

  3. 除了数字类型,其他类型需要使用

2.删除数据:

delete from 表名{where 条件}

注意:

  1. 如果不加条件,则删除表中所有记录

  2. 如果要删除所有记录

    1. delete from 表名;--不推荐使用,有多少条记录就会执行多少次删除操作

    2. TRUNCATE TABLE 表名;-- 推荐使用,效率更高,先删除表,然后再创建一张一样的表

    3. delete和drop区别:

      delete删除表数据

      drop删除表结构和数据库

3、修改数据:

update 表名 set 列名1=值1,列名2=值2,……{where 条件};

注意:如果不加任何条件,则会将表中所有记录全部修改

7、DQL:查询语句

  • 基础查询:

1.多个字段的查询:

select 字段名1,字段名2,……from 表名;

注意:如果查询所有字段,则可以使用*来替代字段列表

2.去除重复:

distinct

3.计算列:

一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)

ifnull(表达式1,表达式2):null参与的运算,计算结果都为null

表达式1:哪个字段需要判断是否为null

如果该字段为null后的替换值

4.起别名:as:as也可以省略

  • 条件查询:

    1.where子句后跟条件

    2.运算符

    • *>、<、<=,>=,=,<>

    • BETEEN...AND

    • IN(集合)

    • LIKE

      _:单个任意字符

      %:多个任意字符

    • IS NULL

    • and 或&&

    • or 或||

    • not | 或!

    eg:查询年龄大于20岁:

    SELECT_FROM student WHERE age>20;

  • DQL:查询语句

排序查询

order by 子句

order by 排序字段1,排序方式1, 排序字段1,排序方式2……

排序方式:

ASC:升序,默认的

DESC:降序

注意:如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件

2.聚合函数:将一列数据作为一个整体,进行纵向的计算

  • count:计算个数

    一般选择非空的列:主键

    count(* )

  • max:计算最大值

  • min:计算最小值

  • sum:计算和

  • avg:计算平均值

注意:聚合函数的计算,排除null值

解决方案:

  • 选择不包含非空的列进行计算
  • IFNULL函数

3.分组查询

语法:group by 分组字段;

注意:

  • 分组之后查询的字段:分组函数,聚合函数

  • where和having'的区别:

    1.where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来

    2.where后不可以跟聚合函数,having可以进行聚合函数的判断

4.分页查询

  • 语法:limit 开始的索引,每页查询的条数;

  • 公式:开始的索引=(当前的页码-1)* 每页显示的条数

    eg:

    SELECT * FROM student LIMIT 0,3 - - 第1页

    SELECT * FROM student LIMIT 3,3 - - 第2页

    SELECT * FROM student LIMIT 6,3 - - 第3页

  • limit 是一个MySQL“方言”

5.SQL SELECT 语句

SELECT 语句用于从表中选取数据。

结果被存储在一个结果表中(称为结果集)。

SQL SELECT 语法

SELECT 列名称 FROM 表名称

以及:

SELECT * FROM 表名称

注释: SQL 语句对大小写不敏感。SELECT 等效于 select。

6.SQL SELECT DISTINCT 语句

在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。

关键词 DISTINCT 用于返回唯一不同的值。

语法:

SELECT DISTINCT 列名称 FROM 表名称

7、WHERE 子句

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。

语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

下面的运算符可在 WHERE 子句中使用:

操作符描述
=等于
<>不等于
大于
<小于
>=大于等于
<=小于等于
BETWEEN在某个范围内
LIKE搜索某种模式

注: 在某些版本的 SQL 中,操作符 <> 可以写为 !=。

eg:使用 WHERE 子句

如果只希望选取居住在城市 "Beijing" 中的人,我们需要向 SELECT 语句添加 WHERE 子句:

SELECT * FROM Persons WHERE City='Beijing'

引号的使用

请注意,我们在例子中的条件值周围使用的是单引号。

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

文本值:

这是正确的:
SELECT * FROM Persons WHERE FirstName='Bush'
​
这是错误的:
SELECT * FROM Persons WHERE FirstName=Bush

数值:

这是正确的:
SELECT * FROM Persons WHERE Year>1965
​
这是错误的:
SELECT * FROM Persons WHERE Year>'1965'

8、AND 和 OR 运算符:

用于基于一个以上的条件对记录进行过滤。

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。

如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录

AND 运算符实例

使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人:

SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'

9、SQL ORDER BY 子句

ORDER BY 语句用于对结果集进行排序。

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照大小升序/字母表顺序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

例子:

原始的表 :

Orders 表:

COMPANYORDERNUMBER
IBM3532
W3School2356
Apple4698
W3School6953

实例 1

以字母顺序显示公司名称:

SELECT Company, OrderNumber FROM Orders ORDER BY Company

结果:

COMPANYORDERNUMBER
Apple4698
IBM3532
W3School6953
W3School2356

实例 2

以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):

SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber

结果:

COMPANYORDERNUMBER
Apple4698
IBM3532
W3School2356
W3School6953

实例 3

以逆字母顺序显示公司名称:

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC

结果:

COMPANYORDERNUMBER
W3School6953
W3School2356
IBM3532
Apple4698

实例 4

以逆字母顺序显示公司名称,并以数字顺序显示顺序号:

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

结果:

COMPANYORDERNUMBER
W3School2356
W3School6953
IBM3532
Apple4698

注意: 在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。

10、SQL INSERT INTO 语句

INSERT INTO 语句用于向表格中插入新的行。

语法

INSERT INTO 表名称 VALUES (值1, 值2,....)

我们也可以指定所要插入数据的列:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

插入新的行

"Persons" 表:

LASTNAMEFIRSTNAMEADDRESSCITY
CarterThomasChangan StreetBeijing

SQL 语句:

INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

结果:

LASTNAMEFIRSTNAMEADDRESSCITY
CarterThomasChangan StreetBeijing
GatesBillXuanwumen 10Beijing

在指定的列中插入数据

"Persons" 表:

LASTNAMEFIRSTNAMEADDRESSCITY
CarterThomasChangan StreetBeijing
GatesBillXuanwumen 10Beijing

SQL 语句:

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

结果:

LASTNAMEFIRSTNAMEADDRESSCITY
CarterThomasChangan StreetBeijing
GatesBillXuanwumen 10Beijing
WilsonChamps-Elysees

11.SQL UPDATE 语句

Update 语句用于修改表中的数据。

语法:

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

Person:

LASTNAMEFIRSTNAMEADDRESSCITY
GatesBillXuanwumen 10Beijing
WilsonChamps-Elysees

更新某一行中的一个列

我们为 lastname 是 "Wilson" 的人添加 firstname:

UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson' 

结果:

LASTNAMEFIRSTNAMEADDRESSCITY
GatesBillXuanwumen 10Beijing
WilsonFredChamps-Elysees

更新某一行中的若干列

我们会修改地址(address),并添加城市名称(city):

UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'

结果:

LASTNAMEFIRSTNAMEADDRESSCITY
GatesBillXuanwumen 10Beijing
WilsonFredZhongshan 23Nanjing

12.SQL DELETE 语句

DELETE 语句用于删除表中的行。

语法

DELETE FROM 表名称 WHERE 列名称 =

Person:

LASTNAMEFIRSTNAMEADDRESSCITY
GatesBillXuanwumen 10Beijing
WilsonFredZhongshan 23Nanjing

删除某行

"Fred Wilson" 会被删除:

DELETE FROM Person WHERE LastName = 'Wilson' 

结果:

LASTNAMEFIRSTNAMEADDRESSCITY
GatesBillXuanwumen 10Beijing

删除所有行

可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:

DELETE FROM table_name

或者:

DELETE * FROM table_name