一、数据定义语句
1、启动和关闭服务
先进入到MySQL所在的文件夹中
输入mysqld --console启动服务
输入mysqladmin -uroot 即可关闭服务
2、连接到MySQL服务器
mysql -uroot -p
在以上命令行中,mysql代表客户端命令,-u后面跟连接的数据库用户,-p表示需要输入密码
3、命令的结束符用;或者\g结束,客户端连接id纪律了MySQL服务到目前为止的连接次数,help;或者\h可显示帮助内容,\c用来清除命令行buffer。
4、mysql>后面输入要执行的语句,每个语句以分号;或者\g结束,回车键执行。
5、创建数据库test1
create database test1;
6、 查询系统中存在的数据库
show databases;
information_schema:存储了系统中的一些数据库对象信息,比如用户表信息、列信息、权限信息、字符集信息、分区信息等
mysql:存储系统的用户权限信息
performance_schema:主要用于收集数据库服务器性能参数
sys:数据来源于performance_schema,把复杂度降低
7、选择数据库test1
use test1;
8、查看当前数据库中创建的所有数据表
show tables;
9、删除数据库
drop database test1;
10、创建一张表
create table emp(ename varchar(10),hiredate date,sal decimal(10,2),deptno int(2));
创建了一个名为emp的表,表中包括ename姓名,hiredate雇佣日期,sal薪水3个字段,字段类型分别用varchar(10),date,int(2)
11、查看表
desc emp;
或者输入show create table emp \G;
\G是使得记录能够按照字段竖向排列,以便更好地显示内容较长的记录。
12、删除表
drop table emp;
13、修改表类型
修改表emp 的ename字段定义,varchar(10)改为varchar(20)
alter table emp modify ename varchar(20);
增加表字段
在表emp中新增加字段age,类型为int(3)
alter table emp add column age int(3);
删除表字段
将字段age删除掉
alter table emp drop column age;
字段改名
将age改为age1,同时修改字段类型为int(4)
alter table emp change age age1 int(4);
change和modify都可以修改表的定义,不同的是change后面需要写两次列名,不方便,但是change的优点是可以修改列名称,modify则不能。
修改字段排列顺序
add,change,modify都有一个可选项first\after column_name,可用来修改字段在表中的位置,add增加的字段默认加在表的最后位置,而change,modify默认都不会改变字段的位置。
将新增的字段birth date加在ename之后
alter table emp add birth date after ename;
修改字段age,将它放在最前面
alter table emp modify age1 int(4) first;
更改表名:
将表emp改为emp1
alter table emp rename emp1;
二、数据管理语句DML
1、插入记录
向表emp中插入以下记录:ename为zzx1,hiredate为2000-01-01,sal为2000,deptno为1
insert into emp(ename,hiredate,sal,deptno)values(‘zzx1’,‘2000-01-01’,‘2000’,1);
也可以不用指定字段名称,但是values后面的顺序应该和字段的排列顺序一致:
insert into emp values(‘lisa’,‘2003-02-01’,‘3000’,2);
含可控字段、非空但是含有默认值的字段、自增字段,可以不用在insert后的字段列表里面出现,values后面只写对应字段名称的value,没写的字段可以自动设置为NULL、默认值、自增的下一个数字,可大大缩短SQL语句的复杂性
eg: 只对表中的ename和sal字段显式插入值
insert into emp (ename,sal) values(‘dony’,1000);
2、查看实际插入值
select * from emp;
3、insert可以一次性插入多条记录,用逗号分隔
eg:对表dept一次插入两条记录:
insert into dept values(5,‘dept5’),(6,‘dept6’);
4、更新记录–update
eg:将表emp中ename为lisa的薪水sal从3000改为4000;
update emp set sal=4000 where ename=‘lisa’;
可同时更新多个表中数据
eg:同时更新表emp中的字段sal和表dept中的字段deptname
update emp a,dept b set a.sal=a.sal*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;
5、删除记录–delete
eg:在emp中将ename为dony的记录全部删除,命令如下:
delete from emp where ename=‘dony’;
可一次删除多个表中的数据(如果from后面的表名用别名,则delete后面也要用相应的别名,否则提示语法错误)
eg:同时删除表emp和dept中deptno为3的记录
delete a,b from emp a, dept b where a.deptno=b.deptno and a.deptno =3;
注意:不管是单表还是多表,不加where条件将会把表的所有记录删除
6、查询记录
select * from emp;
*号表示要将所有的记录都选出来,也可以用逗号分隔的所有字段来代替
(1)查询不重复的记录–distinct
select distinct deptno from emp;
(2)条件查询–where
select * from emp where deptno=1;
查询表中所有deptno为1的记录
where后面除了=,还有使用>,<,>=,>=,!=等比较运算符,多个条件之间还可以使用or,and等逻辑运算符进行多条件联合查询
eg:select * from emp where deptno=1 and sal<3000;
(3)排序–order by
desc表示按照字段进行降序排列,asc则表示升序排列,不写则默认升序,order by后面可以跟多个不同的排序字段且每个排序字段可以有不同的排序顺序
eg:select * from emp order by sal;
如果排序字段的值一样,则值相同的字段按照第二个排序字段排序,如果只有一个排序字段,则字段相同的记录将会无序排列。
eg:select * from emp order by deptno,sal desc;
对于排序后的记录,只想显示一部分而不是全部,则使用limit关键字
eg:select * from emp order by sal limit 3;
显示emp表中按照sal排序后的前3条记录
select * from emp order by sal limit 1,3;
显示emp表中按照sal排序后从第二条记录开始的三条记录(0代表从第一条开始,1代表从第二条开始)
(4)聚合
sum(求和)、count(星)(记录数)、max(最大值)、min(最小值)
group by关键字表示要进行分类聚合的字段,比如要按照部分分类统计员工数量,部门就应该写在group by后面;
with rollup是可选语法,表明是否对分类聚合后的结果进行汇总;
eg:在emp表中统计公司总人数
select count(1) from emp;
count(*)表示记录数
eg:在此基础上,要统计各个部门的人数
select deptno,count(1) from emp group by deptno;
group by 表示要分类聚合的字段
eg:既要统计各部门人数,又要统计总人数
select deptno,count(1) from emp group by deptno with rollup;
with rollup是可选语法,表明是否对分类聚合后的记过进行再汇总;
eg:统计人数大于1的部门
select deptno,count(1) from emp group by deptno having count(1)>1;
having表示对分类后的结果再进行条件的过滤
而where是在聚合前就对记录进行过滤
eg:统计公司国有员工的薪水总额、最高和最低薪水
select sum(sal),max(sal),min(sal) from emp;
having和where的区别: having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,我们尽可能用where先过滤记录,这样因为结果集减小,聚合的效率大大提供啊,最后再根据逻辑看是否用having进行再过滤。
(5)表连接
可同时显示多个表中的字段,分为内连接和外连接,内连接选出两张表中互相匹配的记录,外连接则选出其他不匹配的记录
eg:select ename,deptname from emp,dept where emp.deptno=dept.deptno;
外连接分为左连接和右连接
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录
eg:查询emp中所有用户名和所在部门名称
select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
改为右连接:
select ename,deptname from dept right join emp on dept.deptno=emp.deptno;
(6)子查询
当进行查询的时候,需要的条件是另一个select语句的结果,此时则要用到子查询
用于子查询的关键字主要包括in,not in,=,!=.exists,not exists等
eg:从emp表中查询出所有部门在dept表中的记录
select * from emp where deptno in(select deptno from dept);
如果子查询记录数唯一,还可以用=代替in;
(7)记录联合
将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,关键字union和union all
union all是把结果集直接合并在一起,union是将union all后的结果进行一次distinct,去除重复记录后的结果
eg:将emp和dept表中的部分编号的集合显示出来
select deptno from emp(没有分号,回车进入下一行)
union all
select deptno from dept;
将结果去掉重复记录后显示如下
select deptno from emp(没有分号,回车进入下一行)
union
select deptno from dept;
三、数据控制语句DCL
主要是用来管理系统中的对象权限时使用,一般的开发人员很少使用
查询元数据信息
eg1:删除数据库test1下所有前缀为tmp的表
select concat(‘drop table test1.’,table_name,’;’) from tables where table_schema=‘test1’ and table_name like ‘tmp%’;
eg2:将数据库test1下所有存储引擎为myisam的表改为innodb
select concat("alter table test1.’,table_name,’ engine=innodb;’) from tables where table_schema=‘test1’ and engine=‘MyISAM’;
常用视图
schemata:该表提供了当前mysql实例中所有数据库的信息,show databases的结果取之此表
tables:该表提供了关于数据库中的表的信息(包括视图),详细描述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。show tables from schemaname的结果取之此表
columns:该表提供了表中的列信息,详细表述了某长膘的所有列以及每个列的信息,show columns from schemaname.tablename的结果取之此表
statistics:该表提供了关于表索引的信息。show index from schemaname.tablename的结果取之此表
1
1
1