Mysql 高级操作

2021-01-18 10:55:37 浏览数 (2)

连接

inner join(内连接)

  • 两个表都存在匹配时,返回行
  • 查询每个学生,每个科目的成绩
代码语言:javascript复制
select students.sname, subjects.stitle, scores.score
from scores
inner join students on scores.stuid = students.id
inner join subjects on scores.subid = subjects.id;
### 如下
 ------- -------- ------- 
| sname | stitle | score |
 ------- -------- ------- 
| Gage  | 语文   | 90.00 |
 ------- -------- ------- 

left join(左连接)

  • 返回左表中的所有数据,即使右表中没有匹配的数据

查询每个学生的平均成绩

代码语言:javascript复制
select students.sname, avg(scores.score)
from scores
left join students on scores.stuid = students.id
group by students.sname;

返回右表中的所有数据,即使左表中没有匹配的数据

full join (全连接)

  • 只要一个表存在匹配就返回

自关联

对于省市区表,我们可以采用一对多的形式建立三张表,但这样会带来不必要开销,分析后发现 省份无上级,我们建立三个字段,id为省份id, pid为市区id,这样只要让pid=id就可以使省市区关联起来

定义数据表

查询山东省下的所以市区

查询省市区

内置函数

对于复杂的一些查询,每次书写查询语句相当麻烦。我们可以定义视图

子查询

普通查询

  • 查询每位学生的各科成绩
代码语言:javascript复制
mysql> select sname as 姓名,
    -> (select scores.score from scores inner join subjects on subjects.id=scores.subid where subjects.stitle="语文"  and students.id=scores.stuid)  as 语文,
    -> (select scores.score from scores inner join subjects on subjects.id=scores.subid where subjects.stitle="数学"  and students.id=scores.stuid)  as 数学
    -> from students;
 -------- -------- -------- 
| 姓名   | 语文   | 数学   |
 -------- -------- -------- 
| Gage   |  90.00 |  54.00 |
| sss    |   NULL |   NULL |
| kksk   |   NULL |   NULL |
 -------- -------- -------- 

比较查询

  • 查询数学成绩大于85的学生
代码语言:javascript复制
select sname as 姓名, 
(select scores.score from scores inner join subjects on subjects.id=scores.subid where subjects.stitle="数学"  and students.id=scores.stuid and score>85)  as 数学
from students;
 -------- -------- 
| 姓名   | 数学   |
 -------- -------- 
| Gage   |  98.00 |
| sss    |  86.00 |
| kksk   |   NULL |
 -------- -------- 

范围查询

使用in子查询:表示该操作数(字段值)等于该子查询的任意一个值就满足条件

返回所有以小开头的商品id

代码语言:javascript复制
select pid from product where pid in
(select pid from product where pname like '小%');

返回以小开头的商品

代码语言:javascript复制
select * from product where pid=any
(select pid from product where pname like '小%');

all

表示该操作数的值必须跟列子查询的所有值都满足给定的比较运算,才算满足了条件

返回商品最高的哪个商品

exists

如果该子查询有结果数据(无论什么数据,只要大于等于1行),则为true,否则为false

代码语言:javascript复制
select * from product where exists
(select pid from product where pname like 'p%');

0 人点赞