2.Mysql SQL基础
2.1 SQL简介
SQL(Structure Query Language)是结构化查询语言。
2.2 SQL使用入门
2.2.1 SQL分类
SQL分为DDL、DML(DQL)、DCL3类。
DDL(Data Definition Language)数据定义语言,用来定义数据库对象,如:表、列、索引、数据库(模式)等,包括:createdropalter runcate等。
DML(DQL)(Data Manipulation LanguageData Query Language)数据操作(查询)语言,用来操作记录数据,包括:insertupdatedeleteselect等。
DCL(Data Control Languages)数据控制语言,用来控制事务和权限,包括:commit
ollbackgrant
evoke等。
2.2.2 DDL语句
1).创建数据库(mysql的数据库其实是schema)
语法:
crete database 数据库名;
举例:
create database test1;
--查看数据库
show databases;
--使用数据库
use test1;
--查看表
show tables;
2).删除数据库
语法:
drop database 数据库名;
注意:数据库删除后,数据库下的表和数据都会被删除。
举例:
drop database test1;
3).创建表
语法:
create table 表名(
列名 列数据类型 约束,
...
) ENGINE=存储引擎名 DEFAULT CHARSET=字符集;
举例:
create table emp(
empno int(8) not null,
ename varchar(20),
sal decimal(10,2),
hiredate date,
deptno int(8)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
--查看表定义
desc emp;
show create table emp;
4).删除表
语法:
drop table 表名;
举例:
drop table emp;
5).修改表
5.1) 增加列
语法:
alter table 表名 add [column] 列名 数据类型 约束 [FIRST|After col_name];
举例:
alter table emp add column comm decimal(10,2) After sal;
5.2) 修改列类型或列顺序
语法:
alter table 表名 modify [column] 列名 数据类型 约束 [FIRST|After col_name];
举例:
alter table emp modify column comm int(8) after deptno;
5.3) 修改列名
语法:
alter table 表名 change [column] 旧列名 新列名 数据类型 约束 [FIRST|After col_name];
举例:
alter table emp change column comm com decimal(10,2) after sal;
5.4) 删除列
语法:
alter table 表名 drop [column] 列名;
举例:
alter table emp drop column com;
5.5) 修改表名
语法:
alter table 表名 rename [to] 新表名;
举例:
alter table emp rename to emp1;
2.2.3 DML语句
6).新增记录
语法:
insert into 表名(列名,...) values (值,...);
举例:
insert into emp (empno,ename,sal,hiredate,deptno) values (1,'张三',1000,'2000-01-01',10);
按列的顺序,插入所有列值时,可以省略列名
insert into emp values (2,'李四',1000,'2000-01-01',10);
插入部分列值时,不可省略列名
insert into emp (empno,ename,sal) values (3,'王五',1000);
支持多行插入
insert into emp (empno,ename,sal,hiredate,deptno) values
(4,'马六',1000,'2000-01-01',10),
(5,'孙七',1000,'2000-01-01',10);
支持子查询
insert into emp (empno,ename)
(select empno+10,concat(ename,'_10') from emp where empno<3);
7).更新记录
语法:
update 表名 set 列名=值,... where 条件;
支持同时更新多个表的数据:
update 表1,表2,... set 表1.列名=表2.列名,... where 条件;
举例:
SET SQL_SAFE_UPDATES = 0;
update emp set sal=sal+1000,hiredate=now() where ename='马六';
update emp t1,emp t2 set t2.sal=t1.sal,t2.hiredate=t1.hiredate,t1.deptno=t2.deptno
where t1.ename=substring(t2.ename,1,2) and t2.empno in (11,12);
update emp set sal=(select deptno*1000 from dept where dname='销售部') where empno=3;
--update emp set (sal,ename)=(select deptno*100,loc from dept where deptno=emp.deptno) where empno=20;
不支持
8).删除记录
语法:
delete from 表名 where 条件;
支持同时删除多个表的数据:
delete 表1,表2,... from 表1,表2,... where 条件;
支持子查询:
delete from 表名 where 子查询;
例子:
create table dept(
deptno int(8) not null,
dname varchar(20),
loc varchar(100)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
insert into dept values (10,'开发部','北京');
insert into dept values (20,'销售部','上海');
delete from emp where ename='孙七';
delete emp,dept from emp,dept where emp.deptno=dept.deptno and dname='开发部';
insert into dept values (10,'开发部','北京');
update emp set deptno=10 where empno in (1,11);
update emp set deptno=20 where empno in (2,12);
delete from emp where deptno=(select deptno from dept where dname='开发部');
delete from emp where not exists (select 1 from dept where dept.deptno=emp.deptno);
9).查询记录
语法:
select [distinct] *|列,...
from 表
where 条件
group by 分组列,... [with rollup] having 分组后条件
order by 排序列 asc|desc,...
limit 起始行数,显示行数
说明:
distinct 去重
* 代表所有列
条件 可以使用比较运算符= > < >= <= !=,还可以使用逻辑运算符关联多个条件,如and or not
order by可以按照多个列排序,ASC升序,DESC降序,默认是升序
limit 起始行数,显示行数 用于分页查询,如limit 100,10 即显示101行到110行这10行记录。
起始行数不写时默认为0,如limit 100 即显示前100行记录。
group by 按列进行分组聚合,聚合函数有sumcountmaxminavg等
with rollup 表明是否对聚合后的结果进行再汇总
having 表示对分类后的结果再进行条件过滤(即使用分组后的条件)
举例:
select count(1) from emp;
select deptno,count(1) from emp group by deptno;
select deptno,count(1) from emp group by deptno with rollup;即分组统计部门人数又统计了所有部门的总人数
10).表连接
准备数据:
delete from emp;
delete from dept;
insert into emp (empno,ename,sal,hiredate,deptno) values (1,'张三',1000,'2000-01-01',10);
insert into emp values (2,'李四',1000,'2000-01-01',20);
insert into emp values (12,'李四_1',1000,'2000-01-01',20);
insert into emp (empno,ename,sal) values (3,'王五',1000);
insert into dept values (10,'开发部','北京');
insert into dept values (20,'销售部','上海');
insert into dept values (30,'xx部',null);
连接分为5种:笛卡尔积cross join,内连接(等值连接)inner join,左外连接left join,右外连接right join,全外连接full join。
10.1) 笛卡尔积cross join
select * from emp cross join dept;
10.2) 内连接(等值连接)inner join
select * from emp inner join dept on emp.deptno=dept.deptno;
select * from emp,dept where emp.deptno=dept.deptno;
10.3) 左外连接left join
select * from emp left join dept on emp.deptno=dept.deptno;
--select * from emp,dept where emp.deptno=dept.deptno(+);
10.4) 右外连接right join
select * from emp right join dept on emp.deptno=dept.deptno;
10.5) 全外连接full join(mysql不支持full join)
--select * from emp full join dept on emp.deptno=dept.deptno;
select * from emp left join dept on emp.deptno=dept.deptno
union
select * from emp right join dept on emp.deptno=dept.deptno;
11).子查询
11.1)select子查询
select
empno,ename,deptno,
(select dname from dept where deptno=emp.deptno) dname
from emp;
11.2)from子查询
select *
from dept,(select * from emp where sal>2000) emp
where dept.deptno=emp.deptno;
11.3) where子查询
select * from emp
where deptno in (select deptno from dept where dname='RESEARCH');
11.4) insert子查询
insert into dept (deptno,dname)
select round(empno/100),upper(ename) from emp where job='MANAGER';
11.5) update子查询
SET SQL_SAFE_UPDATES = 0;
update emp set sal=(select deptno*1000 from dept where deptno=emp.deptno) where empno=7369;
--update emp set (sal,ename)=(select deptno*100,loc from dept where deptno=emp.deptno) where empno=7369;
等价修改为:
update emp,dept
set sal=dept.deptno*10,ename=dept.loc
where emp.deptno=dept.deptno and ename='SMITH';
11.6) delete子查询
delete from emp where deptno=(select deptno from dept where dname='开发部')and empno=7639;
delete from emp where not exists (select 1 from dept where dept.deptno=emp.deptno) and empno=7639;
12).并交差
12.1) union all 合并不去重
select * from emp where deptno in (10,20)
union all
select * from emp where deptno in (10,30);
12.2) union 合并且去重(union all+distinct)
select * from emp where deptno in (10,20)
union
select * from emp where deptno in (10,30);
12.3) Intersect 交集 mysql不支持
select * from emp where deptno in (10,20)
intersect
select * from emp where deptno in (10,30);
等价实现:
select * from
(select * from emp where deptno in (10,20)) t1,
(select * from emp where deptno in (10,30)) t2
where t1.empno=t2.empno;
12.4) minus/except 差集 mysql不支持
select * from emp where deptno in (10,20)
minus/except
select * from emp where deptno in (10,30);
等价实现:
select * from emp where deptno in (10,20)
and empno not in (select empno from emp where deptno in (10,30));
2.2.4 DCL语句
commit 提交
rollback 回退
grant 授权
revoke 回收权限
例子:
update emp set ename='SMITH' where empno=7369;
commit;
update emp set ename='SMITH_1' where empno=7369;
rollback;
--因为mysql设置的自动提交,所以不需要使用commit显示提交,且rollback回退命令失效。
语法:
grant 权限 on 模式.表 to 用户;
revoke 权限 on 模式.表 from 用户;
例子:
grant select,insert on scott.* to 'li'@'%' identified by '123'; -- 授权并创建用户
revoke insert on scott.* from 'li'@'%'; -- 回收权限
2.3 帮助的使用
2.3.1 按照层次看帮助
? contents 用来显示可供查询的分类
? 类别名称 可以查看某个类别的详细信息,如:
? data type 查看到所有的数据类型
? auto_increment 查看自增长类型
? int 查看int类型
2.3.2 快速查阅帮助
? 关键字 关键字快速查询
? show 查看show命令可以查看的内容及show命令语法
? create table 查看建表语句语法
2.3.3 常用的网络资源
https://dev.mysql.com/downloads/ mysql官网,可以下载mysql及相关开发工具
https://dev.mysql.com/doc 文档下载
https://bugs.mysql.com bug列表及bug报告提交
https://www.mysql.com/news-and-events/newsletter/ mysql最新消息
2.4 查询元数据信息
元数据是指数据的数据,即表名、列名、列类型、索引名等
5.0之前的版本查看元数据只能通过如下命令:
show tables; 查看模式下的所有表
show create table table_name; 查看某个表的建表语句
show table status; 查看模式下所有表的状态
举例:
show tables;
show create table emp;
show table status;
show databases;
show tables from scott;
show columns from scott.emp;
show index from scott.emp;
5.0之后的版本新增了information_schema库(模式),用来记录mysql中的元数据,可以通过下列表批量查看元数据:
SCHEMATA:记录mysql实例中所有的数据库信息,show databases命令取自SCHEMATA;
TBALES:记录数据库中所有表的信息及表的属性信息,show tables from schemaname命令取自TBALES;
COLUMNS:记录数据库中表的所有列信息及列的属性信息,show columns from schemaname.tablename命令取自COLUMNS;
STATISTICS:提供有关表索引的信息,show index from schemaname.tablename命令取自STATISTICS。
举例:
select * from information_schema.SCHEMATA;
select * from information_schema.TABLES where table_schema='scott';
select * from information_schema.COLUMNS where table_schema='scott' and table_name='emp';
select * from information_schema.STATISTICS where table_schema='scott' and table_name='emp';
2.5 小结