首先展示一下我们的表 课程表 course 成绩表 sc 学生表student 教室表 teacher
从上面的表展示可以看出我获得表的数据是通过 select * from 表 展示了表的所有内容,这就是查询的最基本操作。
select 属性1 from 表名; 查询 表 中所有记录的 属性1( * 号代表全部属性)
select 属性 from 表 where 条件表达式; 表示在 表 中查询 满足条件 的 记录的属性
select 属性1 from 表 where 属性2 in (x,x,x); 表示在表中查找满足 属性2 只要包含于后面这个集合,那么就打印此记录的属性1。
或者 在 in 前面加 not 就表示 只要属性2 不包含于后面这个集合,那么就打印此记录的属性1。 select 属性1 from 表 where 条件 not in (xx,xx,xx);
select 属性1 from 表 where 条件 属性2 between a and b。 表示查询 表 中 满足条件 属性2 在a 到 b 区间(闭区间)的记录的属性1 。 或者加上not 就表示不在此区间的记录的 属性1。 select 属性1 from 表 where 条件 属性2 not between a and b; 模糊查询 假如我要查一位学生我只直到它的第二个字是 ‘兰’ ,那么我们可以快速查询出来名字第二个字是兰的学生信息。
’‘ 和 ’%‘ 都叫通配符。但是 表示占用一个字符位置,%可以表示任意字符位置
select 属性1 from 表 where 属性2 like ‘_兰’; 那么问题来了,假如我再插入一个学生叫做 纳兰性德 ,结果还是如此么? 这就说明了_占用1个字符。 但这不是我想要的查询结果我并不知道名字有几个字,我只确定第二个字是兰 所以我们还需要再兰字后面加上通配符 % 即可。
select 属性1 from 表 where 属性2 is NULL; select 属性1 from 表 where 属性2 is not NULL; 表示在 表 中 查询属性2 为空 和 属性2 不为空的记录的属性1。
select 属性1 from 表 where 条件1 and 条件2; 在 表 中查询 同时满足条件1 和 条件2 的记录的属性1
select 属性1 from 表 where 条件1 or 条件2; 在 表 中查询 满足条件1 或者 条件2 的记录的属性1
拿学生表举例,我就查寻男同学的年龄情况,我只需要知道有哪些年龄就行,我没必要把多个 20岁 给列出来。所以我们就用 distinct 关键字来解决。 select distince 属性1 from 表 where 条件
order by 属性名 [asc| desc]; asc:升序(默认是胜序) desc:降序
select 属性1 from 表 where 条件 order by 属性2 asc; 表示在 表 中查询 满足条件 的记录的属性1 ,并且按照属性2 进行升序排序。
分组查询表示,我按照某种条件进行分组,我分别对每个组进行查询。 所以这包含了两个条件,怎么分组?怎么查询? select 属性1 from 表 group by 分组条件 having 查询条件。 例如:我要查询每一门课程中分数大于60的记录。
假如说查询的结果极其之长,那么我们就需要用到分页查询。 select 属性1 from 表 where 条件 limit index , num; 表示对表 查询属性1 并且对结果进行 分页,只展示从index1 开始的num条数据
从以上结果可以看出,单写一个数字也是可以的,默认第一个index 为0。
select 属性 from 表 as 表的别名; select 属性 from 表 (空格) 表的别名;
当表太多的时候,我们就可以起别名方便我们码SQL
AVG(属性)计算记录中属性的平均值 SUM(属性)计算记录中属性的和 MAX(属性)计算记录中属性的最大值 MIN(属性)计算记录中属性的最小值 COUNT(属性)计算查询结果的总记录数。
例如: select MAX(Sage) from Student;
内连接,外连接:左连接、右连接 内连接查询 select 属性1 from 左表 inner join 右表 on 条件; 说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。 左连接查询 select 属性1 from 左表 left join 右表 on 条件 左(外)连接,左表(a_table)的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。 右连接查询 select 属性1 from 左表 rigth join 右表 on 条件 与左(外)连接相反,右(外)连接,左表(a_table)只会显示符合搜索条件的记录,而右表(b_table)的记录将会全部表示出来。左表记录不足的地方均为NULL。
一个表与自己自身进行连接操作时,称为自连接 假如我要查比吴兰年龄大的学生的信息。这些信息都在同一个表里,所以我们要用到自查询。 select 属性1 from 表1 a,表1 b where 条件; select 属性1 from 表1 a inner join 表1 b having 条件;
子查询也就是嵌套查询,在Where 子句中包含一个形同 Select-from-where的查询块,这类查询,就叫做子查询。并且子查询的执行是由内向外。**
普通子查询
select 属性1 from 表1 where 属性2 = (select 属性2 from 表2 where 条件); 例如:查询 成绩等于80 的同学信息
ANY
当子查询返回的值不只一个值,而是一个集合。但我最终想要的结果就只想要一个的时候。我们就可以使用ANY。 select 属性1 from 表1 where 属性2 =ANY (select 属性2 from 表2 where 条件); 查询成绩大于60的学生信息 当然我们也可以用 in 来代替 =ANY select 属性1 from 表1 where 属性2 in (select 属性2 from 表2 where 条件);
ALL
ALL的含义就是全部,意思是查询所有满足子查询集合的查询记录。 select 属性1 from 表1 where 属性2 ALL (select 属性2 from 表2 where 条件);
图片来源
EXISTS
当子查询使用EXISTS关键字时,表示对子查询的结果进行判定也就是让它返回 true 或者 false,如果查询结果存在就返回 true,不存在就返回 false。并且只有当子查询返回为true的时候才会进行父查询,否则不进行查询或者查询为空。 selec 属性1 from 表1 where EXISTS(select 属性2 from 表2 where 条件); 如果学生表中存在sid= 1 的学生,那么就进行子查询,否则不查询 当子查询返回false 时。
子查询的查询条件需要引用父查询表中的属性值,这一类查询就叫做相关子查询。 相关子查询的查询顺序: 选取父查询表中的第一行记录,子查询利用此纪录的相关属性进行查询,父查询再根据子查询返回的结果判断此行是否满足查询条件,满足条件则放入结果集中。 重复以上操作,知道处理完父查询表中的每一行数据位置。
查询不讲授语文课的老师的信息
利用UNIOn关键字和UNIOn ALL关键字去拼接多个查询记录 格式: select 属性1 from 表1 UNIOn(UNIOn ALL) select 属性2 from 表2 UNIOn(UNIOn ALL) 。。。。。 select 属性n from 表n; 例子: 我们可以看出这是将所有查询的数据进行拼接而成的,那么假如我两个查询结果时相同的呢? UNIOn关键字进行了去重的操作
而UNIOn ALL 关键字仅仅只是拼接了结果而已