linux mysql基本查询语句、表连接、where子句(第三天)

目录

  • 基本查询语句
    • select语句
    • as命名别名,as可省略
    • distinct过滤重复数据
    • limit限定返回数据行
  • 表连接
    • 表连接的类型
    • 内连接
      • 两个表连接
      • 三个表连接
    • 外连接
      • 左外连接
      • 右外连接
  • where子句
    • 比较运算符
    • 使用where子句实现内连接
    • between...and
    • is null
    • in
    • like模糊查询
    • 逻辑运算符

基本查询语句

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] 当前系统时间;

linux mysql基本查询语句、表连接、where子句(第三天)_第1张图片

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;

linux mysql基本查询语句、表连接、where子句(第三天)_第2张图片

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_nameclasses: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 andnot between and

is nullis not nullinnot inlikenot 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;

你可能感兴趣的:(linux,#,mysql,mysql,数据库,sql)