-
DDL:数据定义语言(Data Define Language):create(创建),alter(修改),drop(删除),TRUNCATE(截断),RENAME(重命名);
-
DML:select(查询),delete(删除),update(更新),insert(新增);
-
DCL:grant(添加权限),revoke(回收权限);
2.1 修改表名
alter table 旧表名 rename to 新表名;
2.2 增加一列
alter table 表名 add 新列名 字段类型 [字段选项];
2.3 删除一列
alter table 表名 drop 字段名;
2.4 修改列类型
alter table 表名 modify 字段名 新的字段类型 [新的字段选项];
2.5 修改列名称
alter table 表名 change 原字段名 新字段名 新的字段类型 [新的字段选项];
SQL完整语法:select * from user where group by having order by limit
3.1 ifnull
注意:只要有null参与的运算,结果一定为null
select name,(sal+comm)*12 as yearsql from emp;
# 解决办法:ifnull()空处理函数
select name,(sal+ifnull(comm,0))*12 as yearsql from emp;
3.2 count(id)与count(*)与count(1)
- count(*):对行的数据进行计算,包含NULL
- count(1):和上述一样
- count(column):对特定列进行计算,不包含NULL
3.3 where后面不能用聚合函数
4. 关于group by,having
分组函数:按照某个字段或某些字段进行分组。
having:对分组之后的数据进行再次过滤。
如:找出每个工作岗位的最高薪资
1. select XXXXXX from emp group by job; # 先分组
2. select max(sql) from emp group by job; # 查询出来的只要最高工资,不知道最高工资属于谁
3. select ename,max(sal),job from emp group by job; # 虽然查出来了人,但是数据有问题,ename是从该job分组里面取的一个人的enma,不一定恰好就是最高工资那个人的名字
4. 结论:当一条sql语句有group by的时候。select 后面只能跟分组字段,或聚合函数(max,avg..) 否则查询出来的结果毫无意义0
如:找出每个部门的最高薪资,要求只显示薪资大于3000的数据【能用where代替having的情况】
# 效率低
select max(sal),detptno from emp group by deptno having max(sal) > 3000;
# 效率高
select max(sql),deptno from emp where sal > 3000 group by deptno;
如:找出每个部门的平均薪资,要求只显示薪资大于3000的数据【不能用where代替having的情况】
select deptno,avg(sql) from emp group by deptno having avg(sal) > 3000