MySQL基础语法
查询
全表查询
select * from 表名
示例
让我们假设有一张名为 student 的数据表,它存储了学生的信息,包括学号、姓名、年龄等。
现在,我们来使用 select 全表查询语句,查看整个学生表的内容。
数据表 student:
| 学号 | 姓名 | 年龄 |
|---|---|---|
| 101 | 小明 | 20 |
| 102 | 小红 | 22 |
| 103 | 小刚 | 21 |
| 104 | 小丽 | 19 |
SQL 查询语句:
select * from student;
查询结果:
| 学号 | 姓名 | 年龄 |
|---|---|---|
| 101 | 小明 | 20 |
| 102 | 小红 | 22 |
| 103 | 小刚 | 21 |
| 104 | 小丽 | 19 |
选择查询
select 列名,列名... from 表名
示例
假设有一张名为 students 的学生数据表,它存储了班级里学生的信息,包括姓名(name)、年龄(age)、性别(gender)、分数(score)等。
数据表 students:
| name | age | gender | score |
|---|---|---|---|
| John | 18 | Male | 90 |
| Alice | 17 | Female | 88 |
| Bob | 19 | Male | 78 |
| Kate | 18 | Female | 95 |
现在,我们使用"选择查询"来获取所有学生的姓名(name)和性别(gender)信息,SQL 语句如下:
select name, gender from students;
查询结果:
| name | gender |
|---|---|
| John | Male |
| Alice | Female |
| Bob | Male |
| Kate | Female |
别名
select 列名 as 别名,列名 as 别名... from 表名
示例
假设有一张名为 employees 的数据表,它存储了团队成员的信息,包括姓名(name)、年龄(age)、职位(position)等:
数据表 employees:
| name | age | position |
|---|---|---|
| John | 30 | Project Manager |
| Alice | 28 | Software Engineer |
| Bob | 32 | Product Designer |
| Kate | 26 | Marketing Specialist |
现在,我们使用 "别名" 来获取所有团队成员的姓名(name)和职位(position)信息,并为它们取别名为 员工姓名 和 职位名称:
-- SQL查询语句
select name as 员工姓名, position as 职位名称 from employees;
上述代码中的 as 也可以省略,比如
name 员工姓名也是 ok 的。
查询结果,注意表格头的列名从英文变为了中文:
| 员工姓名 | 职位名称 |
|---|---|
| John | Project Manager |
| Alice | Software Engineer |
| Bob | Product Designer |
| Kate | Marketing Specialist |
常量和运算
示例
假设有一张名为 orders 的数据表,它存储了订单信息,包括订单编号(order_id)、商品单价(unit_price)、购买数量(quantity)等:
数据表orders:
| order_id | unit_price | quantity |
|---|---|---|
| 1001 | 10.00 | 5 |
| 1002 | 20.00 | 3 |
| 1003 | 15.00 | 2 |
| 1004 | 25.00 | 4 |
现在,我们需要计算每个订单的总金额(total_amount),即商品单价(unit_price)乘以购买数量(quantity)。
SQL 查询语句如下:
select order_id, unit_price, quantity, unit_price * quantity as total_amount from orders;
查询结果如下,其中 total_amount 是计算出来的新列:
| order_id | unit_price | quantity | total_amount |
|---|---|---|---|
| 1001 | 10.00 | 5 | 50.00 |
| 1002 | 20.00 | 3 | 60.00 |
| 1003 | 15.00 | 2 | 30.00 |
| 1004 | 25.00 | 4 | 100.00 |
此外,SQL 可以直接把常量作为列名,比如执行下列 SQL 语句:
select 200, '篮球' as hobby;
查询结果如下:
| 200 | hobby |
|---|---|
| 200 | 篮球 |
条件查询
SELECT 列1, 列2, ...
FROM 表名
WHERE 条件;
其中,列1, 列2, ...是你要选择的列,可以是具体的列名,也可以是*表示选择所有列。表名是你要从中查询数据的表名。条件是指定的查询条件,可以使用比较运算符(如=、<、>等)、逻辑运算符(如AND、OR等)、IN 操作符、LIKE 操作符等来设置条件。
示例
假设有一张名为products的数据表,它存储了产品信息,包括产品名称(name)、单价(price)、库存(stock)等:
数据表products:
| name | price | stock |
|---|---|---|
| A | 10.00 | 50 |
| B | 20.00 | 30 |
| C | 15.00 | 20 |
| D | 25.00 | 10 |
现在,我们使用 "WHERE" 来筛选出库存小于等于 20 的产品:
-- SQL查询语句
select name, price, stock from products where stock <= 20;
查询结果:
| name | price | stock |
|---|---|---|
| C | 15.00 | 20 |
| D | 25.00 | 10 |
条件查询-运算符
比如 =、 !=、<、> 等
示例
假设有一张名为 employees 的数据表,它存储了员工信息,包括员工姓名(name)、年龄(age)、工资(salary)等:
数据表 employees:
| name | age | salary |
|---|---|---|
| 小明 | 25 | 5000 |
| 小红 | 30 | 6000 |
| 小李 | 28 | 5500 |
| 小张 | 22 | 4500 |
现在,我们使用不同的运算符来进行条件查询:
1)使用 "!=" 运算符筛选出 name 不是 '小张' 的员工:
-- SQL查询语句
select name, age, salary from employees where name != '小张';
查询结果:
| name | age | salary |
|---|---|---|
| 小明 | 25 | 5000 |
| 小红 | 30 | 6000 |
| 小李 | 28 | 5500 |
2)使用 ">" 运算符筛选出工资高于 5500 的员工:
-- SQL查询语句
select name, age, salary from employees where salary > 5500;
查询结果:
| name | age | salary |
|---|---|---|
| 小红 | 30 | 6000 |
3)使用 "BETWEEN" 运算符筛选出年龄在 25 到 30 之间的员工:
-- SQL查询语句
select name, age, salary from employees where age between 25 and 30;
查询结果:
| name | age | salary |
|---|---|---|
| 小明 | 25 | 5000 |
| 小红 | 30 | 6000 |
| 小李 | 28 | 5500 |
条件查询-空值
在数据库中,有时候数据表的某些字段可能没有值,即为空值(NULL)。
空值表示该字段的值是未知的、不存在的或者没有被填写的。在SQL查询中,我们可以使用 "IS NULL" 和 "IS NOT NULL" 来判断字段是否为空值或非空值。
示例
假设有一张名为 employees 的数据表,它存储了员工信息,包括员工姓名(name)、年龄(age)、入职日期(hire_date)等:
数据表 employees :
| name | age | hire_date |
|---|---|---|
| 小明 | 25 | 2020-01-01 |
| 小红 | 30 | 2020-02-15 |
| 小李 | 28 | NULL |
| 小张 | NULL | 2020-03-20 |
现在,我们使用 "IS NULL" 来查询出入职日期未填写的员工:
-- SQL查询语句
select name, age from employees where hire_date is null;
查询结果:
| name | age |
|---|---|
| 小李 | 28 |
条件查询-模糊查询
模糊查询是一种特殊的条件查询,它允许我们根据模式匹配来查找符合特定条件的数据,可以使用 LIKE 关键字实现模糊查询。
在 LIKE 模糊查询中,我们使用通配符来代表零个或多个字符,从而能够快速地找到匹配的数据。
有如下 2 种通配符:
- 百分号(%):表示任意长度的任意字符序列。
- 下划线(_):表示任意单个字符。
示例
假设有一张名为employees的数据表,它存储了员工信息,包括员工姓名(name)、年龄(age)、职位(position)等:
数据表employees:
| name | age | position |
|---|---|---|
| 张三 | 25 | 软件工程师 |
| 李四 | 30 | 数据分析师 |
| 王五 | 28 | 产品经理 |
| 小明 | 22 | 软件测试工程师 |
现在,我们使用 LIKE 模糊查询来找出姓名(name)中包含关键字 "张" 的员工信息:
-- SQL查询语句
select name, age, position from employees where name like '%张%';
查询结果:
| name | age | position |
|---|---|---|
| 张三 | 25 | 软件工程师 |
还可以使用模糊查询匹配开头和结尾:
-- 只查询以 "张" 开头的数据行
select name, age, position from employees where name like '张%';
-- 只查询以 "张" 结尾的数据行
select name, age, position from employees where name like '%张';
同理,可以使用 not like 来查询不包含某关键字的信息。
条件查询-逻辑运算
在逻辑运算中,常用的运算符有:
- AND:表示逻辑与,要求同时满足多个条件,才返回 true。
- OR:表示逻辑或,要求满足其中任意一个条件,就返回 true。
- NOT:表示逻辑非,用于否定一个条件(本来是 true,用了 not 后转为 false)
示例
假设有一张名为employees的数据表,它存储了员工信息,包括员工姓名(name)、年龄(age)、工资(salary)等:
数据表employees:
| name | age | salary |
|---|---|---|
| 张三 | 25 | 10000 |
| 李四 | 30 | 12000 |
| 李五 | 28 | 15000 |
| 小明 | 22 | 8000 |
现在,我们使用逻辑运算来找出姓名中包含关键字 "李" 且 年龄小于 30 岁的员工信息:
-- SQL查询语句
select name, age, salary from employees where name like '%李%' and age < 30;
查询结果:
| name | age | salary |
|---|---|---|
| 李五 | 28 | 15000 |
去重
在 SQL 中,我们可以使用 DISTINCT 关键字来实现去重操作。
select distinct 字段1, 字段2, 字段3, ... from 表名
示例
假设有一张名为students的数据表,它存储了学生信息,包括学生姓名(name)、班级ID(class_id)、考试编号(exam_num)、成绩(score)等:
数据表students:
| name | class_id | exam_num | score |
|---|---|---|---|
| 张三 | 1 | 1 | 90 |
| 李四 | 2 | 2 | 85 |
| 王五 | 1 | 1 | 92 |
| 李四 | 2 | 3 | 88 |
现在,我们使用DISTINCT关键字来找出不同的班级 ID:
-- SQL 查询语句
select distinct class_id from students;
查询结果:
| class_id |
|---|
| 1 |
| 2 |
除了按照单字段去重外,DISTINCT 关键字还支持根据多个字段的组合来进行去重操作,确保多个字段的组合是唯一的。
排序
在 SQL 中,我们可以使用 ORDER BY 关键字来实现排序操作。ORDER BY 后面跟上需要排序的字段,可以选择升序(ASC)或降序(DESC)排列。
select 字段1,字段2 from 表名 order by 字段1 [升序/降序], 字段2 [升序/降序], ...
示例
假设有一张名为 students 的数据表,它存储了学生信息,包括学生姓名(name)、年龄(age)和成绩(score)等:
数据表 students :
| name | age | score |
|---|---|---|
| 张三 | 18 | 90 |
| 李四 | 20 | 85 |
| 王五 | 19 | 92 |
| 赵六 | 20 | 88 |
现在,我们使用ORDER BY关键字来对学生表进行排序:
-- SQL 查询语句 1
select name, age from students order by age asc;
-- SQL 查询语句 2
select name, score from students order by score desc;
查询语句 1 结果,按照年龄升序(从小到大):
| name | age |
|---|---|
| 张三 | 18 |
| 王五 | 19 |
| 李四 | 20 |
| 赵六 | 20 |
查询语句 2 结果,按照分数降序(从大到小):
| name | score |
|---|---|
| 王五 | 92 |
| 张三 | 90 |
| 赵六 | 88 |
| 李四 | 85 |
截断和偏移
在 SQL 中,我们使用 LIMIT 关键字来实现数据的截断和偏移。
截断和偏移的一个典型的应用场景是分页,即网站内容很多时,用户可以根据页号每次只看部分数据。
示例
假设有一张名为 tasks 的数据表,它存储了待办事项信息,包括任务名称(task_name)和截止日期(due_date)等。
数据表tasks:
| task_name | due_date |
|---|---|
| 完成报告 | 2023-08-05 |
| 预约医生 | 2023-08-08 |
| 购买礼物 | 2023-08-10 |
| 安排旅行 | 2023-08-15 |
现在,我们使用LIMIT关键字来进行分页查询:
-- LIMIT 后只跟一个整数,表示要截断的数据条数(一次获取几条)
select task_name, due_date from tasks limit 2;
-- LIMIT 后跟 2 个整数,依次表示从第几条数据开始、一次获取几条
select task_name, due_date from tasks limit 2, 2;
查询语句 1 结果,只获取了 2 条数据:
| task_name | due_date |
|---|---|
| 完成报告 | 2023-08-05 |
| 预约医生 | 2023-08-08 |
查询语句 2 结果,从下标为 2(第 3 条)数据的位置开始获取 2 条数据:
| task_name | due_date |
|---|---|
| 购买礼物 | 2023-08-10 |
| 安排旅行 | 2023-08-15 |
条件分支
条件分支 case when 是 SQL 中用于根据条件进行分支处理的语法。它类似于其他编程语言中的 if else 条件判断语句,允许我们根据不同的条件选择不同的结果返回。
case when 支持同时指定多个分支,示例语法如下:
selec 字段1 , CASE WHEN (条件1) THEN 结果1
WHEN (条件2) THEN 结果2
...
ELSE 其他结果 END from 表名
示例
假设有一个学生表 student,包含以下字段:name(姓名)、age(年龄)。数据如下:
| name | age |
|---|---|
| 小明 | 18 |
| 鸡哥 | 25 |
| 李华 | 30 |
| 王五 | 40 |
使用条件分支 case when ,根据 name 来判断学生是否会说 RAP,并起别名为 can_rap。
示例 SQL 如下:
SELECT
name,
CASE WHEN (name = '鸡哥') THEN '会' ELSE '不会' END AS can_rap
FROM
student;
查询结果:
| name | can_rap |
|---|---|
| 小明 | 不会 |
| 鸡哥 | 会 |
| 李华 | 不会 |
| 王五 | 不会 |