一、引言
MySQL是一种开源的关系型数据库管理系统(RDBMS),以其高性能、可靠性和易用性而广受欢迎。无论是Web开发、数据分析还是其他领域,MySQL都是许多开发者和企业的首选。本文将详细介绍MySQL数据库的查询与操作,包括基本的查询语句、多表查询、子查询、数据更新与删除等。
二、数据查询语句的基本格式
在MySQL中,数据查询是通过SELECT语句实现的。其基本格式如下:
SELECT 要查的内容 FROM 查找的对象 WHERE 查找的条件 GROUP BY 按什么分组 HAVING 使用到函数的条件 ORDER BY 按照什么条件排序;
- SELECT:指定要查询的列或表达式。
- FROM:指定要查询的表。
- WHERE:指定查询条件,用于筛选数据。
- GROUP BY:按指定的列进行分组。
- HAVING:对分组后的数据进行筛选。
- ORDER BY:对查询结果进行排序。
三、单表查询
1. 查询表中的若干列
查询指定列:
SELECT 列名1, 列名2[, 列名3, ...] FROM 表名;
查询所有列:
SELECT * FROM 表名;
2. 查询经过计算的值
查询时可以对列进行计算或应用函数,例如:
SELECT 列名1, 表达式 AS 别名 FROM 表名;
示例:查询全体学生的姓名、出生年份和所在院系,要求给出生年份起别名“birthday”,用小写字母表示系名。
SELECT Sname, 2022 - Sage AS birthday, LOWER(Sdept) FROM Student;
3. 去重
使用DISTINCT关键字去除重复行:
SELECT DISTINCT 列名 FROM 表名;
示例:查询选修了课程的学生学号,并去除重复的行。
SELECT DISTINCT Sno FROM Sc;
4. 条件查询
通过WHERE子句实现条件查询,常用条件包括:
- 比较大小:
=、>、<、>=、<= - 确定范围:
BETWEEN ... AND ... - 确定集合:
IN - 字符匹配:
LIKE(使用%和_作为通配符) - 空值查询:
IS NULL、IS NOT NULL - 逻辑运算符:
AND、OR
示例:查询计算机科学系年龄在20岁以下的学生姓名。
SELECT Sname FROM Student WHERE Sdept = 'CS' AND Sage < 20;
5. 排序
使用ORDER BY子句对查询结果进行排序,ASC为升序,DESC为降序:
SELECT 列名 FROM 表名 ORDER BY 列名 [ASC|DESC];
示例:查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列。
SELECT * FROM Student ORDER BY Sdept ASC, Sage DESC;
6. 聚集函数
聚集函数用于计算统计值,如COUNT、SUM、AVG、MAX、MIN等,只能用于SELECT子句和GROUP BY中的HAVING子句。
示例:查询选修了课程的学生人数。
SELECT COUNT(DISTINCT Sno) FROM Sc;
示例:查询每个学生的平均成绩。
SELECT Sno, AVG(Grade) AS AvgGrade FROM Sc GROUP BY Sno;
四、多表查询
多表查询用于从两个或多个表中获取数据,MySQL提供了多种连接操作来实现这一点。
1. 内连接(INNER JOIN)
返回两个表中满足连接条件的行。
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列名 = 表2.列名;
示例:查询订单信息以及对应的客户姓名。
SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
INNER JOIN customers
ON orders.customer_id = customers.customer_id;
2. 左连接(LEFT JOIN)
返回左表中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则相应的列将显示为NULL。
SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 = 表2.列名;
示例:查询所有客户及其订单信息(包括没有订单的客户)。
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
LEFT JOIN orders
ON customers.customer_id = orders.customer_id;
3. 右连接(RIGHT JOIN)
与左连接类似,只不过返回右表中的所有行,以及左表中满足连接条件的行。
SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 表1.列名 = 表2.列名;
4. 全连接(FULL JOIN)
MySQL不直接支持全连接,但可以通过UNION操作模拟。
SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 = 表2.列名
UNION
SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 表1.列名 = 表2.列名;
五、子查询
子查询是嵌套在其他查询中的查询,可以出现在SELECT、FROM、WHERE或HAVING子句中。
1. 作为WHERE子句中的条件
示例:查询订单金额大于平均订单金额的订单信息。
SELECT * FROM orders
WHERE order_amount > (SELECT AVG(order_amount) FROM orders);
2. 作为FROM子句中的数据源
示例:查询每个客户的订单数量和平均订单金额。
SELECT customer_id, order_count, total_amount / order_count AS average_amount
FROM (
SELECT customer_id, COUNT(*) AS order_count, SUM(order_amount) AS total_amount
FROM orders
GROUP BY customer_id
) AS subquery;
六、数据更新与删除
1. 数据更新(UPDATE)
使用UPDATE语句修改数据库中的现有数据。
UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... WHERE 条件;
示例:将某个客户的联系电话更新为新号码。
UPDATE customers SET contact_number = '新号码' WHERE customer_id = 123;
注意:WHERE子句非常重要,如果省略WHERE子句,将会更新表中的所有行,这可能会导致严重的数据丢失。
2. 数据删除(DELETE)
使用DELETE语句从数据库表中删除数据。
DELETE FROM 表名 WHERE 条件;
示例:删除某个特定订单的记录。
DELETE FROM orders WHERE order_id = 456;
同样,WHERE子句决定了要删除哪些行。如果不小心省略WHERE子句,将会删除整个表的数据,这是非常危险的操作。
七、数据库操作
除了数据查询与更新,MySQL还支持数据库的创建、删除、修改以及备份与恢复等操作。
1. 创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER SET 字符集名] [COLLATE 校对规则名];
示例:创建一个名为temp的数据库,字符集为UTF-8。
CREATE DATABASE temp CHARACTER SET UTF-8;
2. 删除数据库
DROP DATABASE [IF EXISTS] 数据库名;
示例:删除名为temp的数据库。
DROP DATABASE IF EXISTS temp;
3. 修改数据库
通过ALTER DATABASE语句修改数据库的字符集或校对规则。
ALTER DATABASE 数据库名 CHARACTER SET 字符集名 COLLATE 校对规则名;
示例:将temp数据库的字符集修改为gbk,校对规则修改为gbk_bin。
ALTER DATABASE temp CHARACTER SET gbk COLLATE gbk_bin;
4. 备份与恢复数据库
使用mysqldump工具进行数据库的备份与恢复。
- 备份数据库:
mysqldump -P3306 -u root -p 数据库名 > 备份文件路径
- 恢复数据库:
SOURCE 备份文件;
八、总结
MySQL数据库提供了丰富的查询与操作功能,通过本文的介绍,相信读者已经掌握了基本的查询语句、多表查询、子查询以及数据更新与删除等操作。在实际应用中,还需要根据具体需求灵活运用这些功能,以满足不同的数据处理需求。同时,也需要注意数据库的安全性与性能问题,确保数据的完整性与高效访问。
3203

被折叠的 条评论
为什么被折叠?



