查询语句
语言类型
-
数据定义语言(DDL):用于创建、修改和删除数据库对象(如表、视图、索引等)。常见的DDL语句包括CREATE、ALTER和DROP等。
CREATE DATABASE:创建数据库。ALTER DATABASE:修改数据库的属性。DROP DATABASE:删除数据库。CREATE TABLE:创建数据表。ALTER TABLE:修改数据表的结构,如添加列、删除列、修改列的数据类型等。DROP TABLE:删除数据表。TRUNCATE TABLE:清空数据表的所有数据。RENAME TABLE:重命名数据表。CREATE INDEX:创建索引。ALTER INDEX:修改索引。DROP INDEX:删除索引。CREATE VIEW:创建视图。ALTER VIEW:修改视图。DROP VIEW:删除视图。CREATE PROCEDURE:创建存储过程。ALTER PROCEDURE:修改存储过程。DROP PROCEDURE:删除存储过程。CREATE FUNCTION:创建函数。ALTER FUNCTION:修改函数。DROP FUNCTION:删除函数。CREATE TRIGGER:创建触发器。ALTER TRIGGER:修改触发器。DROP TRIGGER:删除触发器。CREATE EVENT:创建事件。ALTER EVENT:修改事件。DROP EVENT:删除事件。CREATE USER:创建用户。ALTER USER:修改用户。DROP USER:删除用户。
-
数据操纵语言(DML):用于插入、更新和删除数据。常见的DML语句包括INSERT、UPDATE和DELETE等。
SELECT:查询数据。INSERT:插入数据。UPDATE:更新数据。DELETE:删除数据。REPLACE:插入或替换数据。LOAD DATA INFILE:从文件中导入数据。SELECT INTO OUTFILE:将查询结果导出到文件中。SELECT INTO:将查询结果插入到另一个表中。SET:设置变量值。
-
数据查询语言(DQL):用于从数据库中检索数据。常见的DQL语句是SELECT语句,它可以使用WHERE、GROUP BY、HAVING、ORDER BY等关键字来过滤、分组、聚合和排序数据。
SELECT:查询数据。DISTINCT:返回不同的值。WHERE:过滤数据。ORDER BY:排序数据。LIMIT:限制返回数据的行数。GROUP BY:按照指定列分组。HAVING:在分组后对结果进行过滤。JOIN:连接两个或多个表。UNION:合并多个SELECT语句的结果。SUBQUERY:嵌套查询。EXISTS:判断是否存在符合条件的数据。IN:判断某个值是否在指定的列表中。LIKE:模糊匹配。BETWEEN:判断某个值是否在指定的范围内。CASE:在查询语句中使用条件表达式。
-
数据控制语言(DCL):用于授权和撤销用户对数据库的访问权限。常见的DCL语句包括GRANT和REVOKE等。
GRANT:授权。REVOKE:收回授权。CREATE USER:创建新用户。ALTER USER:修改用户信息。DROP USER:删除用户。CREATE ROLE:创建新角色。ALTER ROLE:修改角色信息。DROP ROLE:删除角色。SET PASSWORD:修改用户密码。FLUSH PRIVILEGES:刷新权限。
-
事务控制语言(TCL):用于控制事务的提交、回滚和保存点操作。常见的TCL语句包括COMMIT、ROLLBACK和SAVEPOINT等。
START TRANSACTION:开始一个事务。COMMIT:提交一个事务,将修改保存到数据库。ROLLBACK:回滚一个事务,将修改撤销。SAVEPOINT:创建一个保存点。ROLLBACK TO:回滚到指定的保存点。RELEASE SAVEPOINT:删除指定的保存点。
数据类型
- 数值类型:用于存储数值数据,包括整型(INT、TINYINT、SMALLINT、MEDIUMINT、BIGINT)、浮点型(FLOAT、DOUBLE)、定点数(DECIMAL)等。
- 字符串类型:用于存储文本数据,包括定长字符串(CHAR)、变长字符串(VARCHAR)、文本类型(TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT)和枚举类型(ENUM)等。
- 日期和时间类型:用于存储日期和时间数据,包括日期类型(DATE)、时间类型(TIME)、日期时间类型(DATETIME)和时间戳类型(TIMESTAMP)等。
- 二进制类型:用于存储二进制数据,包括二进制类型(BINARY、VARBINARY)和大对象类型(TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB)等。
简单查询
-
查询表
SELECT * FROM table_name; SELECT * FROM users;结果展示
username userID userPassword Jeronasand 76 123456789 -
指定列
SELECT column1, column2, ... FROM table_name; (从名为`customers`的表中查询客户的姓名和地址) SELECT name, address FROM customers;name address Jeronasand 1234156 -
指定列别名
SELECT column_name AS alias_name FROM table_name; SELECT name, age AS "Employee Age" FROM employees;name Employee Age Jeronasand 19 SELECT name Name, age Age FROM employees; SELECT name Name, age "Age" FROM employees; SELECT name "Name", age Age FROM employees; SELECT name "Name", age "Age" FROM employees; SELECT name 'Name', age 'Age' FROM employees;Name Age Jeronsand 19
where查询
SELECT column1, column2, ... FROM table_name WHERE condition;
-- codition为条件
SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE age > 18 AND gender = 'male';
SELECT * FROM users WHERE email IS NULL;
SELECT * FROM users WHERE name LIKE '张%';
SELECT * FROM users WHERE column_name IN (value1, value2, ...);
SELECT * FROM users WHERE column_name NOT IN (value1, value2, ...);
SELECT * FROM users WHERE gender IN ('male', 'female');
SELECT * FROM users WHERE column_name BETWEEN value1 AND value2;
SELECT * FROM users WHERE column_name NOT BETWEEN value1 AND value2;
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
order by查询
SELECT column1, column2, ... FROM table_name ORDER BY column1 ASC|DESC, column2 ASC|DESC, ...;
SELECT name, age, age*2 as age_double FROM users ORDER BY age DESC;
假设表 users 中的数据如下:
| id | name | age |
|---|---|---|
| 1 | Alice | 25 |
| 2 | Bob | 30 |
| 3 | Charlie | 20 |
| 4 | David | 35 |
那么执行上述查询语句的结果将是:
| name | age | age_double |
|---|---|---|
| David | 35 | 70 |
| Bob | 30 | 60 |
| Alice | 25 | 50 |
| Charlie | 20 | 40 |
分页查询
SELECT column1, column2, ... FROM table_name [WHERE condition] [ORDER BY column1, column2, ...] LIMIT [offset,] row_count;
-- []中的内容可以不写
SELECT * FROM users ORDER BY created_at DESC LIMIT 10 OFFSET 0;
-- 显示第一页,每页显示 10 条记录
数值运算符
加减乘除:加减乘除运算符分别表示加法、减法、乘法和除法,用法非常简单,例如:
SELECT 1 + 2; -- 返回 3
SELECT 3 - 1; -- 返回 2
SELECT 2 * 4; -- 返回 8
SELECT 6 / 2; -- 返回 3
需要注意的是,在进行除法运算时,如果除数为 0,将会抛出一个错误。
取余:取余运算符 % 用于计算两个数相除后的余数,例如:
SELECT 5 % 2; -- 返回 1
数学函数
- ABS:ABS 函数用于返回一个数的绝对值,例如:
SELECT ABS(-3.14); -- 返回 3.14
- CEILING/FLOOR:CEILING 和 FLOOR 函数分别用于对一个数进行上取整和下取整操作,例如:
SELECT CEILING(3.14), FLOOR(3.14); -- 返回 4 和 3
- ROUND:ROUND 函数用于对一个数进行四舍五入操作,例如:
SELECT ROUND(3.14), ROUND(3.57); -- 返回 3 和 4
ROUND 函数还可以指定保留小数位数,例如:
SELECT ROUND(3.1415926, 2); -- 返回 3.14
- SQRT:SQRT 函数用于计算一个数的平方根,例如:
SELECT SQRT(4); -- 返回 2
- POW:POW 函数用于计算一个数的幂,例如:
SELECT POW(2, 3); -- 返回 8
- TRUNCATE:TRUNCATE 函数用于将一个数截断到指定的小数位数,例如:
SELECT TRUNCATE(3.1415926, 2); -- 返回 3.14
数值函数
- SUM:SUM 函数用于对查询结果集中某一列进行求和,例如:
SELECT SUM(salary) FROM employees;
- AVG:AVG 函数用于对查询结果集中某一列进行平均值计算,例如:
SELECT AVG(salary) FROM employees;
- MAX/MIN:MAX 和 MIN 函数分别返回查询结果集中某一列的最大值和最小值,例如:
SELECT MAX(age), MIN(age) FROM users;
- COUNT:COUNT 函数用于返回查询结果集中某一列的记录数,例如:
SELECT COUNT(*) FROM users;
字符串常量
SELECT 'Hello, world!';
SELECT "Hello, world!";
SELECT 'He said, "Don\'t do that!"';
SELECT 'First line\nSecond line';
模糊查询
-- 在 LIKE 关键字后面,可以使用通配符 % 表示任意字符序列(包括空字符序列),使用通配符 _ 表示任意单个字符。例如:
SELECT * FROM students WHERE name LIKE 'Li%';
-- 这个查询语句返回了名字以 Li 开头,并且名字总长度为 3 个字符的学生记录。注意到 _ 只能匹配一个字符,所以这里匹配的是第二个字符。
SELECT * FROM students WHERE name LIKE 'Li_';
- LIKE 关键字通常与 % 或 _ 一起使用。
- 在匹配时,区分大小写。如果需要不区分大小写,可以使用 LOWER() 或 UPPER() 函数将所有字符转换为小写或大写,然后进行匹配。
- 通配符会影响查询效率,使用过多可能会导致查询变慢。如果能够确定匹配规则,可以考虑使用更精确的查询条件。
特殊字符处理
SELECT 'He said, "Don\'t do that!"';
INSERT INTO users (name, email) VALUES ('Tom O\'Neil', 'tom@example.com');
-- 如果需要在 SQL 语句中处理包含大量特殊字符的字符串,可以使用 MySQL 内置的函数来自动转义。其中,最常用的函数是 mysql_real_escape_string() 函数。这个函数会自动转义包含在字符串中的所有特殊字符,可以避免手动添加转义字符的繁琐操作
INSERT INTO users (name, email) VALUES (mysql_real_escape_string('Tom O\'Neil'), 'tom@example.com');
字符串函数
-
CONCAT()和CONCAT_WS():将多个字符串拼接为一个字符串。例如:SELECT CONCAT('My', 'SQL'); -- 返回 'MySQL' SELECT CONCAT('My', NULL, 'SQL'); -- 返回 NULL SELECT CONCAT_WS('-', '2023', '05', '15'); -- 返回 '2023-05-15' -- 如果需要在字符串之间添加分隔符,可以使用 CONCAT_WS() 函数; -- 如果只需要简单的字符串连接,可以使用 CONCAT() 函数。 -
SUBSTRING():截取一个字符串的子串。例如:SELECT SUBSTRING('Hello World', 7); -- 返回字符串 World -
UPPER()和LOWER():将一个字符串转换为大写或小写。例如:SELECT UPPER('Hello, World!'); -- 返回 'HELLO, WORLD!' SELECT LOWER('Hello, World!'); -- 返回 'hello, world!' SELECT UPPER('MySQL 8.0'); -- 返回 'MYSQL 8.0' SELECT LOWER('MySQL 8.0'); -- 返回 'mysql 8.0' -
LENGTH()和CHAR_LENTH:返回一个字符串的长度。例如:SELECT LENGTH('Hello World'); -- 返回 11 SELECT LENGTH('你好'); -- 返回 6 SELECT CHAR_LENGTH('你好MySQL'); -- 返回 7 SELECT CHAR_LENGTH('你好'); -- 返回 2 -
REPLACE():替换一个字符串中的部分内容。例如:SELECT REPLACE('Hello World', 'World', 'MySQL'); -- 返回字符串 Hello MySQL -
TRIM()、LTRIM()和RTRIM():去除一个字符串开头或结尾的空格。例如:SELECT TRIM(' abc '); -- 返回 'abc' SELECT TRIM(BOTH 'x' FROM 'xxxbxxx'); -- 返回 'b' SELECT TRIM(BOTH '.' FROM '.abc.'); -- 返回 'abc' SELECT LTRIM(' abc '); -- 返回 'abc ' SELECT RTRIM(' abc '); -- 返回 ' abc' -
LPAD()和RPAD():在字符串的左侧或右侧填充指定的字符,以达到指定的长度。例如:SELECT LPAD('123', 5, '0'); -- 返回 '00123' SELECT RPAD('123', 5, '0'); -- 返回 '12300' SELECT LPAD('12345', 5, '0'); -- 返回 '12345' SELECT RPAD('12345', 5, '0'); -- 返回 '12345' -
REPEAT()和SPACE():用于生成指定数量的重复字符或空格。例如:SELECT REPEAT('*', 5); -- 返回 '*****' SELECT REPEAT('ab', 3); -- 返回 'ababab' SELECT CONCAT('hello', SPACE(5), 'world'); -- 返回 'hello world' -- 需要注意的是,SPACE() 函数只能生成空格字符,不能生成其他字符。如果要生成其他字符,可以结合 REPEAT() 函数使用。例如,要生成 5 个减号,可以使用以下语句: SELECT CONCAT('start', REPEAT('-', 5), 'end'); -- 返回 'start-----end' -
LOCATE()、INSTR()和POSITION():用于查找一个字符串在另一个字符串中的位置。例如: