SQL语句执行顺序
开始->from 子句-where子句-> group by 子句->having子句-> select子句->distinct(去重)-> order by子句-> limit子句->最终结果
SQL语句书写顺序
select * + from 表名 + where[like] 子句 + group by 分组 + order by 排序 + limit 起始下标,数量
聚合函数:
count(列名 或者 * )
max(列名)
min(列名)
avg(列名) 自动过滤 null ==============> ifnull(列名,0)
sum(列名)
时间函数:
curdate() – 获取当前日期: 年月日
curtime() – 获取当前时间: 时分秒
now() – 获取当前日期+时间, 年月日 时分秒
year(‘2020-8-10’): 返回年份, 2020 ()
month(‘2020-8-10’): 返回月份 8
day(‘2020-8-10’): 返回 日10
hour(‘2020-8-10 12:34:56’): 返回小时, 12
minute(‘2020-8-10 12:34:56’): 返回分钟数, 34
second(‘2020-8-10 12:34:56’): 返回秒值, 56
其他函数
concat(‘s1’,‘s2’,‘s3’…) 将 s1、s2、…sn 拼接在一起返回
concat_ws(x,‘s1’,‘s2’,‘s3’)
其他补充:
1)多表查询
连接查询
内连接查询: select * from 表A inner join 表B on +两张表关联的条件
左关联 : select * from 表A left join 表B on +两张表关联的条件
右关联 : select * from 表A right join 表B on +两张表关联的条件
外关联查询:
mysql不支持全外连接查询!但可以通过union来模拟这种查询!
union关键字是用于将两个查询结果上下合并在一起显示,并且会去除重复记录。
union all关键字是用于将两个查询结果上下合并在一起显示,不会去除重复记录
能够使用union和union all合并结果的查询语句,必须符合:
1.两条SQL语句查询的结果列数必须相同
2.两条SQL语句查询的结果列名必须相同(低版本mysql要求)
select * from dept left join emp on emp.dept_id=dept.id
union (all)
select * from dept right join emp on emp.dept_id=dept.id;
2) 如果是在cmd中执行插入记录的语句,先 set names gbk; 再插入记录!
3)distinct用于去除重复记录,只保留一行!
查询emp表中的所有部门和职位
select distinct dept, job from emp;
4)添加约束的格式:
create table stu(
id int primary key, ----- 主键约束
id int primary key auto_increment, -----自增
gender varchar(10) not null, -------添加非空约束
);
5)where和having的区别?
where和having都是用于对表中的记录进行筛选过滤
where用于在分组之前对记录进行筛选过滤,而having用于对分组之后的记录进行筛选过滤
where子句中不能使用多行函数 和 列别名,但可以使用表别名!
select name as 姓名, sal as 薪资 from emp e;
-- 其中上面的'姓名','薪资'都是列别名, e是表别名
having子句中可以使用多行函数 和 列别名 以及 表别名!