3.使用集合函数查询。经常和group by连用
1)sum() 字段值的总和
sum只能进行数值类型的计算,int,float,double,decimal类型等,如果计算字符类型字段时,结果均为0.
eg:select num ,sum(score) from grade where num=’1001’;//学号为1001学生的总成绩
2)avg() 字段值的平均值
eg:select num ,avg(score) from grade where num=’1001’;//学号为1001学生的平均成绩
3)count() 记录的条数
eg: select depart_id ,count(*) from employee group by depart_id;//查看每个部门的人数
4)min() 字段的最小值
eg:select course,min(score) from grade group by course;//计算每门课程最低成绩
用法和max()类似。
5)max() 字段的最大值
eg:select course,max(score) from grade group by course;//计算每门课程最高成绩
如果按照班级和科目两个字段分组,可以查询不同班级的不同科目最高成绩
max()不仅适合数值也适合字符型,使用字符的ASCLL值来计算,当第一个值相等时,继续往下比较第二个字符,直到比较出结果。
4.使用连接查询
连接查询:
将两个或两个以上的表按某个条件连接起来,从中选取需要的数据。
连接查询是同时查询两个或两个以上的表使用的。当不同的表中存在相同意义的字段时,可以通过该字段连接这几个表。
1)内连接查询
内连接查询是一种最常用的连接查询,可以查询两个或两个以上的表,当两个表中存在相同意义的字段时,可以通过该字段连接这两个表。只有当该字段的值相等时,才可查出该记录。
相同意义的字段可以是父表的主键和子表的外键。
eg:select num,sex,age from employee,department where department.depart_id=employee.employ_id;
2)外连接查询
内连接查询是一种最常用的连接查询,可以查询两个或两个以上的表,当两个表中存在相同意义的字段时,可以通过该字段连接这两个表。
当该字段的值相等时,可查出该记录。字段的值不等时,也可查出该记录。
外连接查询包括左连接查询(LEFT)和右连接(RIGHT)查询。
select 属性名列表(来自不同表的属性)
from 表名1 LEFT | RIGHT JOIN 表名2
on 表名1.属性1=表名2.属性2;
a)在进行左连接时,可以查询出表1的所有记录,而只能查询出表2匹配的记录。
b)在进行右连接时,可以查询出表2的所有记录,而只能查询出表1匹配的记录。
3)复合条件连接查询
在连接查询时,可以增加其他的限制条件。通过多个条件的复合查询,可以使查询结果更加准确。
如在将employee表和 department连接查询时,可以添加age>24或 order by grade asc等限制条件。
eg:select num,sex,age from employee,department where department.depart_id=employee.employ_id and age>24;
一般使用内连接比较多,使用外连接的频率很小,通常在进行连接查询时,会加一定的限制条件来查询满足条件的记录。
5 .子查询
子查询是将一个查询语句嵌套在另一个查询语句中。内层语句的查询结果可以为外层查询语句提供查询条件。
在特定情况下,一个查询语句的条件需要另一个查询语句来获取。通过子查询可以实现多表之间的查询。
子查询包括in,not in,any,all,exists,not exists 等关键字,包括比较运算符,如= ,!=,< , >;
1)带In关键字的子查询
一个查询语句的条件可能落在另一个查询语句查询结果中,这个可以用IN关键字来判断。
比如要查询哪些同学选择了计算机系开设的课程,可以先查询出计算机系开设的课程,再查询学生所选的课程在查询的课程的记录。
eg: select * from Stu where courseid in (select courseid from course);
2)带比较运算符的子查询
比较运算符包括= ,!=(<>),< , >,>=,<=;在子查询时使用特别广泛。如查询分数,价格,年龄,收入等。
eg:从computer_stu中查询获得一等奖的学生的学号,姓名,成绩。一等奖学金的最低分为90.
select id,name,score from compture_stu where score>=(select score from scholarship where level=1)
3)带exists关键字的子查询。
exists关键字表示存在,使用exists关键字时,内层查询语句不返回查询的记录,而是返回真假值,
如果内层查询语句查询到满足条件的记录,返回一个true,否则返回false.
当返回值为true时,外层查询语句将进行查询,当返回值为tfalse时,外层查询语句不进行查询或者查询不出任何记录。
查询员工表中是否存在id为1001的雇员姓名。
eg: select * from employee where exists (select name from employee where id=1001);
exists关键字可以与其他的查询条件一起使用,条件表达式与exists之间用and 或 or来连接。
3)带any关键字的子查询。
表示满足其中任一条件,使用any关键字时,只要满足内层查询语句的任何一个,即可通过该条件来执行外层查询语句。
比如,需要查询哪些同学能获得奖学金,必须从奖学金表中查询出各种奖学金的最低分,
只要一个同学的成绩高于不同奖学金分数最低的任何一个即可获得奖学金。
any通常和比较运算符一起使用,>any表示大于任何一个值,=表示等于任何一个值。
eg: select * from compture_stu where score >=any(select score from scholar);
4)带all关键字的子查询
表示满足所有条件,只要满足内层查询语句返回的所有结果,即可通过该条件来执行外层查询语句。
>all 大于所有值 <all小于所有值
比如,需要查询哪些同学能获得一等奖学金,必须从奖学金表中查询出各种奖学金的最低分,
只要一个同学的成绩高于所有不同奖学金分数最低即可获得一等奖学金。
eg: select * from compture_stu where score >=all(select score from scholar);
6.合并查询结果
将多个select语句查询结果合并在一起显示。
使用关键字 union 可将多个select语句查询结果合并之后消除重复的记录显示。
而使用关键字 union all 只是将多个select语句查询结果简单进行合并,而不取消重复记录。
eg:
select 语句1 union | union all select 语句2 union | union all…..语句n;
7.为表和字段取别名
1)为表取别名
当表的名称特别长时,在查询中直接使用表名很不方便,这时可以为表取一个别名,用这个别名来代替表的名称。
在为表取别名的时候必须保证该名称不与数据库中的其他表名相同。
eg: 表名 表的别名
select * from department d where id=1;
以后查询该表的时候就可以直接用表名d了。
select * from d where id=2;
2)为字段取别名
当需要更直观的名字来表示这一列时,我们需要为字段取个别名。
属性名 [as] 别名
as关键字可有可无,实现的作用都是一样的。
为字段取名必须保证该表中没有其他字段与该别名相同,
而且字段的别名只是在显示的时候代替原来的字段名,在查询条件中是不能使用别名的,否则数据库系统会报错。
select id as depart_id ,name as depart_name from department;
如果下次查询如:
select depart_id,depart_name from department;//系统报错
8.正则表达式查询
正则表达式查询:利用某种模式去匹配一类字符串的一个方式。比通配字符查询的能力更强大,更加灵活。
正则表达式的模式字符:
1.使用REGEXP关键字,基本用法形式:
属性名 REGEXP ‘匹配方式’
匹配方式中有很多模式匹配的字符,分别表示不同的意思。
1)查询以特定字符或字符串开头的记录。
eg:select * from employee where name REGEXP ‘^L’;//以L开头的。
eg:select * from employee where name REGEXP ‘^Lily’;//以Lily开头的。
2)查询以特定字符或字符串结尾的记录。
eg:select * from employee where name REGEXP ‘L
′;//以L结尾的。eg:select∗fromemployeewherenameREGEXP‘Lily
’; //以Lily结尾的。
3)用符号‘.’来代替字符串中任意一个字符。两个点则可以代表任意两个字符。
eg:select * from employee where name REGEXP ‘^L..y$’;//以L开头,以Y结尾,中间隔两个任意字符。
4)匹配指定字符中的任意一个。使用方括号[]可将查询字符组成字符集。
eg:select * from employee where name REGEXP ‘[abc]’;
从表的name字段可查出包含任意一个含有a,b,c的记录。
使用方括号也可以指定集合的区间,[a-z]包含小写字母 [0-9]包含数字0-9 [a-z0-9]包含所有的小写字母和数字
5)匹配指定字符以外的字符 [^字符集合]
eg:select * from employee where name REGEXP ‘[^abc]’;查询name字段不包含abc字符的记录
6)匹配指定字符串,指定多个字符串时,需要用该符号‘|’隔开。字符串不能与该符号之间有空格。
eg:select * from employee where name REGEXP ‘ic|oc|ac’;查询name字段包含ic,oc,ac任意一个字符串的记录
7)使用*和+来匹配多个字符
正则表达式中,和+都可以匹配多个该符号之前的字符,但是+至少表示一个字符,而至少可以表示0个字符。
eg:
查询的是c之前有0个或多个a出现的记录。c和a是连续的,如jack
select * from employee where name REGEXP ‘a*c’;
查询的是c之前至少出现过一个a的记录,c和a是连续的,如jack.
eg:select * from employee where name REGEXP ‘a+c’;
8)使用{M}{M,N}来制定字符串连续出现的次数。
{M}表示字符串至少连续出现M次
{M,N}表示字符串至少连续出现M次,最多连续出现N次。
eg:select * from employee where name REGEXP ‘a{M}’;//name字段中a连续出现M次的记录。
eg:select * from employee where name REGEXP ‘ac{M,N}’;//name字段中ac连续出现至少M次,最多N次的记录。