目录
基本查询语句
select语句
select 字段列表 from 数据源
[where 条件表达式] [group by 分组字段 [having 条件表达式]]
[order by 排序字段 [asc | desc]]
- 字段列表:指定要检索的字段
- 数据源:检索的表或者视图
- where子句:用于指定记录的过滤条件
- group by子句:用于对检索数据进行分组
- having子句:对分组后的数据进行筛选
- order by子句:用于对结果集中进行排序,其中
asc
表示升序,desc
为降序,默认是升序。
字段列表指定方式
字段列表 | 说明 |
---|---|
* | 字段列表为数据源的全部数据 |
字段列表 | 逗号隔开的字段列表,指定需要检索的若干字段 |
表名.* | 多表查询时,指定某个表的全部字段 |
表名.字段 | 多表查询时,指定某个表的某个字段 |
表达式 | 表达式中可以包含算术运算、函数等 |
as命名别名,as可省略
select version(),now();
# 命名别名 在结果中以别名来显示出来。
字段或者表达式 [as] 别名;
select version() [as] 版本号, now() [as] 当前系统时间;
select 字段列表 from 表名;
select * from student; # 查询全部
select student_no, student_name from student; # 查询部分字段
select student.* from student; # 查询全部
select student.student_no from student; # 查询部分字段
select student.student_no 学号,student_name 姓名,
class_no 班号 from student; # 改为别名的方式
select stu_no 学号,exam_score 卷面,regular_score 平时分,
exam_score*0.8+regular_score*0.2 总分 from exam;
distinct过滤重复数据
select distinct 字段列表 from 表名;
select table_schema from information_schema.tables; # 单列
select table_schema,table_type from information_schema.tables; # 多列
# 其中tables是数据库information_schema中的一张表,用来保存数据库中表和视图的信息。
select table_schema,table_name,table_type
from information_schema.tables; # 多列
select distinct table_schema from information_schema.tables; # 进行过滤
select distinct table_schema,table_type
from information_schema.tables; # 多列
limit限定返回数据行
select 字段列表 from 表名 limit [start,] length;
start:表示从第几行记录开始检索,缺省值为0,表达第一行。
length:表示每页要检索的行数。
列出information_schema.tables表中的前10行记录的table_schema和table_name
select table_name,table_schema from information_schema.tables limit 10;
列出information_schema.tables表中的第七页(每页10行),从第61行到70行的数据
select table_name,table_schema from information_schema.tables limit 60,10;
表连接
需求:列出学生的信息,包括学号、姓名和班级名称。
那么就需要连接两个表:student:student_no、student_name
和 classes:class_name
两张表都含有class_no
字段
表连接的类型
- 内连接:符合关联条件的记录被检索出来,不符合条件的被过滤掉。
- 外连接:外连接的结果 = 内连接的结果 + 匹配不到的记录。
内连接
两个表连接
select 字段列表 from 表1 [inner] join 表2 on 关联条件;
# 需求内连接 这种在语法上是没有问题的,需要连接的表没有重复的字段,将字段前的表名省略了。
select student_no 学号,student_name 姓名,class_name 班级名称
from student join classes on student.class_no = classes.class_no;
# 这两种是一样的结果
select student.student_no 学号,student.student_name 姓名,classes.class_name 班级名称
from student join classes on student.class_no = classes.class_no;
# 使用别名 更加简洁 使用别名的话,当前语句中就只能够使用别名,不能在用原表名。
select s.student_no 学号,s.student_name 姓名,c.class_name 班级名称
from student s join classes c on s.class_no = c.class_no;
三个表连接
select 字段列表 from 表1 join 表2 on 关联条件1 join 表3 on 关联条件2;
# 显示学号、姓名、课程名称以及成绩
select s.student_no 学号,s.student_name 姓名,
c.course_name 课程名称,ch.score 成绩 from student s
join choose ch on s.student_no=ch.student_no
join course c on c.course_no=ch.course_no;
外连接
左外连接
左外连接的结果集 = 内连接的结果集 + 左表中匹配不上的记录
select 字段列表 from 左表 left [outer] join 右表 on 关联条件;
# 列出全部学生的学号、姓名和班级名称
# 会显示没有班级的学生
select s.student_no,s.student_name,c.class_name
from student s left join classes c
on s.class_no = c.class_no;
右外连接
右外连接的结果集 = 内连接的结果集 + 右表中匹配不上的记录
select 字段列表 from 左表 right [outer] join 右表 on 关联条件;
# 列出全部学生的学号、姓名和班级名称
# 会显示没有学生的班级
select s.student_no,s.student_name,c.class_name
from student s right join classes c
on s.class_no = c.class_no;
where子句
作用: 根据条件表达式从数据源中筛选出符合条件的记录
语法:
select 字段列表 from 数据源 where 条件表达式;
比较运算符
select * from choose where score>=60; # 列出及格的成绩
# 连接其他表,显示张三的姓名学号和成绩。
select s.student_no,s.student_name,c.score
from student s join choose c
on s.student_no = c.student_no
where s.student_name = '张三';
使用where子句实现内连接
select 字段列表 from 表1,表2 where 关联条件;
select s.student_no,s.student_name,c.score
from student s,choose c where s.student_no = c.student_no
between…and
判断表达式的值是否在给定的闭区间
语法:
表达式 between 值1 and 值2
select * from choose where score between 70 and 90;
# 查询选课时间是在2018年的。
select * from choose where choose_time
between '2018-01-01 00:00:00' and '2018-12-31 23:59:59';
is null
判断是否为空值
语法:
表达式 is null
# 列出没有班级的学生信息
select student_no 学号,student_name 姓名,student_contact 联系方式
from student where class_no is null;
# 列出没有学生的班级信息
select c.class_no 班号,c.class_name 班级名称,c.department_name 院系名称
from classes c left join student s on c.class_no = s.class_no
where s.student_no is null;
in
判断一个表达式的值是否出现在列表中
相当于使用
or
进行连接语法:
表达式 in(值1,值2...)
# 列出选修了电路或者C语言的学生信息,包括学号、课程名称、成绩。
select ch.student_no 学号,c.course_name 课程名称,c.score 成绩
from course c join choose ch on c.course_no = ch.course_no
where c.course_name in('C语言','电路');
# 等价于
select ch.student_no 学号,c.course_name 课程名称,c.score 成绩
from course c join choose ch on c.course_no = ch.course_no
where c.course_name = 'C语言' or c.course_name = '电路';
like模糊查询
判断表达式的值是否符合给定的模式
语法:
表达式 like 模式
通配符:
%
:匹配任意长度的任意字符,_
:匹配一位任意字符。
# 列出表中姓王的学生
select student_no,student_name,student_contact,class_no
from student where student_name like '王%';
# 检索information_tables表中,表名是‘user_’开头的表的信息.
# 第一种 使用转义字符
select table_schema,table_type,table_name
from information_schema.tables
where table_name like 'user\_%';
# 第二种 自定义转义字符
select table_schema,table_type,table_name
from information_schema.tables
where table_name like 'user#_%' escape '#'; # 指定#号作为转义字符,较为通用
逻辑运算符
与运算
语法:逻辑表达式1 and 逻辑表达式2
# 示例 列出成绩在70~90之间的信息
select * from choose where score >= 70 and score <= 90;
# 列出jack的成绩
select s.student_no,s.student_name,c.score from student s
join choose c on s.student_no=c.student_no
where s.student_name='jack';
# 和上面一样的有 使用and进行连接,同时满足
select s.student_no,s.student_name,c.score
from student s,choose c
where s.student_no=c.student_no and s.student_name='jack';
使用where子句实现三表之间的连接 使用and进行连接
select s.student_no 学号,s.student_name 姓名,c.course_name 课程名称,
ch.score 成绩 from student s,course c,choose ch
where s.student_no=ch.student_no and c.course_no=c.course_no;
或运算
语法:逻辑表达式1 or 逻辑表达式2
select ch.student_no 学号,c.course_name 课程名称,ch.score 成绩
from course c,choose ch where c.course_no=ch.course_no
and (c.course_name='C语言' or c.course_name='Java语言');
非运算
语法:not 逻辑表达式 或者 !(逻辑表达式)
还可以配合前面的
between and
为not between and
,
is null
为is not null
,in
为not in
,like
为not like
等等
select * from course where up_limit != 60;
select * from course where !(up_limit=60);
select * from course where not(up_limit=60);
select * from student where class_no is not null;