查询可以搭配插入操作进行使用:
创建一个class表(id int,varchar(10) classname),和一个student表(id int,varchar(10) studentname),class表中有三条记录,student表无记录:
此时使用查询和搭配操作就可以实现将class表中的记录全部插入到student表中:
注意事项:可以进行实行多次插入;插入表和被插入表的参数列表的列和类型要相同,否则会报错。
聚合查询
表达式查询是针对列和列之间进行运算,聚合查询是在行和行之间进行运算。
sql中通过-- 或 # 的方式代表注释
聚合函数
sql中提供了一些“聚合函数”来完成行和行之间的运算。
count([distinct] 列名):用于计算行数。
先计算select*,再针对结果集合进行统计。
注意事项:如果是count(*),当有null时也不会有影响;但是如果针对某一行,例如count(name),中出现null,null这一行记录就不会被计入,被直接忽略。
也可以用distinct进行去重。
sum([distinct] 列名):把这一列的若干行进行相加,但是只能针对数字类型(byte,int....)。
例如想求出所有同学的数学成绩:
同样的可以在括号内进行一些运算:
注意事项:如果有null,null会被排除不会进行相加。
如果进行字符串相加,结果是0,这是因为sql会尝试将字符串强转成数字,转不成功会有警告;如果插入的值是’07‘这样的数,显示结果就是7。
avg([distinct] 列名):和sum类似,同样只能针对数字类型进行操作,是针对数字类型的行进行求相加后的平均值。
当遇到非数字类型就会进行强转,不成功警告。
max([distinct] 列名)和 min([distinct] 列名):分别求这一列中的最大/最小值,也是和sum一样,针对数字类型。
聚合查询
使用group by进行分组,针对每一个分组,再分别进行聚合查询。
创建一个表:
进行分组聚合查询:
使用group by时还可以搭配条件,但是要区分出条件是在分组之前还是在分组之后。
1)如果是分组之前,使用where,一般在group by的前面。
2)如果是分组后,使用having,在group by 后使用。
3)如果两个条件都要执行,则where和having可以一起使用。
注意事项:如果针对分组之后不使用聚合函数(此处的avg),此时的结果就是每一组的某一个代表数据。
这里的group by指定的这一列,每一组记录的列相同。
联合查询/多表查询
前面的查询,都是针对一个表,但是有些查询,则是一次性要从多表中进行查询。
笛卡尔积
笛卡尔积是简单的排列组合,把可能的的情况呢穷举了一遍,其中包含一些不合法的数据,所以在进行多表查询的时候要进行筛选。
排列组合
有两个表:class(id ,name),student(id,name,classid)
笛卡尔积就是取第一张表的每一条记录,和student中的记录进行匹配,得到的新记录就是5列:
id ,name,id,name,classid。
新表的记录数就是class表记录数和student表数之积,列数就是两表之和。
连接条件:通过sql条件筛选的条件是连接条件。
联合查询步骤
例如现在有一个score表,一个student表
现在要查询张三的成绩
1)先将两表进行笛卡尔积:
select * from score,student;
2)添加连接条件:
select * from score,student where class.id = student.student_id;
这里查询到的是class中id等于student中student_id的所有记录。
再进一步添加连接条件:
select * from score,student where class.id = student.student_id and student.name = '张三';
此时就完成了一次联合查询。
内连接和外链接
向上面这样的查询方法是内连接。
当两个表中的记录都有对应关系,查询结果就是内连接,但是当出现不对应关系时就要使用外连接。
但是将score中的3改成4,此时就student表中就没有数据对应。
左连接:select * from student left join score on student.id = score.student_id;
此时查询就会显示左边的值,而右边的值全部为null。
自连接
自连接是表自己和自己进行笛卡尔积。
sql中只能进行列和列之间的比较,但是可以使用自连接的方式进行行和行之间的比较。
使用时要给表起别名:select * from score as s1,score as s2;