DQL_SQL基本写法
单表基础规则
完整语法
1 | Select [select选项] 字段列表[字段别名]/* from 数据源 [where 字句] [group by子句 ][having 子句][order by 子句][limit 子句]; |
select
Select 选项包含:ALL(所有,默认)、distinct(去重)。其中distinct针对的是查询结果的整条记录而言的。
例如:下面这两句效果一样
1 | select DISTINCT(sex),name from my_student; |
where
where是唯一一个从磁盘开始拿数据的时候就开始进行判断的条件,从磁盘取出一条记录,开始进行where判断,判断结果如果成立,那么取出结果保存到内存,否则放弃。
注意:
这里提到了是取出一条数据,即读数据的方式是逐行,那么就可以理解了为什么where后面不能接分组函数了,因为分组函数的前提是分组了,即使后面没有使用group by子句,也是将整张表作为一个组来进行运算的。
group by
分组子句,group by子句主要的作用是分组,从而进行统计操作,而不是为了展示(展示的时候,只会展示分组记录的第一条记录),分组时,一般会结合使用count()、max()、min()、avg()、sum()函数。
例如:单分组
1 | select c_id,count(*),max(height),min(height),avg(height),sum(age) from my_studentgroup by c_id ; |
sql语句的意思是:my_student表以c_id进行分组,然后显示分组后的每组的c_id名称、每组的总数、每组的最高、最低、平均身高和每组的年龄总和。
例如:多分组
1 | select c_id,sex,count(*),max(height),min(height),avg(height),sum(age)from my_student group by c_id ,sex; |
表示的含义是,对整个表先按照c_id进行分组,然后在此分组的基础之上,然后每组再按照sex,进行分组。
例如:多字段分组(加上显示每组的某一字段的所有数据)
1 | select c_id,sex,count(*),max(height),min(height),avg(height),sum(age) ,GROUP_CONCAT(name)from my_student group by c_id ,sex; |
having
having的作用类同where,而且having能做几乎所有where能做的事情,而where却不能做having能做的很多事情,主要是因为where只能在磁盘提取数据的时候对数据进行操作;而在内存中对数据进行group by分组之后的结果进行处理,只能通过having。
1 | select c_id,count(*),max(height),min(height),avg(height),sum(age) from my_studentgroup by c_id having COUNT(*) >= 3; |
order by
对数据进行排序操作,根据某个字段进行升序或者降序排序。(进行多字段排序的时候,先根据某一字段进行潘旭,然后在排序好的内部再按照某字段进行排序)
单个字段的排序:
1 | select * from my_student order by c_id; |
多个字段的排序:
1 | select * from my_student order by c_id,sex; |
limit
限制结果的数量。Limit 偏移量 记录条数;
1 | select * frommy_student limit 2; |
1 | select * frommy_student limit 0,3; |