DQL语句
DQL(Data Query Language)是用于查询数据的语言,主要用于从数据库中查询数据。常见的 DQL 语句包括 SELECT,用于查询数据;FROM,用于指定要查询的表或视图;WHERE,用于指定查询的条件;GROUP BY,用于将查询结果分组;HAVING,用于过滤分组结果;ORDER BY,用于排序查询结果。
以下是常见的 DQL 语句及其使用方法:
SELECT 语句
SELECT 语句用于从数据库中查询数据。
SELECT column_name(s) FROM table_name
例如,要查询员工表中的所有员工的姓名和工资:
SELECT name, salary FROM employee;
FROM 语句
FROM 语句用于指定要查询的表或视图。
SELECT column_name(s) FROM table_name
例如,要从员工表中查询员工姓名和工资
SELECT name, salary FROM employee;
WHERE 语句
WHERE 语句用于指定查询的条件。
SELECT column_name(s) FROM table_name WHERE condition
例如,要查询员工表中工资高于 5000 的员工的姓名和工资:
SELECT name, salary FROM employee WHERE salary > 5000;
GROUP BY 语句
GROUP BY 语句用于将查询结果分组,常见聚合函数:avg(), max(), min(), count(), sum()
SELECT column_name(s) FROM table_name GROUP BY column_name
例如,要按照部门分组查询员工表中每个部门的平均工资:
SELECT department, AVG(salary) FROM employee GROUP BY department;
HAVING 语句
HAVING 语句用于过滤分组结果。
SELECT column_name(s) FROM table_name GROUP BY column_name HAVING condition
例如,要按照部门分组查询员工表中每个部门的平均工资,并只显示平均工资大于 5000 的部门:
SELECT department, AVG(salary) FROM employee GROUP BY department HAVING AVG(salary) > 5000;
ORDER BY 语句
ORDER BY 语句用于排序查询结果。
SELECT column_name(s) FROM table_name ORDER BY column_name(s) ASC|DESC
例如,要按照工资从高到低的顺序查询员工表中的所有员工:
SELECT * FROM employee ORDER BY salary DESC;
在 SQL 语句中,可以使用一些修饰符来改变语句的执行方式或结果,以下是一些常见的修饰符:
算术操作符:+, -, *, /, %
比较操作符:=,<=>(相等或都为空), <>, !=(非标准SQL), >, >=, <, <=
DISTINCT:去除重复行。
WHERE:指定查询条件。
GROUP BY:按照某一或多个字段分组,常见聚合函数:avg(), max(), min(), count(), sum()
HAVING:指定分组的过滤条件。
ORDER BY:按照某一或多个字段进行排序。升序:ASC 降序:DESC
LIMIT:限制返回的行数,LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制
OFFSET:指定查询结果的偏移量。
JOIN:连接两个或多个表。
UNION:将多个 SELECT 语句的结果合并。
IN:用于指定一个范围,比如 WHERE column_name IN (value1, value2, ...)。
NOT:否定一个条件。
LIKE:模糊匹配。
BETWEEN:指定一个范围,比如 WHERE column_name BETWEEN value1 AND value2。
EXISTS:检查子查询是否返回任何行。
ALL:比较一个列的值和一个子查询中的所有值。
ANY/SOME:比较一个列的值和一个子查询中的任何值。
IS NULL
IS NOT NULL
DISTINCT 去除重复行,范例:SELECT DISTINCT gender FROM students;
LIKE:
% 任意长度的任意字符
_ 任意单个字符
RLIKE:正则表达式,索引失效,不建议使用
REGEXP:匹配字符串可用正则表达式书写模式,同上
逻辑操作符:NOT,AND,OR,XOR
对查询结果中的数据请求施加“锁” FOR UPDATE: 写锁,独占或排它锁,只有一个读和写操作;LOCK IN SHARE MODE: 读锁,共享锁,同时多个读操作
单表操作
语法:
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[SQL_CACHE | SQL_NO_CACHE]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE | LOCK IN SHARE MODE]
字段显示可以使用别名:
col1 AS alias1, col2 AS alias2, ...
判断是否为空
去重
SQL注入攻击
SQL 注入攻击的原理是利用应用程序没有正确验证或处理用户输入的 SQL 查询数据,使攻击者能够在应用程序的数据库上执行恶意操作。攻击者通过编辑输入的数据来构造SQL查询,从而达到审核过程。例如,攻击者可以在登录表单的用户名输入框中输入以下内容:admin' or '1'='1,这将会使SQL查询成为SELECT * FROM users WHERE username='admin' or '1'='1' and password='输入的密码'。由于 '1'='1' 总是成立,因此攻击者可以绕过身份验证并成功登录。
select * from user where name='admin' and password='' or '1'='1';
select * from user where name='admin'; -- ' and password='123456';
select * from user where name='admin'; # ' and password='123456';
-- ##都是注释掉后面的语句
此外,通过其他 SQL 查询,攻击者可以修改、删除或插入数据,甚至可以利用数据库中机密数据泄漏的漏洞,而不需要经过身份验证。
要防止 SQL 注入攻击,应用程序应该正确验证和过滤输入的数据,以确保这些数据不包含任何恶意代码或语法。可以使用参数化查询和预编译语句来减少 SQL 注入风险,从而有效地保护数据库和应用程序。
分组统计
先筛选出classid大于3的学生,然后进行classid进行分组获取获取平均年龄,然后进行having筛选
排序