首先展示一下我们的表
课程表 course
成绩表 sc
学生表student
教室表 teacher
SQL查询的基本操作
从上面的表展示可以看出我获得表的数据是通过
select * from 表 展示了表的所有内容,这就是查询的最基本操作。
基本查询
select 属性1 from 表名;
查询 表 中所有记录的 属性1( * 号代表全部属性)
条件查询:
select 属性 from 表 where 条件表达式;
表示在 表 中查询 满足条件 的 记录的属性
带 in 查询
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 关键字仅仅只是拼接了结果而已
把查询结果存储到表中
insert into 目标表 select 属性1 属性2.。。。from 来源表 where 条件;
将来源表的查询数据结果存储到目标表中
目标表:
如果我们只是将若干个属性插入到目标表的话
insert into 目标表(属性1, 属性2 …)select 属性1,属性2 … from 来源表 where 条件;
以上就是MYSQL所有查询的相关操作。