表与表间的关系
数据库表与表之间的关系:一对一、一对多、多对多
一对一:一个表里可以插入另一个表的一个唯一键(不一定是id)
多对一:多表里设置少表里的唯一键
多对多:新建一个关系表,存放两个表中的唯一键(id,以保证查询时不发生重复)
常用查询语句
基本查询:
select * from student;
select:查询的关键字,表示一个要执行的查询
‘*’ :代表所有列 (替换方式就是直接写列名,在进行多表查询的时候列名前要加表名,列名与列名之 间用逗号分隔)
from :代表从哪种表里查询
select 也可用于计算,例:
条件查询:
select *from student where id=1;
where:关键字后为查询条件
查询时如果查询的条件为数值类型时不需要带引号,varchar等字符串类型需要带引号
其他条件查询的关键词:and(与) 、or(或)、not(非)
where .... and ...
where .... or ....
where not ...
去重查询:
select DISTINCT sex from student ;
模糊查询:通过 like 实现
通配符:%(任意多个字符)、_(下划线,单个字符)
select * from student where name llike '%王%';
排序查询:
按照年龄从低到高进行排序:
select * from student ORDER BY age;
如果要反过来,按照年龄从高到底排序,我们可以加上DESC表示“倒序”
select *from student ORDER BY age DESC;
如果想按照年龄降序,并且按照学号升序
select *from student ORDER BY age DESC,sno;
默认的排序规则是ASC:“升序”,即从小到大。ASC可以省略,即ORDER BY score ASC和ORDER BY score效果一样。
分页查询:
把结果集分页,每页3条记录。要获取第1页的记录,可以使用LIMIT 3 OFFSET 0:
聚合查询:
使用SQL内置的COUNT()函数查询:
分组查询:
分组查询的原理:先对数据进行分组,在对分组后的数据进行汇总,分组查询通常用于配合聚合函数,达到分类汇总统计信息的目的。而分类汇总的本质实际上就是先将数组进行分组,分组后相同类别的信息会聚在一起,然后通过需求进行计算。
多表查询:
SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据。查询多张表的语法是:
SELECT * FROM <表1> <表2>
连接查询:
关键词:join 、inner join、left join、 right join
应用示例:
//左连接
select student.name,class.class_name from student
left join class on student.class_num = class.class_num;
//右连接
select student.name,class.class_name from student
right join class on student.class_num = class.class_num;
示意图:
嵌套查询:
一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低。
嵌套查询最终产生的是一个新的表
综合应用
例1:查询出年龄超过21岁,并且选择 语文 的同学名字
图解分析:
SQL语句
SELECT t3.name FROM
(select t2.sno,student.name,student.age FROM student right JOIN
(select t1.sno FROM
(select relationship.sno,relationship.cno,scoure.gradeName
FROM relationship
INNER JOIN scoure on relationship.cno = scoure.cno) t1
WHERE t1.gradeName = '语文') t2
on student.sno = t2.sno) t3
where age > 21;
例2:查询出软件工程班年龄最大,所选择的课程名称及该同学的姓名。
SELECT
t3.NAME,
scoure.gradeName
FROM
(
SELECT
t2.NAME,
relationship.cno
FROM
(
SELECT
t1.sno,
t1.NAME,
t1.age
FROM
(
SELECT
student.sno,
student.NAME,
student.age,
class.class_name
FROM
student
INNER JOIN class ON student.class_num = class.class_num
) t1
WHERE
t1.class_name = '软件工程'
ORDER BY
age DESC
LIMIT 1 OFFSET 0
) t2
INNER JOIN relationship ON t2.sno = relationship.sno
) t3
INNER JOIN scoure ON t3.cno = scoure.cno;