查询语句的基本结构:
select 字段列表 from 表名和视图列表 [where 条件表达式1 ,2,3……] [ group by 属性名1 [having 条件表达式 2]] [order by 属性名2 [asc | desc]]
结构有点复杂,一点一点来看。
order by 关键字,是指按照后面关键字来排序,desc是降序,asc升序,(不写的话默认升序)。比如有如下表
+-----+------+-------------+------+------+----------------+
| num | d_id | name | age | sex | homeaddr |
+-----+------+-------------+------+------+----------------+
| 1 | 1001 | 张三 | 26 | 1 | 北京市海淀区 |
| 2 | 2004 | 李四 | 24 | 0 | 北京市昌平区区 |
| 3 | 3014 | 王五 | 25 | 1 | 湖南长沙市 |
+-----+------+-------------+------+------+----------------+
select * from stu order by num desc;
执行后得到:
+-----+------+------+------+------+----------------+
| num | d_id | name | age | sex | homeaddr |
+-----+------+------+------+------+----------------+
| 3 | 3014 | 王五 | 25 | 1 | 湖南长沙市 |
| 2 | 2004 | 李四 | 24 | 0 | 北京市昌平区区 |
| 1 | 1001 | 张三 | 26 | 1 | 北京市海淀区 |
+-----+------+------+------+------+----------------+
mysql> select * from stu where num < 3 order by num desc;
写成这样就会少掉num为3的那条记录。但是顺序一定不能乱,where不能写后边。where后面跟的条件表达式条件有:
比较 =、<、<=、>、>=、!=、<>、!>、!<
指定范围 between and 、 not between and
匹配字符 like、not like
是否空值 is NULL、is not NULL
多个查询条件 and、or
<>是不等于,!>是不大于。
in的作用是判断某个字段是否在集合里面比如where name in ('张三','李四')选出名字是张三或者李四的人。in前加个not就是名字不是张三也不是李四的人。
like后面跟着待匹配的表达式值,比如where name like '张%' 匹配任何姓名以张开头的记录,百分号相当于任意多个字符(可以是0),也可以用'_'这个符号,匹配任意一个字符,对于匹配一个汉字要用两个字符,因为一个汉字占2个字节。
如果结果字段内容有充分,希望去除充分用
select distinct 属性名 from stu;
group by是将结果按照某个字段或者多个字段分组,字段中值相等的为一组。
group by 属性名 [having 条件表达式] [with rollup]
属性名就是用于分组标准的字段名;'having'表达式是用来限制分组后的显示,满足having后面条件表达式的结果才可以被显示。group by单独使用的话,只能显示每个分组的第一条记录,用处不大,需要与集合函数一起使用,比如:
select sex,group_concat(name) from stu group by sex;
得到:
+------+-------------------+
| sex | group_concat(name)|
+------+-------------------+
| 0 | 李四 |
| 1 | 张三,王五 |
+------+-------------------+
with rollup会在记录最后一行加一条记录,是之前记录的总和(对于可以求和的求和,不能的得到NULL)
select sex,group_concat(name) from stu group by sex with rollup;
用这个语句得到:
select sex,group_concat(name) from stu group by sex with rollup;
+------+-----------------------------+
| sex | group_concat(name) |
+------+-----------------------------+
| 0 | 李四 |
| 1 | 张三,王五 |
| NULL | 李四,张三,王五 |
+------+-----------------------------+
子查询的意思是把一个查询的结果嵌套到另一个里面。比如:
select * from employee where d_id in(select d_id from department);
employee中对应在表department中的d_id的记录内容被选择出来。