SQL:Structure Query Language,结构化查询语言。
DDL语句:数据定义语言 DML语句:数据操纵语言 DCL语句:数据控制语言
DDL语句
对数据库内部的对象进行创建(create)、删除(drop)、修改(alter)等操作。
与DML语句最大的区别就是DML只是对表内部数据(记录)进行操作,而不涉及表的定义、结构的修改,更不会涉及其他对象。
1、创建数据库
create database test1; show databases; +---------------------+ | Database | +---------------------+ | information_schema | | mysql | | performance_schema | | samples | | sys | +---------------------+
information_schema: 主要存储系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等。
mysql: 存储了系统的用户权限信息。
2、删除数据库
drop database test1;
3、创建表
create table emp( ename varchar(10), hiredate date, sal decimal(10,2), deptno int(2) );
查看表的定义:
desc emp;
查看表的创建语句:
show create table emp \G;
4、删除表
drop table emp;
5、修改表
(1)修改表类型
alter table emp modify ename varchar(20);
(2)增加表字段
alter table emp add column age int(3);
(3)删除表字段
alter table emp drop column age;
(4)字段改名
alter table emp change age age1 int(4);
注意:change和modify都可以修改表的定义,不同的是change后面需要写两次列名。
change的优点是可以修改列名称。
(5)修改字段排列顺序
alter table emp add birth date after ename; alter table emp modify age int(3) first;
(6)更改表名
alter table emp rename emp1;
DML语句
1、插入记录
insert into emp(ename, hiredate, sal, deptno) values('zzx1', '2000-01-01', '2000', 1);
注意:含可空字段、非空但是含有默认值的字段、自增字段,可以不用在insert后的字段列表里出现,values后面只写对应字段名称的value。
insert into dept values(5, 'dept5'),(6, 'dept6');
2、更新记录
update emp set sal=4000 where ename='lisa';
注意:可以同时更新多个表中的数据。多表更新可以用在根据一个表的字段来动态地更新另一个表的字段。
update emp a,dept b set a.sal=a.sal*b.deptno, b.deptname=a.ename where a.deptno=b.deptno;
3、删除记录
delete from emp where ename='dony';
注意:可以删除多个表中的记录。
如果from后面的表名用别名,则delete后面也要用相应的别名,否则会提示语法错误。
delete a,b from emp a, dept b where ...;
4、查询记录
(1)查询不重复的记录
select distinct deptno from emp;
(2)where条件查询
(3)排序和限制
排序:order by field1 [desc/asc],field2 [desc/asc]
select * from emp order by sal limit 1,3;
(4)聚合
统计公司总人数:
select count(1) from emp;
统计各部门的人数:
select deptno,count(1) from emp group by deptno;
统计各部门的人数以及总人数:with rollup表明是否对分类聚合后的结果进行再汇总
select deptno,count(1) from emp group by deptno with rollup;
统计人数大于1人的部门:
select deptno,count(1) from emp group by deptno having count(1) > 1;
统计公司所有员工的薪水总额、最高和最低薪水:
select sum(sal),max(sal),min(sal) from emp;
注意:having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤。
(5)表连接
内连接
左连接
右连接:a right join b on a.deptno = b.deptno;
(6)子查询
关键字:in、not in、=、!=、exists、not exists等。
如果子查询记录数唯一,可以用=代替in。
某些情况下,子查询可以转化为表连接。
表连接在很多情况下用于优化子查询。
(7)记录联合
union
union all
DCL语句
创建一个数据库用户z1,具有对sakila数据库中所有表的select/insert权限:
grant select,insert on sakila.* to 'z1'@'localhost' identified by '123';
收回insert权限:
revoke insert on sakila.* from 'z1'@'localhost';