在使用 SELECT 语句检索表数据时,至少需要给出两条信息——想检索的列名(column_name)和被检索内容的表名(table_name)。
SELECT `column_name`
FROM `table_name`;
使用 SELECT COLUMN, COLUMN 查询多个列
当我们想要从一个表中查询多个列时,使用的 SELECT 语句与查询一个列时使用的语句相似,但是需要在 SELECT 关键字后给出多个列名,并且列名之间必须以逗号分隔。
SELECT `column_name_1`, `column_name_2`
FROM `table_name`;
使用 SELECT * 查询所有列
SELECT 语句可以直接检索表中所有信息,即检索所有的列。
SELECT * FROM `table_name`;
使用 SELECT DISTINCT 查询不同行
SELECT 语句会返回所有匹配的行,会遇到数据相同的情况。如果我们只想知道有哪些不同的值,即希望查询的值都是唯一不重复的.这时候我们就需要用到 DISTINCT
关键字。
SELECT DISTINCT `column_name`
FROM `table_name`
使用 SELECT WHERE 对行进行筛选过滤
SELECT WHERE
语句是筛选查询很重要的操作,WHERE
关键字后面加上条件可以过滤掉我们不需要的信息,对查询效率有着很大的提高。在使用 SELECT WHERE
语句检索表数据时,需要给出检索的表名 (table_name)、检索的列名 (column_name) 和操作符 (operator) 。
SELECT `column_name1`,`column_name2`…
FROM `table_name`
WHERE `column_name` operator `value`;
其中:
-
column_name 对应指定列的名称,或者是多列,用逗号(
,
)分隔开 -
table_name 对应查询表的名称
-
operator 为操作符,常用的有等于
=
、小于<
、大于>
、不等于<>
或!=
。
INSERT INTO 语句用于向表中插入新记录,这边介绍两种编写形式,第一种形式无需指定列名,第二种形式需要指定列名。
INSERT INTO `table_name`
VALUES (value1, value2, value3,...);
value1
, value2
…… 为对应插入数据表中的值,每个值的属性需要与对应表中的列名属性相匹配,而且需要把插入的信息填写完整,否则会报错。
INSERT INTO `table_name`
(`column1`, `column2`, `column3`,...)
VALUES (value1, value2, value3,...);
其中 column1
, column2
... 为指定的列名,value1
, value2
…… 为对应插入数据表中的值,每个值的属性需要与对应的列名属性相匹配。
在我们平时的使用中 UPDATE
语句,也是一种较常用的 SQL 语句,它可以用来更新表中已存在的记录。
UPDATE `table_name`
SET `column1`=value1,`column2`=value2,...
WHERE `some_column`=some_value;
简单的delete语句 使用 DELETE 删除数据注意
请注意 UPDATE 语句中的 WHERE 子句!WHERE 子句规定哪条记录或者哪些记录需要更新。如果您省略了 WHERE 子句,所有的记录都将被更新!
需要用到 DELETE
关键字对原有的数据进行删除
DELETE FROM `table_name`
WHERE `some_column` = `some_value`;
-
table_name
代表表名称 -
some_column
代表列名称,如id
-
some_value
可以为任意值。some_column
和some_value
构成 WHERE 子句中的搜索条件。
比较运算符用于比较运算,判断逻辑是否成立。
A operator B
其中 operator 是比较运算符,用于对 A
和 B
进行比较运算。
常用的比较运算符有 =
(等于) 、!=
(不等于)、 <>
(不等于)、<
(小于)、<=
(小于等于)、>
(大于)、>=
(大于等于),其中 !=
和 <>
在特殊情况下用法是不同的,这里暂时不提。
比较运算符常常与 WHERE 在一起使用。WHERE 用于逻辑判断,WHERE 后面写判断的条件,满足条件的语句会被筛选出来。
WHERE A operator B逻辑运算符 使用 AND 连接多条件
使用 SQL 中的逻辑运算符 AND 可以将 WHERE 子句中两个或两个以上的条件结合起来,其结果是满足 AND 连接的所有条件的数据。
SELECT `column_name`
FROM `table_name`
WHERE condition1 AND condition2;
使用 OR 连接多个条件其中:
condition
为设置的条件,最后返回的结果应为满足condition1
和condition2
的数据。
使用 SQL 中的逻辑运算符 OR 与 AND 关键字不同,OR 关键字,只要记录满足任意一个条件,就会被查询出来。
语法
SELECT `column_name`
FROM `table_name`
WHERE condition1 or condition2;
使用 NOT 过滤不满足条件的数据其中:
condition1
和condition2
为设置的条件,最后返回的结果应满足condition1
或condition2
的数据。
使用 SQL 中的逻辑运算符 NOT 可以过滤掉 WHERE 子句中不满足条件的结果集。
SELECT `column_name`
FROM `table_name`
WHERE NOT `condition`;
特殊条件 使用 IN 查询多条件其中:
condition
为设置的条件,最后返回的结果应不满足condition
。
当我们需要查询单个表条件过多时,就会用多个 'OR' 连接或者嵌套,这会比较麻烦,现在我们有 'IN' 能更方便的解决这一问题。
SELECT *使用 NOT IN 排除
FROM `table_name`
WHERE `column_name` IN `value`;
前面我们已经学习了逻辑运算符,这里的 'IN' 也可以与逻辑运算符 'NOT' 并用,组成 'NOT IN',表示不在集合中的所有结果。
SELECT *使用 BETWEEN AND 查询两值间的数据范围
FROM `table_name`
WHERE `column_name` NOT IN value;
BETWEEN AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!
在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。
在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段。
在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。
因此,请检查您的数据库是如何处理 BETWEEN 操作符!
SELECT *使用 IS NULL 查询空数据
FROM `table_name`
WHERE `column_name` BETWEEN `value` AND `value`;
NULL 值代表遗漏的未知数据。默认的,表的列可以存放 NULL 值。 如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。
NULL 用作未知的或不适用的值的占位符。
SELECT *使用 LIKE 模糊查询
FROM `table_name`
WHERE `column_name` IS NULL;
前面我们学习 BETWEEN AND 和比较运算符时,和文本操作类似,比如前面课程名称首字母的范围,这种方案虽然可行但是不稳定,不是直接对文本的操作。在这里我们学习使用 LIKE 更准确规范得解决文本比较问题。
LIKE 比较类似我们平时用到的搜索。
SELECT *
FROM `table_name`
WHERE `column_name` LIKE `value`;
其中 'D%' 表示以 D 开头的所有单词,% 表示为通配符,可以替代 0 个或多个字符
对于SQL 中的通配符有以下类型:
使用 ORDER BY 对数据进行排序
1. 使用 ORDER BY 对数据进行排序ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序,其具有 ASC(升序)和 DESC(降序)两个关键字,且默认按照升序排列。
-
ASC :按升序排列,ORDER BY 默认按照升序对记录进行排序,因此升序的关键字 ASC 可以省去不写。
-
DESC:按降序排列,如果需要按照降序对记录进行排序,可以使用 DESC 关键字。
基本语法
SELECT `column_name`, `column_name`使用 LIMIT 限制输出行数
FROM `table_name`
ORDER BY `column_name`, `column_name` ASC|DESC;
LIMIT 子句用于 SELECT 中,对输出结果集的行数进行约束,LIMIT 接收2个参数 offset 和 count,两个参数都是整型数字,但通常只用一个。
SELECT `column_name`, `column_name`
FROM `table_name`
LIMIT `offset` , `count`;
-
offset :是返回集的初始标注,起始点是0,不是1哦
-
count :制定返回的数量
平均函数 AVG() 是平均数 AVERAGE 的缩写,它用于求数值列的平均值。它可以用来返回所有列的平均值,也可以用来返回特定列和行的平均值。 具体的计算过程为:其通过对表中行数计数并计算特定数值列的列值之和,求得该列的平均值。
但是当参数 column_name
列中的数据均为空时,结果会返回 NULL。
SELECT AVG(`column_name`)使用 MAX() 函数返回指定列中的最大值
FROM `table_name`;
最大值函数 MAX() 用于返回指定列中的最大值。它只有一个参数 column_name
,表示指定的列名。但是当参数 column_name
列中的数据均为空时,结果会返回 NULL。
SELECT MAX(`column_name`)使用 MIN() 函数返回指定列中的最小值
FROM `table_name`;
MIN() 函数的功能与 MAX() 正好相反,它用于返回指定列中的最小值。但与 MAX() 相同的是,它也只有一个参数 column_name
,表示指定的列名,且当参数 column_name
列中的数据均为空时,结果会返回 NULL。
SELECT MIN(`column_name`)使用 SUM() 函数统计数值列的总数
FROM `table_name`;
SUM() 函数用于统计数值列的总数并返回其值。它只有一个参数 column_name
,表示指定的列名,但是当参数 column_name
列中的数据均为空时,结果会返回 NULL。
SELECT SUM(`column_name`)使用 ROUND() 函数将数值四舍五入
FROM `table_name`;
ROUND()
函数用于把数值字段舍入为指定的小数位数。
SELECT ROUND(`column_name`, `decimals`)
FROM `table_name`;
-
column_name 为要舍入的字段
-
decimals 规定要返回的小数位数
-
ROUND() 函数始终返回一个值。当 decimals 为正数时,column_name 四舍五入为 decimals 所指定的小数位数。当 decimals 为负数时,column_name 则按 decimals 所指定的在小数点的左边四舍五入。
-
特别的,如果 length 是负数且大于小数点前的数字个数,ROUND() 函数将返回 0
ROUND( X ):返回参数 X 四舍五入后的一个整数。
ROUND(X, D): 返回参数 X 四舍五入且保留 D 位小数后的一个数字。如果 D 为 0,结果将没有小数点或小数部分。
❗ 注意:ROUND()
返回值数据类型会被变换为一个 BIGINT 。
在本小节中,我们主要介绍 SQL 中的 ISNULL()
函数和 IFNULL()
函数,他们的用途都是判断字段是否为空,但是具体的用法有些差别。
ISNULL()
函数用于判断字段是否为 NULL,它只有一个参数 column_name
为列名,根据column_name
列中的字段是否为 NULL 值返回 0 或 1。
SELECT ISNULL(`column_name`)
FROM `table_name`;
-
如果
column_name
列中的某个字段是 NULL 则返回 1,不是则返回 0
IFNULL()
函数也用于判断字段是否为NULL,但是与 ISNULL()
不同的是它接收两个参数,第一个参数 column_name
为列名,第二个参数 value
相当于备用值。
SELECT IFNULL(`column_name`, `value`)
FROM `table_name`;
-
如果
column_name
列中的某个字段是 NULL 则返回 value 值,不是则返回对应内容。 -
COALESCE(column_name, value)
函数也用于判断字段是否为NULL,其用法和IFNULL()
相同。
COUNT() 函数用于计数,可利用其确定表中行的数目或者符合特定条件的行的数目。当COUNT() 中的参数不同时,其的用途也是有明显的不同的,主要可分为以下三种情况:COUNT(column_name) 、COUNT( * ) 和 COUNT(DISTINCT column_name) 。
COUNT(column_name) 函数会对指定列具有的行数进行计数,但是会除去值为 NULL 的行。该函数主要用于查看各列数据的数量情况,便于统计数据的缺失值。
假如出现某一列的数据全为 NULL 值的情况, 使用COUNT( column_name ) 函数对该列进行计数,会返回 0。
SELECT COUNT(`column_name`)
FROM `table_name`;
COUNT(*) 函数会对表中行的数目进行计数,包括值为 NULL 所在行和重复项所在行。该函数主要用于查看表中的记录数。
SELECT COUNT(*)
FROM `table_name`;
❗ 注意: COUNT(column_name) 与 COUNT(*) 的区别
-
COUNT(column_name) 中,如果
column_name
字段中的值为 NULL,则计数不会增加,而如果字段值为空字符串""
,则字段值会加 1 -
COUNT() 中,除非整个记录全为 NULL,则计数不会增加,如果存在某一个记录不为 NULL,或者为空字符串
""
,计数值都会加 1。正常来说,表都会有主键,而主键不为空,所以 COUNT() 在有主键的表中等同于 COUNT(PRIMARY_KEY),即查询有多少条记录。
-
NOW()
可以用来返回当前日期和时间 格式:YYYY-MM-DD hh:mm:ss -
CURDATE()
可以用来返回当前日期 格式:YYYY-MM-DD -
CURTIME()
可以用来返回当前时间 格式:hh:mm:ss
使用 DATE()、TIME() 函数提取日期和时间在使用
NOW()
和CURTIME()
时,如果要精确的秒以后的时间的话,可以在()中加数字,加多少,就表示精确到秒后多少位比如
NOW(3)
就是精确到毫秒,表示为:2021-03-31 15:27:20.645
SELECT DATE('2021-03-25 16:16:30') AS `date`,TIME('2021-03-25 16:16:30') AS `time`;EXTRACT() 函数提取指定的时间信息
+------------+----------+
| date | time |
+------------+----------+
| 2021-03-25 | 16:16:30 |
+------------+----------+
1 row in set
前面我们已经学习了 DATE 函数和 TIME 函数,明白 DATE 返回日期, TIME 返回时间,如果我只想知道年份的信息或者小时的信息,那么该怎么解决呢?这时,我们就可以使用 EXTRACT() 函数来解决问题。
EXTRACT() 函数用于返回日期/时间的单独部分,如 YEAR
(年)、MONTH
(月)、DAY
(日)、HOUR
(小时)、MINUTE
(分钟)、 SECOND
(秒)。
语法
SELECT EXTRACT(unit FROM date)
FROM `table`
table 是表格名
date 参数是合法的日期表达式。
unit 参数是需要返回的时间部分,如 YEAR
、MONTH
、 DAY
、 HOUR
、MINUTE
、SECOND
等。
DATE_FORMAT() 用法在一般情况下,
EXTRACT(unit FROM date)
与unit()
的结果相同。
我们在 SQL 中使用 DATE_FORMAT()
方法来格式化输出 date/time。 需要注意的是 DATE_FORMAT()
函数返回的是字符串格式。
语法
SELECT DATE_FORMAT(date,format);
date
一个有效日期。
format
是 date/time 的输出格式。
DATE_ADD()
函数是常用的时间函数之一,用于向日期添加指定的时间间隔。
SELECT DATE_ADD(date, INTERVAL expr type)
FROM table_name
-
date
指代希望被操作的有效日期,为起始日期 -
expr
是希望添加的时间间隔的数值(expr 是一个字符串,对于负值的间隔,可以以 ”-“ 开头) -
type
是具体的数据类型,表示加上时间间隔的单位(可以是 MICROSECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER , YEAR 等)
上一节了解过能够令时间加上几天、几小时的函数 DATE_ADD()
,对应的,当我们需要修改数据表中的时间,让时间减少几天、几年时,又该如何做呢?
我们同样可以使用相关的时间函数对时间进行修改。
DATE_SUB() 函数DATE_SUB() 函数是常用的时间函数之一,用于从日期减去指定的时间间隔。它与 DATE_ADD()
函数具有相似的用法。
SELECT DATE_SUB(date, INTERVAL expr type)
FROM table_name
-
date
指代希望被操作的有效日期 -
expr
是希望添加的时间间隔 -
type
是具体的数据类型(可以是 MICROSECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER , YEAR 等)
DATEDIFF() 常用的日期差,在 MySQL 中默认只能计算天数差。
DATEDIFF() 用法:DATEDIFF(时间1,时间2)
SELECT DATEDIFF(时间1,时间2) AS date_diff FROM courses;
DATEDIFF() 差值计算规则:时间 1 - 时间 2
date_diff
为返回结果列名称
NOT NULL 约束强制列不接受 NULL 值,强制字段始终包含值,这意味着,如果不向字段添加值,就无法插入新纪录或者更新记录。
下面的 SQL 强制 ID
列、 LastName
列以及 FirstName
列不接受 NULL 值:
CREATE TABLE `Persons` (
`ID` int NOT NULL,
`LastName` varchar(255) NOT NULL,
`FirstName` varchar(255) NOT NULL,
`Age` int
);
在一个已创建的表的 Age
字段中添加 NOT NULL 约束如下所示:
ALTER TABLE `Persons`
MODIFY `Age` int NOT NULL;
在一个已创建的表的 Age
字段中删除 NOT NULL 约束如下所示:
ALTER TABLE `Persons`主键约束 PRIMARY KEY
MODIFY `Age` int NULL;
PRIMARY KEY 约束唯一标识数据库表中的每条记录 ,简单的说,PRIMARY KEY = UNIQUE + NOT NULL ,从技术的角度来看,PRIMARY KEY 和 UNIQUE 有很多相似之处。但还是有以下区别:
-
NOT NULL UNIQUE 可以将表的一列或多列定义为唯一性属性,而 PRIMARY KEY 设为多列时,仅能保证多列之和是唯一的,具体到某一列可能会重复。
-
PRIMARY KEY 可以与外键配合,从而形成主从表的关系,而 NOT NULL UNIQUE 则做不到这一点
如:
表一:用户
id
(主键),用户名表二: 银行卡号
id
(主键),用户id
(外键)则表一为主表,表二为从表。
-
更大的区别在逻辑设计上。 PRIMARY KEY 一般在逻辑设计中用作记录标识,这也是设置 PRIMARY KEY 的本来用意,而 UNIQUE 只是为了保证域/域组的唯一性。
CREATE TABLE 时 添加 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`)
);
ALTER TABLE 时添加主键约束
ALTER TABLE `Persons`
ADD PRIMARY KEY (`P_Id`)
如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
撤销 PRIMARY KEY
ALTER TABLE `Persons`外键约束 FOREIGN KEY
DROP PRIMARY KEY
什么是外键
一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY 。
让我们看了例子,如果一个字段 X 在一张表(表 1 )中是关键字,而在另一张表(表 2 )中不是关键字,则称字段 X 为表 2 的外键。
外键的作用
外键最根本的作用:保证数据的完整性和一致性。接下来通过一个例子来深入理解一下。
现在有两张表——学生表和院系表,这里的院系就是学生表的外键,外键表是学生表,主键表是院系表。 假如院系表中的某个院系被删除了,那么在学生表中要想查询这个被删除的院系号所对应的院信息就会报错,因为已经不存在这个系了,所以,删除院系表(主键表)时必须删除其他与之关联的表,这里就说明了外键的作用,保持数据的一致性、完整性。 当然反过来讲,你删除学生表中的记录,并不影响院系表中的数据,你查询院系号也能正确查询。 所以删除外键表中的数据并不影响主键表。
外键约束
外键约束是指用于在两个表之间建立关系,需要指定引用主表的哪一列。
CREATE TABLE 时的 SQL FOREIGN KEY 约束
CREATE TABLE `Orders`
(
`O_Id` int NOT NULL,
`OrderNo` int NOT NULL,
`P_Id` int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
NOT NULL 表示该字段不为空 REFERENCES 表示 引用一个表
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:
CREATE TABLE `Orders`
(
`O_Id` int NOT NULL,
`OrderNo` int NOT NULL,
`P_Id` int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)
CONSTRAINT 表示约束,后面接约束名称,常用于创建约束和删除约束;
ALTER TABLE 时的 SQL FOREIGN KEY 约束
当 "Orders" 表已被创建时,如需在 "P_Id" 列创建 FOREIGN KEY 约束:
ALTER TABLE `Orders`
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:
ALTER TABLE `Orders`
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
撤销 FOREIGN KEY 约束
ALTER TABLE `Orders`检查约束 CHECK
DROP FOREIGN KEY fk_PerOrders
CHECK 约束用于限制列中的值的范围,评估插入或修改后的值。 满足条件的值将会插入表中,否则将放弃插入操作。 可以为同一列指定多个 CHECK 约束。
CHECK
约束既可以用于某一列也可以用于某张表:
-
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
-
如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。
定义 CHECK 约束条件在某种程度上类似于编写查询的 WHERE 子句,使用不同的比较运算符(例如 AND、OR、BETWEEN、IN、LIKE 和 IS NULL)编写其布尔表达式,该布尔表达式将返回 TRUE、FALSE 或 UNKNOWN 。 当条件中存在 NULL 值时,CHECK约束将返回 UNKNOWN 值。 CHECK 约束主要用于通过将插入的值限制为遵循定义的值、范围或格式规则的值来强制域完整性。
CREATE DATABASE IF NOT EXISTS hardy_db default character set utf8mb4 collate utf8mb4_0900_ai_ci;
USE hardy_db;
DROP TABLE IF EXISTS lesson;
创建表结构时可以使用 CHECK 约束,也可以给已创建的表增加 CHECK 约束。