SQL语句使用01----where常用等

来源:互联网 发布:droid4x mac 安装失败 编辑:程序博客网 时间:2024/06/06 03:55

这一章开始正式的SQL语句使用,先贴出数据库表的结构
Student(Sid,Sname,Sage,Ssex) 学生表
Course(Cid,Cname,Tid) 课程表
SC(Sid,Cid,score) 成绩表
Teacher(Tid,Tname) 教师表

下面以案例的形式来分析:

1、查询“001”课程比“002”课程成绩高的所有学生的学号;

  • 涉及到表SC,只需要在SC表中比对即可

方法一:(隐性连接,在where中直接连接,逐渐被淘汰)

    select a.Sid from (select score,Sid from SC where Cid='001') a,(select score,Sid from SC where Cid='002') b where a.score>b.score and a.Sid=b.Sid;

方法二:(显式连接,推荐,之后的例句都尽量会使用显式连接)

select a.Sid from (select score,Sid from SC where Cid='001') a inner join (select score,Sid from SC where Cid='002') b on a.Sid=b.Sid where a.score>b.score;

这里写图片描述

  • 如图所示,两种方法查询的结果一致

  • 这里大概把where中常用的查询语句讲解一下,以student表为例

1.算术运算符
+ - * / %

select * from student where Sage+40>100;

这里写图片描述
//这个就不用解释了吧,算数运算~~

2.比较运算符

= < <= =(等于) <>(不等于)

select * from student where Sage>60;

这里写图片描述
3.逻辑运算符:
与: and
或: or
非: not

select * from student where Sage>60 and Sage<80;select * from student where Sage>60 or Sid>1010;

这里写图片描述
//非不好解释,可以理解为熊孩子,要反着来

select * from student where not(Sage>60 or Sid>1010);select * from student where not Sage>60;

这里写图片描述
4.is运算符
只用于对特殊的几个数据进行判断,有如下几个:
xx字段 is true
xx字段 is false
xx字段 is null
xx字段 is not null

select * from student where Sage is true;select * from student where Sage is null;

这里写图片描述
5.between运算符
形式:XX字段 between 值1 and 值2;
含义:用于判断所指定的字段的值,是否在给定的2个值之间(含该两个值);
其可以用如下形式替换:
XX字段 >= 值1 and XX字段 <= 值2;

select * from student where sage between 60 and 80;

这里写图片描述

6.in运算符:
形式:XX字段 in (值1,值2,….)
含义:表示该字段的值如果等于in后面括号中所给定的其中任何一个值,就算满足了条件。

select * from student where sage in(10,20,30);

//我们可以在其中包含子查询

select sage from student where sid>1010;select * from student where sage in(select sage from student where sid>1010);

//第一个查询获得一个结果集,第二次匹配是否在里面
这里写图片描述
7.like运算符——模糊查找
形式:XX字段 like ‘要查找的字符’
含义:用于对一个字符类型的字段进行某种给定字符的模糊查找;
% :用于表示任意个数的任意字符;
_ :用于表示“一个”任意字符;

select * from student where sid like '10__';select * from student where sid like '10%';

//可以看出来,两个结果一样
这里写图片描述

2、查询“001”课程比“002”课程成绩高的所有学生的学号,姓名;

//这里就涉及的了两个表,一个是student,一个是SC表。
方法一://很好理解,先把学号查出来,再与student中的学号对应。这是比较简单的一种方法。

select Sid,Sname from Student where Sid in (select a.Sid from (select score,Sid from SC where Cid='001') a inner join (select score,Sid from SC where Cid='002') b on a.Sid=b.Sid where a.score>b.score);

这里写图片描述
方法二:
//先把学号,名字,成绩查出来,再比较。。。。。太麻烦了
//一步步来,有助于我们分析数据库的查询方式
//一:连表。学生表和成绩表,查询其中001的成绩的学生的姓名,学号;
//仔细看这三个语句就可以发现,查询查询的字段分为我们要求显示的(*/student,Sname)和未显示的,未显示的我们同样可以使用。

select * from Student inner join sc on student.Sid=sc.Sid;select student.Sid,Sname from Student inner join sc on student.Sid=sc.Sid;select student.Sid,Sname from Student inner join sc on student.Sid=sc.Sid where cid='001';select student.Sid,Sname from Student inner join sc on student.Sid=sc.Sid where cid='002';

//仔细看着几步
//分别是连表查询所有——连表查询两个字段——连表查询两个字段加cid=001-连表查询两个字段加cid=002
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

//与上面不同的是,这里我们需要将score查询出来才能用,因为这里面用到了子查询这一个概念,我们用到的字段是子查询得到的字段,这里将只会得到我们之前查询显示出来的结果。
//与上面相同

select a.Sid,a.sname from (select student.Sid,Sname,score from Student inner join sc on student.Sid=sc.Sid where cid='001') a inner join (select student.Sid,Sname,score from Student inner join sc on student.Sid=sc.Sid where cid='002') b on a.sid = b.sid where a.score>b.score;

这里写图片描述
//错误代码:没有查询出score就直接使用:Unknown column ‘a.score’ in ‘where clause’

**select a.Sid,a.sname from (select student.Sid,Sname from Student inner join sc on student.Sid=sc.Sid where cid='001') a inner join (select student.Sid,Sname from Student inner join sc on student.Sid=sc.Sid where cid='002') b on a.sid = b.sid where a.score>b.score;**
原创粉丝点击