Bootstrap

学习mysql知识02,表查询,分组统计,连接查询,嵌套查询,升序和降序

1.单表查询与统计

1.1单个条件的查询

查询条件名字为lisi9864,表为teacher1
select * from teacher1 where name=‘lisi9864’

1.2多个条件查询

查询条件为age大于20小于3,名字为lisi,表为student
select name,age from student where age>20 and age<23 and name=‘lisi’

1.3统计

select count(1) from student 数量//字段第一列的(1)
select sum(age) from student 和值(年龄)
select avg(age) from student 平均值(年龄)
select max(age) from student 最大值(年龄)
select min(age) from student 最小值(年龄)

1.4分组统计

分组的就是把一表分为多组。下面是按teaid(老师学号分组,就是老师学号相同的为一组)进行多组
select teaid, count(1) from student group by teaid 分组统计数量
select teaid,sum(age) from student group by teaid 分组统计和值
select teaid,avg(age) from student group by teaid 分组统计平均值
select teaid,max(age) from student group by teaid 分组统计最大值
select teaid,min(age) from student group by teaid 分组统计最小值

2.连接查询

Sutdnet m条数据,teacher 是n 条数据 一共有=笛卡尔运算 mn
1.从student表 和teacher表中查询M
n条数据。
select student.,teacher. from student,teacher.
2.多加一个student.teaid=teacher.teaid条件
select student.,teacher. from student,teacher where student.teaid=teacher.teaid
3.可以个表加别名,s和t
select s.stuid,s.name,t.name from student s,teacher t where s.teaid=t.teaid

3.嵌套查询

1.从一个查询结果当为条件。写的时候可以分开写,思路清晰一些。
select * from student where teaid=( select teaid from teacher where name=‘fu’)
2.in语句是查询的结果里面有就成立,如查询为(1,2)就把teaid为1,2就都成立,都查询出来。
select * from student where teaid in( select teaid from teacher where name=‘fu’ or name=‘peng’)
3.exists语句,如果查询有结果true,就外部查询。并输出。
如果查询没有结果false,就不输出查询结果。
select * from student where EXISTS( select teaid from teacher where name=‘fu’)
NOT EXISTS 的作用与 EXISTS 正好相反。如果子查询没有返回行,则满足了 NOT EXISTS 中的 WHERE 子句。

通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
not in和not exists的区别:
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,
例如:查询那些班级中没有学生的,
select * from class where cid not in(select distinct cid from stu)
当表中cid存在null值,not in 不对空值进行处理
解决:select * from class
where cid not in
(select distinct cid from stu where cid is not null)
not in的执行顺序是:是在表中一条记录一条记录的查询(查询每条记录)符合要求的就返回结果集,不符合的就继续查询下一条记录,直到把表中的记录查询完。也就是说为了证明找不到,所以只能查询全部记录才能证明。并没有用到索引。
not exists:如果主查询表中记录少,子查询表中记录多,并有索引。
例如:查询那些班级中没有学生的,
select * from class2

where not exists

(select * from stu1 where stu1.cid =class2.cid)

not exists的执行顺序是:在表中查询,是根据索引查询的,如果存在就返回true,如果不存在就返回false,不会每条记录都去查询。
之所以要多用not exists,而不用not in,也就是not exists查询的效率远远高与not in查询的效率。

4.升序和降序

4.1单个字段排序

select * from student order by age 升序(从小到大)

select * from student order by age desc降序(从大到小)

4.2多个字段排序

select * from student order by age,java 升序

select * from student age desc,java desc 降序

;