目录
对于MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等。
使用ORDER BY语句来实现排序,排序可针对一个或多个字段。
ASC:升序,默认排序方式。
DESC:降序。
order by 语句用来实现排序的,ASC是按照升序排序,是默认的排序方式。
DESC 是按降序进行排列 ,当然order by前面可以使用 where字句查询结果进一步过滤。
语法:
- 按分数排序,默认不指定是升序排列
- select id,name,score from class order by score;
- 降序
- select id,name,score from class order by score desc;
- 还可以结合where进行条件过滤,查询学生信息先按兴趣id降序排列,相同分数的,id也按降序排列
- select id,name,hobbid from class order by hobbid desc,id desc;
-
- 注:order by之后的第一个参数只有在出现相同值时,第二个字段才有意义,否则第二个字段无效。
- 查询分数大于60并且小于等于90的数据
- select * from class where score >60 and score <=90;
- 查询分数大于70或小于等于90的数据
- select * from class where score >70 or score <=90;
- 查询不重复的爱好
- select distinct hobbid from class;
查询sql结果 对结果 进行分组GROUP BY来实现 group by通常都是结合聚合函数一起使用。
- 按hobbid相同的分组,计算相同分数的学生个数
- select count(name),hobbid from class group by hobbid
- 显示数据总数量
- select count(*) number from class;
- 查询所有信息显示前4行记录
- select * from class limit 3;
- 按id的大小倒序排列显示第4行往后显示3行内容
- select * from class order by id desc limit 3,3;
mysql查询的时候,表和字段做一个别名,原因主要是表和列的字段比较长。
as还可以在创建表的时候插入其他表的数据,也可以克隆表,但没有主键及约束。
- 列别名设置
- select name as 姓名,score as 成绩 from class;
- 创建t1表,将class表的查询记录全部插入t1表
- create table www as select name,score from class;
%:表示零或多个字符。
- 查询名字是l开头的记录
- select id,name from class where name like 'l%';
- 查询名字中间有i的记录
- select id,name from class where name like '%i%';
子查询就是内查询或者嵌套查询,是指在一个查询语句里面还嵌套另一个查询的语句。
语法:
in 将主表和子表进行关联/连接,用来判断某个值是否在给定结果集中。
in 通常结合子查询来进行使用
not in 取反
exists 判断 如果是否为空 ,如果不为空,则返回 true,否则反之 false。
- 以www表中的名字查询class表
- select id,name,score from class where name in (select name from www);
- id大于4的分数变为87
- update class set score=87 where id in (select id from eee where id>4);
MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接。
两张或多张表中同时符合某种条件的数据记录的组合。
select * from test1 inner join test2 on a_name=b_name;
内连查询:通过inner join 的方式将两张表指定的相同字段的记录行输出出来。
左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
select * from test1 left join test2 on a_name=b_name;
左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL。
右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。
select * from test1 right join test2 on a_name=b_name;
在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹配的行,这些记录在左表中以 NULL 补足。。