select:简单查询(单表查询),多表查询
syntax:
select [distinct|distinctrow|all]
select_expression,... --列名|表达式|*
[FROM table_references
[where where_definition]
[GROUP BY col_name]
[HAVING where_definition]
[ORDER BY {unsigned_integer|col_name|formula}[ASC|DESC],...]
[LIMIT[offset,]rows]
[PROCEDURE procedure_name]
]
先是关于执行顺序问题
看一个完整的语句
select Ssex,avg(Sage)
from db_school.t_student
group by Ssex
having avg(Sage)>21;
然后试着执行
select Ssex,avg(Sage) from db_school.t_student;
Error Code: 1140. In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'db_school.t_student.Ssex'; this is incompatible with sql_mode=only_full_group_by.
即是说select 的字段必须包含在group字段里.这样看来select 关键字只能是最后执行即先进行结果集的行选再进行结果集的列选,那首先执行的from生成第一次结果集,where 子句筛选后生成新的结果集,group 对结果集进行分组,使用聚集函数进行计算,having 子句筛选分组,计算出其他的表达式,select 的字段对结果集进行列选,最后使用order by 对结果集进行排序.
在执行的整个过程中应该注意到where和having各自的作用时间|作用域,where 对第一次结果集其作用,第一结果集没有分组没有聚集函数没有其他的表达式的结果若执行
select avg(Sage)
from db_school.t_student
where avg(Sage)>21;
是报错Error Code: 1111. Invalid use of group function.问题还是出在编译顺序,执行顺序上,所以只能写成
select avg(Sage)
from db_school.t_student
having avg(Sage)>21;
语法补充1:关于别名
select id [as] 名册,'OK' 状态,NOW() as data
from Sale;--单引号引用表示常量,不引用表示列名;也可以使用函数注意函数的返回值也就算数据类型,
select id as 名册,'OK' as "状 态"
from Sale;--别名有特殊情况使用双引号作标记最好as不省略
语法补充2:where_definition 条件子句的可以使用的谓词
in()
not
between A and B
is NULL--NULL在数据库中是混沌状态可以有真值判断不能进行比较不能进行=null的查询
like:通配符
_:代表任意一个字符,%:代表任意多的字符
and
or
>,<,!=,=,<=,>=
语法补充3:聚合函数也叫集合函数属于表达式聚合函数同order by、distinct、top等都是一样的,都是作用于最终的结果集合的,而不是最用于单行元组的,所以在SQL语句的处理过程当中一定要分清该关键字是作用域单行记录的,还是作用于最终的结果集合的。
count([DISTINCT]列名|*):NULL不记数,count(*)主键?
sum():
avg():
max()
min()
lower()
upper()