-
1 知识链接
-
2 任务实现
-
3 同步实训
【问题引入】
可以使用SQL来访问和操作数据库中的数据,那么SQL是什么?在MySQL数据库管理系统中,如何使用SQL来管理数据库中的数据?
【实现思路】
使用SQL中数据操作语言来管理MySQL数据库数据,也就是增(insert)、删(delete)、改(update)、查(select)语句。
【知识链接】
SQL是Structured Query Language(结构化查询语言)的缩写,是用于访问和处理数据库的标准的计算机语言。可以把 SQL 分为三类:数据操作语言(DML)、数据定义语言 (DDL)和数据控制语言(DCL)。在应用程序开发中数据操作用得比较普遍,在SQL中数据操作语言主要是增、删、查、改操作,它们都有特定的语法。
创建数据库和表后,需要对表中的数据进行操作,包括插入、删除和修改操作。
1.插入数据
INSERT INTO 语句用于向表格中插入新的行,INSERT语句一般不会产生输出。可以使用以下几种方式插入数据:
插入完整的行
插入指定的列
插入多行
(1)插入完整的行。
语法1:
| INSERT INTO 表名称 VALUES (值1, 值2,...); |
其中存储到每个表列中的数据在VALUES子句中给出,对每个列必须提供一个值。如果某个列没有值,应该使用NULL值(假定表允许对该列指定空值)。各个列必须以它们在表定义中出现的次序填充。
(2)插入指定的列。语法1比较简单,但并不安全,应该尽量避免使用。为此语法2提供了插入数据的另一种比较安全的方式。
语法2(指定所要插入数据的列):
| INSERT INTO表名称 (列1, 列2,...) VALUES (值1, 值2,...); |
此语法中在表名称后面的括号里明确地给出了列名。在插入行时,MySQL将用VALUES列表中的相应值填入列表中的对应项。VALUES中的第一个值对应于第一个指定的列名,第二个值对应于第二个列名,依此类推。
因为提供了列名,VALUES必须以其指定的次序匹配指定的列名,不一定按列出现在实际表中的次序。其优点是,即使表的结构改变,此INSERT语句仍然能正确工作。
(3)插入多行。
语法3:
| INSERT INTO表名称 (列1, 列2,...) VALUES (第1行值1, 第1行值2,...),( 第2行值1, 第2行值2,...),... ( 第n行值1, 第n行值2,...); |
每组值用一对圆括号括起来,用逗号分隔各组。
2.更新数据
UPDATE 语句用于更新(修改)表中的数据。
语法:
| UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 |
UPDATE语句以WHERE子句结束,它告诉MySQL更新哪一行,若没有WHERE子句,MySQL将会更新表中的所有行。在更新多个列时,只需要使用单个SET命令,每个“列=值”对之间用逗号分隔(最后一列之后不用逗号)。
3.删除数据
DELETE 语句用于删除表中的行。
语法:
| DELETE FROM 表名称 WHERE 列名称 = 值 |
DELETE FROM要求指定从中删除数据的表名,WHERE子句过滤要删除的行,如果省略WHERE子句,则将删除表中所有的行,但是DELETE不删除表本身。
4.数据查询语句
SELECT语句是最经常使用的SQL语句,它的用途是从一个或多个表中选取(查询)数据,由 SQL 查询语句获得的结果被存放在一个结果集中。可以使用以下几种方式查询数据:
选择指定的列查询
查询全部列
限制查询结果
排序查询
条件查询
使用聚合函数查询
分组查询
(1)选择指定的列查询。
语法:
| SELECT 列名称 FROM 表名称 |
在选择多个列时,一定要在列名之间加上逗号,但最后一个列名后不加。
(2)查询全部列。
语法:
| SELECT * FROM 表名称 |
给定一个通配符*,则返回表中所有的列。列的顺序一般是列在表定义中出现的顺序。一般除非确实需要表中的每个列,否则最好不使用*通配符。虽然使用通配符会省事,不用明确列出所需的列,但检索不需要的列通常会降低检索和应用程序的性能。
(3)限制查询结果。
语法1:
| SELECT 列名称 FROM 表名称 LIMIT row_count |
为了限制被SELECT语句返回的行数,可以使用LIMIT子句,row_count表示显示的记录数。
语法2:
| SELECT 列名称 FROM 表名称 LIMIT offset, row_count |
该语法表示返回从第offset+1条记录开始的row_count条记录。
(4)排序查询。使用ORDER BY子句能明确地对SELECT语句检索出的数据进行排序。
语法:
| SELECT 列名称 FROM 表名称 ORDER BY 列名 |
ORDER BY子句默认按照升序对记录进行排序,若希望按降序对记录进行排序,可以使用 DESC 关键字。ORDER BY子句可取一个或多个列的名字,其中列名之间用逗号分开。
(5)条件查询。WHERE 子句用于提供查询条件,它必须紧跟在FROM子句之后。
语法1(比较运算):
| SELECT 列名称 FROM 表名称 WHERE 列 比较运算符 值 |
在WHERE子句中运算符如表3-3所示。
表3-3 比较运算符
| 操作符 | 说明 |
| = | 等于 |
| != | 不等于 |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
语法2(模式匹配):
LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
| SELECT 列名称 FROM 表名称 WHERE 列名称 LIKE搜索模式 |
搜索模式有字面值、通配符或两者组合构成的搜索条件,SQL 通配符可以替代一个或多个字符,表3-4所示为SQL中的通配符。
表3-4 SQL中的通配符
| 通配符 | 描述 |
| % | 替代一个或多个字符 |
| _ | 仅替代一个字符 |
| [charlist] | 字符列中的任何单一字符 |
| [^charlist] 或者 [!charlist] | 不在字符列中的任何单一字符 |
语法3(范围比较):用于范围比较的关键字有两个:BETWEEN和IN。当要查询的条件是某个值的范围时,可以使用BETWEEN关键字。BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或日期。
| SELECT 列名称 FROM 表名称 WHERE 列名称 BETWEEN 值1 AND 值2 |
其中值1不能大于值2,NOT BETWEEN... AND选取不在两个值之间的数据范围。
使用IN关键字可以指定一个值表,值表中列出所有可能的值,当与值表中的任一个匹配时,即返回TRUE,否则返回FALSE。
| SELECT 列名称 FROM 表名称 WHERE 列名称 IN (值1, 值2, …, 值n) |
语法4:AND 和 OR 运算符用于基于一个以上的条件对记录进行过滤。AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。AND是用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。
(6)使用聚合函数查询。SELECT子句的表达式中还可以包含聚合函数。聚合函数的操作面向一系列的值,并返回一个单一的值。表3-5中列举了常用的聚合函数。
表3-5 MySQL常用的聚合函数
| 函数 | 说明 |
| AVG() | 返回某列的平均值 |
| COUNT() | 返回某列的行数 |
| MAX() | 返回某列的最大值 |
| MIN() | 返回某列的最小值 |
| SUM() | 返回某列值之和 |
语法:
| SELECT聚合函数名(列名称) FROM 表 |
(7)分组查询。分组是在SELECT语句的GROUP BY子句中建立的,使用HAVING子句来过滤分组。GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组。GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
语法:
| SELECT 列名称, 聚合函数名(列名称) FROM 表名称 [WHERE 列名称 操作符 值] GROUP BY 列名称 [HAVING 条件] |

