目录
数据库的实用性
操作网上商城数据库系统
维护数据库的完整性(过)
维护数据库的完整性是确保数据库数据的正确性和一致性的关键。以下是一些常见的方法来维护数据库的完整性:
添加修改和删除数据
查询网上商城系统数据
选择列
排序统计分析表单数据
使用聚合函数聚合函数能够实现对数据表在指定列的值进行统计计算,并返回单个数值。用来对查询结果进行分组、筛选或统计。
数据分组统计
查询应用系统中多表数据
多表连接查询
内连接
子查询应用系统中多表数据
优化查询网上商城系统数据
使用视图优化查询操作
数据库的实用性
MySQL具有高度的可靠性、稳定性和扩展性,广泛应用于Web应用程序开发、数据仓库和商业软件等领域。MySQL支持多用户、多线程、多平台等特点,同时也支持多种编程语言的接口,如C、C++、Java、Python等。
操作网上商城数据库系统
使用sql语言创建数据表语法:
实例:
- 查看表结构:desc 表名
- 查看当前数据库的表格:show tables
- 查看创建的表结构:show creat table 表名
- 修改表结构:使用alter table
- 包括修改表名 ,修改字段,修改字段的排列顺序,添加字段,删除字段
- 修改表名:ALTER TABLE 原表名 RENAME[TO]新表名;
- 修改字段名:ALTER TABLE 表名 CHANGE 原字段名 新字段名 新数据类型;
- ALTER 表名 MODIFY 字段名 新数据类型;
- 修改字段的排列顺序:ALTER TABLE 表名 MODIFY 字段名1 数据类型 FIRST|AFTER 字段名2
- 添加字段:ALTER TABLE 表名 ADD 字段名 数据类型 [完整约束条件][FITST] AFTER 已经存在的字段名]
- 复制表结构及数据到新表:CREATE TABLE 新表名 STLECT *FROM 原表名 ;
- 只复制表结构到新表:CREATE TABLE 新表名 STLECT *FROM 原表名 WHERE FALSE;
- CREATE TABLE 新表名 LIKE 原表名;
- 复制表的部分字段及数据到新表:CREATE TABLE 新表名 AS(SELECT 字段1,字段2,....FROM 源表名);
删除表名 :DROP TBALE
维护数据库的完整性(过)
维护数据库的完整性是确保数据库数据的正确性和一致性的关键。以下是一些常见的方法来维护数据库的完整性:
-
主键(Primary Key)约束:主键是唯一标识数据表中每条记录的字段,可以确保数据库中每条记录都有唯一的标识。主键约束可以防止重复插入数据,同时可以加速数据查询操作。
-
外键(Foreign Key)约束:外键是指一个表中的字段,它与另一个表中的主键形成了关联关系。外键约束可以确保数据表之间的关联关系正确,同时可以防止插入不存在的数据。
-
唯一(Unique)约束:唯一约束可以确保数据表中某个字段的值是唯一的,但是可以包含NULL值。唯一约束可以防止插入重复的数据。
-
检查(Check)约束:检查约束可以限制数据表中某个字段的值的范围或格式。检查约束可以确保数据的有效性,同时可以防止插入无效的数据。
-
非空(Not Null)约束:非空约束可以确保数据表中某个字段的值不能为空,可以防止插入空值数据。
-
触发器(Trigger):触发器是一种特殊的存储过程,可以在数据表中的数据发生修改、插入或删除操作时自动触发。通过触发器,可以实现复杂的数据验证和操作。
通过使用上述约束和触发器等手段,可以确保数据库中数据的正确性和一致性,并且可以防止非法数据的插入和修改,保证数据的质量和可靠性。
添加修改和删除数据
1.插入单条数据
使用INSERT语句插入
INSERT INTO 表名[ (字段列表)] VALUES (值列表);
使用REPLACE 语句插入(替换):
REPLACE INTO 表名[(字段列表)VALUES(值列表)];
2.插入多条数据
使用INSERT语句插入
INSERTINTO 表名[(字段列表)] VALUES(值列表1)[,(值列表2),·(值列表n)];
使用REPLACE语句插入
REPLACEINTO 表名[(字段列表)] VALUES(值列表1)[,(值列表2),(值列表n)];
使用UPDATE语句修改
UPDATE 表名 SET 字段名1=值1,字段名2=取值2,...字段名n=取值n [WHERE条件表达式];
使用DELETE语句删除数据(可以带条件)
DELETE FROM 表名[WHERE 条件表达式];
使用TRUNCATE语删除数据(所有的用户信息)
TRUNCATE ITABLE] 表名;
查询网上商城系统数据
SELECT语句的基本语法格式
SELECT [ALL|DISTINCT] *|列名1 [[AS] 别名] [,列名2,.,列名n] FROM 表名
[WHERE条件表达式] [GROUP BY 列名 [ASC|DESC] [HAVING 条件表达式] ] [ORDER BY 列名[ASC|DESC],...] [LIMITIOFFSET1记录数1;
详细介绍
- SELECT 子句:指定查询结果集返回的列,当使用“*”时,用于显示表中所有的列;关键字DISTINCT为可选参数,用于消除查询结果集中的重复记录。
- FROM子句:表示查询的数据源,可以是表或视图。
- WHERE子句:指定查询筛选条件。GROUP BY子句: 指定查询的分组列名:关键字HAVING为可选参数,用于指定分组后的结果集筛选条件ORDER BY子句:指定查询结果集的排序列名。
- LIMIT子句:用于限制查询结果集的行数。参数OFFSET为偏移量,当OFFSET值为0时,表示从查询结果从第1条记录开始返回,如果OFFSET为1,表示查询结果从第2条记录开始,以此类推。
以下是人工智能给出的介绍:
查询所有列:SELECT *
选择列
列查询:
例:查询onlinedb数据库中category (商品类别表) 中所有的商品类别信息
USE ONLINEDB SELECT * FROM category;
查询指定的列
- 例:查询goods (商品信息表) 中所有的商品编号、名称、价格和销售量
- SELECT gcode,gname,gprice,gsale_qtyFROM goods;
- 例:查询goods表,列出名称和销售额,其中销售额=单价*销售量
- SELECT gname,gprice*gsale_qtyFROM goods;
- 例:查询users(用户信息表)中,列出用户名和用户年龄
- year()now()
SELECT uname,year(now()) - year(ubirthday)FROM users;
为查询结果集中的列指定列标题
默认情况下,结果集显示的列标题就是查询列的名称,当希望查询结果中显示的列使用自定义列标题时,可以使用关键字AS更改结果集中的列标题。
- 例:
- 查询users(用户信息表)中,列出用户名和用户年龄
- SELECT uname AS 用户名 year(now()) - year(ubirthday) AS 用户年龄 FROM users;
选择行
查询数据时通常会指定查询条件,以筛选出用户所需的数据,这种查询方式称为行筛选或选择行。
在SELECT语句中,查询条件由WHERE子句指定
WHERE条件表达式 通过运算符将列名、常量、函数、变量及子查询进行组合
- 比较运算符
- 逻辑运算符
- BETWEENAND运算符
- IN运算符
- LINK运算符
- REGEXP运算符
当WHERE语句中有NOT运算符时,应将NOT运算符放在表达式的前面
使用BETWEENAND运算符
WHERE子句中,可使用BETWEENAND来限制查询数据的范围。语法格式如下
WHERE 表达式 [NOT]BETWEEN 初始值AND终止值
使用IN运算符
IN运算符与BETWEEN...AND运算符类似,用来限制查询数据的范围。语法格式如下
WHERE 表达式[NOT]IN(值1,值2,...,值N)
使用LIKE运算符
实际中当需要查询的条件只能提供部分信息时,就需要使用LIKE运算符实现字符串的模糊查询。语法格式如下:
WHERE 列名[NOT] LIKE'字符串常量'[ESCAPE’转义字符‘]
与LIKE同时使用的字符:通配符
CHATGPT 的解释: MySQL中常用的通配符包括:
- % (百分号):匹配任意数量的字符(包括零个字符)
- _ (下划线):匹配任意单个字符
这两个通配符通常用于SQL语句中的LIKE操作符,用来匹配符合特定模式的数据。
例如,假设有一个employee表,其中包含了员工的姓名(name)和部门名称(department):
id | name | department |
---|---|---|
1 | Alice | Sales |
2 | Bob | Marketing |
3 | Charlie | Sales |
4 | David | HR |
现在想要查询所有部门名称以 "S" 开头的员工,可以使用以下SQL语句:
SELECT * FROM employee WHERE department LIKE 'S%';
这里的'%'通配符表示匹配任意数量的字符,因此可以匹配所有以 "S" 开头的字符串。
如果想要查询所有名字为五个字符,第三个字符为 "i" 的员工,可以使用以下SQL语句:
SELECT * FROM employee WHERE name LIKE '__i__';
这里的'_'通配符表示匹配任意单个字符,因此可以匹配所有名字为五个字符,第三个字符为 "i" 的字符串。
使用REGEXP运算符
·MySQL支持正则表达式的匹配。正则表达式通常用来检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的字符串。
使用场景:从文本中提取电话号码 查找一篇文章中重复的单词 替换用户输入的某些字符
其语法格式如下 :WHERE列名REGEXP'模式串'
使用LIMIT关键字限制返回记录数
查询通常只需要返回满足条件的部分记录行。
SELECT语句中的LIMIT子句可以限制返回记录的数量。并能指定查询结果从哪一条记录开始。语法格式如下
记录数[OFFSET]LIMITT
OFFSET表示偏移量
偏移量为0,查询结果从第1条记录开始偏移量为1,则从查询结果的第2条记录开始...依次类推。
OFFSET为可选项,默认值为0。记录数表示返回记录的行数
使用CASE表达式更改查询结果
CASE简单结构:
CASE简单结构将表达式与一组确切的数值进行比较并返回相应结果,语法格式如下:
CASE表达式
WHEN 数值1THEN 结果值1
WHEN 数值2THEN 结果值2
....
ELSE 结果值n
END AS 新列名
使用CASE表达式更改查询结果
2CASE搜索结构·语法格式如下:
CASE
WHEN条件1THEN 结果值1
WHEN 条件2 THEN 结果值2
...
ELSE结果值n
END AS 新列名
排序统计分析表单数据
数据排序
默认情况下,查询结果集的记录顺序按表中记录存储的物理顺序排列。实际应用中,需要对查询的结果集按一定的结果排序输出。在SELECT语句中,使用ORDER BY子实现对查询结果的排序。语法格式如下:
ORDER BY {列名|表达式|正整数}[ASC|DESC][,...n]
使用聚合函数
聚合函数能够实现对数据表在指定列的值进行统计计算,并返回单个
数值。用来对查询结果进行分组、筛选或统计。
数据分组统计
SUM、AVG、MAX和MIN函数
求和 平均值 最大值 最小值
SUM /AVG /MAX /MIN([ALL|DISTINCT]列名|常量表达式)
ALL对整个聚合函数进行查询
DISTINCT去除重复后进行查询
COUNT函数
COUNT({[[ALL| DISTINCT]列名|常量|表达式]|*})
DISTINCT指定COUNT返回唯一非空值的数量
*指定应该计算所有行并返回表中行的总数
GROUP BY子句
聚合函数对查询结果集进行聚合后只返回单个汇总数据。使用GROUP BY子句则可以按指定的列对查询结果集进行分组,并使用聚合函数为查询结果集中的每个分组产生一个汇总值。GROUP BY子的语法格式如下:
GROUP BY[ALL]列名1,列名2[,...n][ WITH ROLLUP][HAVING 条件表达式]
ALL显示所有组
WITH、ROOLUP指定的结果集不仅包含由GROUP BY提供的行,同时还包含汇总行
HAVING条件表达式指定分组后的数据筛选条件
下面是MySQL中常用的聚合函数及其作用的表格:
聚合函数 | 作用 |
---|---|
COUNT() | 计算行数 |
SUM() | 计算数值总和 |
AVG() | 计算平均值 |
MAX() | 计算最大值 |
MIN() | 计算最小值 |
GROUP_CONCAT() | 将多个值拼接为一个字符串 |
可以在 SELECT 语句中使用这些聚合函数,对查询结果进行计算和统计分析。例如,可以使用 SELECT COUNT(*) FROM table; 计算表中的总行数,使用 SELECT AVG(column) FROM table; 计算某一列的平均值
以下是MySQL中常用的序号函数及其作用的表格:
序号函数 | 作用 |
---|---|
ROW_NUMBER() | 为查询结果集,增加行序号。例: 1,2,3...自然数行序 |
RANK() | 对指定值在分组的排名,设置排位序号。例: 1,1,3 相同值跳号 |
DENSE_RANK() | 密集排名,对指定值在分组的排名,设置排位序号。例: 1,1,2 相同值不跳号 |
查询应用系统中多表数据
多表连接查询
连接查询 联合查询 子查询
连接查询是通过相关表的关系列,追踪各个表之间的逻辑关系,从而实现多表的数据查询
交叉连接,将左表中的每一行记录和右表中的所有记录进行连接,返回的记录行数是两个表行数的乘积
内连接
内连接是指查询结果集返回与连接条件匹配的记行,通常使用比较运算符比较被连接的列值.
自连接
当连接的两张表是同一张表时,这种连接叫做自连接。它们物理上为同一个表,逻辑上分为两个表
外连接
外连接,返回的结果集除了包括符合条件的记录外,还会返回FROM子句中至少一个表中的所有行,不满足条件的数据行将显示为空值。
联合查询
联合查询,将多个SELECT语句返回的结果集合并为单个结果集,该结果集包含联合查询中每个查询结果集的全部行。
子查询应用系统中多表数据
子查询子查询是一种SELECT语句的使用方法,用于表达复杂的查询逻辑
它嵌套在SELECT、INSERT、UPDATE、DELETE语句或其他子查询中
什么是子查询?
子查询可以把复杂的查询分解成一系列的逻辑步骤,通过使用简单查询命令来解决复杂的问题
子查询作为表达式
子查询作为派生表
子查询作为派生表
SELECT的FROM子句用于指定查询的数据源,即二维表,而SELECT的查询结果集是二维表
Exists关键字实现子查询
什么是相关子查询
相关子查询又称为重复子查询,子查询的执行依赖外层查询的结果。也就是说,子查询依赖外层查询的某个属性来获取查询结果集
子查询用于更新数据
子查询不仅可以构造复杂的查询逻辑当数据更新需要依赖于询的结果集,使用子查询是一种有效的手段
优化查询网上商城系统数据
使用视图优化查询操作
视图简介
MySQL中的视图是一种虚拟表,可以将复杂的查询语句封装在一个视图中,简化查询、提高数据安全性和一致性、优化查询性能,并方便查询重用。视图可以看作是一个动态生成的表,不存储数据,只保存了查询的定义和结果集。
- 视图是从一个或多个基表导出的虚拟表
- 视图作为数据库对象,在数据库中保存的只是视图的创建语句
- 视图是用户从多种角度看待同一数据的对象
创建和查看视图
创建视图
查看视图
- 查看数据库中的所有视图
- 例:select * from information_schema.views where table_schema='onlinedb';
- 使用SHOW TABLE STATUS 语查看视图
- 查看名为view_goods的视图 show table status like 'view_cart';
- 使用DESCRIBE/DESC 语句查看视图:
- 查看视图结构 DESCRIBE view_cart;
通过视图查询数据
维护视图
使用CREATE OR REPLACE VIEW 修改视图
使用ALTER VIEW修改视图
修改名为 view cart 的视图,在原有查询的基础上增加用户的邮箱
删除视图
DROP VIEW [IF EXISTS] 视图名
更新视图
通过视图修改数据
通过视图向基本表插入数据
通过视图删除基本表中的数据
注意:若视图的定义包含以下情况中的任何一种,则该视图就不可更新:
- 包含聚合函数。
- 包含 DISTINCT、UNION、ORDER BY、GROUP BY和HAVING 等关键字或子句。
- 包含子查询。
- 由不可更新的视图导出的视图视图对应的基本表上存在没有默认值且不为空的列,而该列没有包含在视图里
使用视图向基本表插入数据
使用视图向基本表插入数据
使用索引优化查询性能
索引文件中有建立索引的字段值和对应记录的存储位置。索引文件建立时可根据索引字段值按升序或降序的方式创建
索引是存储引擎用于快速查找记录的一种数据结构,用来快速查询数据表中的特定记录。
创建索引
- 使用CREATE TABLE 语句创建索引
- 使用ALTER TABLE 语句创建索引
- 使用CREATEINDEX 语句创建索引
优化查询
在 MySQL 中,执行计划(Execution Plan)是查询优化器对 SQL 语句进行分析和优化后生成的一份查询执行计划,用于描述查询的执行方式。执行计划会告诉我们 MySQL 是如何执行查询的,包括查询使用的索引、扫描的行数、执行的顺序等。通过查看执行计划,可以发现查询中的性能问题,并进行优化,以提高查询效率
mysql的执行计划
优化查询(过)
添加索引优化查询
LIMIT分页优化查询
覆盖索引优化查询
使用程序逻辑操作网上商城
MysQL 支持的变量类型
用户变量:变量在一次会话中有效,变量名以一个@符号作为前缀
系统变量:系统配置参数,包含服务器状态或属性,每一个系统变量都有默认值。
局部变量:在BEGIN...END 代码块中生效,多用于存储过程,存储函数中。
常量和运算符
条件分支
if语句
case语句
循环语句
MySQL 内置函数
MySQL 内置函数是指在 MySQL 数据库中已经预先定义好的函数,可以直接在 SQL 语句中使用。MySQL 内置函数有很多,下面是一些常用的函数:
-
字符串函数:如 CONCAT、SUBSTRING、TRIM、LOWER、UPPER、REPLACE、LENGTH 等。
-
数值函数:如 SUM、AVG、MAX、MIN、COUNT、ROUND、CEIL、FLOOR 等。
-
时间日期函数:如 NOW、CURDATE、CURTIME、DATE、TIME、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND 等。
-
条件函数:如 IF、CASE、COALESCE 等。
-
聚合函数:如 GROUP_CONCAT、BIT_AND、BIT_OR、BIT_XOR、STD、STDDEV、VAR_POP、VAR_SAMP、COVAR_POP、COVAR_SAMP 等。
-
加密函数:如 PASSWORD、MD5、SHA1、SHA2 等。
-
其他函数:如 UUID、RAND、INET_ATON、INET_NTOA、CONV、FROM_UNIXTIME、UNIX_TIMESTAMP 等
使用存储函数和存储过程访问数据
存储函数的应用
存储函数在数据库编程中具有广泛的应用,可以用于简化复杂的 SQL 语句、提高代码的可重用性、提高数据库的性能等。
在 MySQL 中,存储过程(Stored Procedure)是一段可重用的 SQL 代码,它可以接受输入参数、执行一系列的操作,并返回一个或多个结果。存储过程可以通过调用来执行,也可以在其他 SQL 语句中使用。
下面是存储过程的定义过程:
-
连接到 MySQL 数据库,并选择要创建存储过程的数据库
-
CREATE PROCEDURE procedure_name (IN parameter1 data_type1, IN parameter2 data_type2, ..., OUT out_parameter data_type) BEGIN-- 过程体 END ```其中,procedure_name 是过程的名称,parameter1、parameter2 等是过程的输入参数,out_parameter 是过程的输出参数,过程体则是一系列的 SQL 语句。
-
在过程体中编写 SQL 语句,可以使用各种 SQL 语句、控制流语句和变量等。
-
使用 END 语句结束过程定义。
下面是一个简单的示例,创建一个计算两个数之和的存储过程:
CREATE PROCEDURE add(IN a INT, IN b INT, OUT c INT)
BEGINSET c = a + b;
END
在上面的示例中,我们创建了一个名为 add 的存储过程,它接受两个整数类型的输入参数 a 和 b,返回一个整数类型的值,这个值保存在输出参数 c 中。过程体中使用了 SET 语句计算两个参数的和并将结果赋值给 c
错误处理
使用触发器实现任务自动化
触发器:预先编译好的一组SQL语句,当数据库中数据发生变化时,这一组语句将会被自动执行
在 MySQL 中,触发器(Trigger)是一种特殊类型的存储过程,它与表有关,可以在表上定义,用于响应特定的事件(如 INSERT、UPDATE、DELETE 等)并执行相应的操作。触发器可以在数据发生变化时自动地执行,以实现数据的约束、验证、审计等功能。
用事件实现任务自动化
在 MySQL 中,可以使用事件(Event)来实现任务的自动化。事件是一种定时执行的程序,可以在指定的时间或时间间隔内自动执行。通过事件,可以实现定时备份、清理、统计等任务的自动化,提高工作效率
维护网上商城系统数据库的安全性
在 MySQL 中,用户权限管理是非常重要的,它可以控制用户对数据库的访问权限,保证数据的安全性和完整性
GRANT 语句:用于授予用户某些权限 REVOKE 语句:用于撤销用户的某些权限
CREATE USER 语句:用于创建新用户 DROP USER 语句:用于删除用户
SHOW GRANTS 语句:用于显示用户的权限。
事务的隔离级别定义了多个并发事务之间的相互影响程度。MySQL数据库提供了多个隔离级别,每个级别都具有不同的特性和影响。以下是MySQL数据库中常用的四个隔离级别及其对数据访问的影响:
-
READ UNCOMMITTED(读未提交):
- 允许事务读取其他事务尚未提交的数据。
- 可能导致脏读(读取到未提交的数据)、不可重复读和幻读的问题。
-
READ COMMITTED(读已提交):
- 保证一个事务读取到的数据是已经提交的数据。
- 避免了脏读的问题,但仍可能导致不可重复读和幻读的问题。
-
REPEATABLE READ(可重复读):
- 保证一个事务执行期间多次读取同一数据时,结果是一致的。
- 避免了脏读和不可重复读的问题,但仍可能导致幻读的问题。
-
SERIALIZABLE(串行化):
- 保证所有事务串行执行,避免了脏读、不可重复读和幻读的问题。
- 通过强制事务串行执行来实现隔离级别,可能会降低并发性能。
隔离级别越高,事务之间的隔离程度越高,但并发性能也越低。选择适当的隔离级别取决于应用的需求和对数据一致性的要求。
锁常用的并发控制机制,MySQL中隔离级别的实现就是通过锁机制
锁在数据库中起到控制并发访问的作用,确保数据的一致性和完整性。数据库锁可以分为两种类型:共享锁(Shared Lock)和排他锁(Exclusive Lock)。共享锁允许多个事务同时读取同一数据,而排他锁则保证只有一个事务可以对数据进行写操作