肝了一个下午把MySQL所有常用命令总结了一遍

目录

数据定义语言(DDL):

        create:

        alter:

        drop:

        约束:

主键约束(primary key):

外键约束(foreign key):

唯一约束(unique):

非空约束(not null):

数据操作语言(DML):

        inset(插入数据):

        update(更新数据):

        delete(删除数据):

数据查询语言(DQL):

        select 和 from:

        as取别名(as可省略):

        distinct去除重复:

        where控制行:

        查询中包含空值的算术表达式:

        特殊的比较条件:

        between 下限限定 and 上限限定:

        in或者or:in()相当于或者,in(2000,3000,4000)相当于2000或者3000或者4000

        like模糊查询:

        is null和is not null:

        order by排序:

        DQL执行顺序:

                from 

                where 

                select

                order by

        多表查询:

        内连接(inner join):

        等值连接:      

                非等值连接:

         外连接(outer join):

                孤儿数据:

                左外连接(left outer join):

                右外连接(right outer join):

        自连接:

        group by数据分组: 

        having约束分组后的结果:

          子查询:

        单行子查询:

        多行子查询:

数据控制语言(DCL):

        创建用户:

        权限管理:

        删除用户:

还有一个事务控制语言(TCL)这个我就不写了       


数据定义语言(DDL):

        create:

创建表:create table 表名(列名 类型,列名 类型....);

例子:创建employees表其中包含id,name

create table employees(id int,name varchar(10));

        alter:

​​​​修改表名:alter table 旧表名 rename 新表名;

例子:将employees表更名为emp

alter table employees rename emp;

修改列名:alter table 表名 change column 旧列名 新列名 类型;

例子:将emp表中的name列改为ename

alter table emp change column name ename varchar(20);

添加列:alter table 表名 add column 新列名 类型;

例子:为emp表添加address列,类型为varchar(20)

alter table add column address varchar(20);

删除列:alter table 表名 drop column 列名;

例子:删除emp表中address列

alter table emp drop column address;

修改列类型:alter table 表名 modify 列名 新类型

例子:修改emp表中ename列为varchar(10)

alter table emp modify ename varchar(10);

        drop:

删除表:drop table 表名

        约束:

主键约束(primary key):

主键约束修饰的列不允许重复也不允许有空值,主键约束可以设置自动增长(auto_increment)

MySQL中的自动增长类型要求:

  • 一个表中只能有一个列为自动增长
  • 自动增长的列类型必须是整形类型
  • 自动增长只能添加到具备主键约束唯一约束的列上
  • 删除主键约束或唯一约束,如果该列拥有自动增长能力,则需要先去掉自增能力然后再删除约束

        创建表时添加主键约束:create table 表名(列名 类型 主键约束 自动增长......);

例子:创建emp表其中包含id,name,为id列设置主键约束和自动增长

create table emp(id int primary key auto_increment,address varchar(20));

        删除自动增长:alter table 表名 modify 主键列 类型;

其实就是相当于给该列重写设置类型

例子:删除emp表中主键约束id列的自动增长

alter table emp modify id int;

        删除主键约束:alter table 表名 drop primary key;

去除了主键列的自动增长,就可以删除该列的主键约束了

例子:删除emp表中id列的主键约束

alter atble emp drop primary key;

外键约束(foreign key):

        外键约束就是通过参考别的列来约束自己,被参考的列有的才能添加,如果被参考列没有就不能添加

添加外键约束:alter table 表名 add constraint 约束名 foreign key(约束的列) reference 参考表(参考列)

add constraint 的意思就是添加约束,reference就是参考的意思,这句话会点英语就好理解,修改某张表添加外键约束,约束某个列,这个被约束的列参考哪张表的哪个列

例子:此时有两张表一张雇员表一张部门表,我们想让雇员表的deptno部门号参考部门表的部门号,如果部门表没有的部门号,雇员表不能添加:

alter table emp add constraint emp_fk  foreign key(deptno) reference dept(deptno);

这是雇员表(EMP)

这是部门表(DEPT)
 

删除外键约束:alter table 表名 drop foreign key 约束名

例子:删除emp表中deptno部门号的外键约束,约束名为emp_fk

alter table emp drop foreign key emp_fk;

唯一约束(unique):

唯一约束的作用就是被约束的列必须唯一,不能重复但是可以为空

添加唯一约束:alter table 表名 add constraint 约束名 unique(列名);

例子:给emp表中的id列添加唯一约束

alter table emp add constraint emp_uk unique(id);

删除唯一约束:alter table 表名 drop key 约束名

例子:删除emp表中id列的唯一约束

alter table emp drop key emp_uk;

非空约束(not null):

非空约束的作用就是被修饰的列不能为空

添加非空约束:alter table 表名 modify 列名 类型 not null;

例子:给emp表中的id列添加非空约束

alter table emp modify id int not null;

删除非空约束:alter table 表名 modify 列名 类型 null;

例子:删除emp表中id列的非空约束

alter table emp modify id int null;

数据操作语言(DML):

        inset(插入数据):

insert分为选择插入和完全插入

        选择插入语法:insert into 表名(列1,列2) values(值1,值2)

        完全插入语法:insert into 表名 values(值1,值2,值3...);

完全插入值的顺序与列的顺序相对饮

例子:给emp表添加数据,emp表中有id列和name列

insert into emp values(1,"一拳超人");

        update(更新数据):

语法:update 表名 set 列 = 值,列 = 值 where 条件;

注意:这个where条件非常重要没有的话就会给整个表更新数据

例子:将emp表中id为1的name改为"张三",

update emp set name = "张三" where id = 1;

        delete(删除数据):

语法:delete from 表名 where 条件;

注意:这个where条件很重要,如果没有就删除所有数据(典型的删库跑路)

例子:删除emp表中id为1的一行数据

delete from emp where id = 1;

数据查询语言(DQL):

        select 和 from:

select语句指定要查询的列,from语句指定要查询的表

例子:查询emp表中id列

select id from emp;

        as取别名(as可省略):

便于区分,给表取别名,给表达式取别名都是可以的

语法: select 别名.列名 from 表名 as 别名; 或者 select 别名.列名 from 表名  别名;

        distinct去除重复:

对我们所查的相同的结果集进行剔除

注意:distinct语句必须紧跟在select语句后面

语法:select distinct 列名 from 表名;

        where控制行:

对我们查询到的行进行筛选,只有符合条件的才查询出来

语法:select 列 from 表名 where 条件

注意:where语句必须在from语句后面

        查询中包含空值的算术表达式:

mysql中的算术运算符我就不多说了,加减乘除大家都懂,但是需要注意一点的是,mysql中的空值(null)如果在算术表达式中,那么此算术表达式的结果一定为空(null)。

        特殊的比较条件:

mysql中一些常见的比较条件我也不说了,大于(>),小于(<),大于等于(>=),小于等于(<=),等于(=),不等于(!= 或者 <>),我们就来讲讲特殊的比较条件:

        between 下限限定 and 上限限定:

可以翻译为 大于等于下限限定小于等于上限限定

例子:查询emp表中salary在2500~5000之间的员工name

select e.name from emp as e where salary between 2500 and 5000;

        in或者or:in()相当于或者,in(2000,3000,4000)相当于2000或者3000或者4000

例子:查询emp表中工资salary为2000或3000或4000的员工名字name

1、select salary from emp where salary in(2000,3000,4000);

2、select  salary from emp where salary = 2000 or salary = 3000 or salary = 4000;

        like模糊查询:

like的作用就是模糊查询:

        %:代表零个或多个字符

        _:代表一个字符

例子:查询emp表中name带有e的雇员名字

select name from emp where name like "%e%";

例子:查询emp表中name的第二个位e的雇员名字

select name from emp where name like "_e%";

        is null和is not null:

is null的作用就是判断字段是否为空(null)

is not null的作用就是判断字段是否不为空(null)

例子:查询emp表中manager_id不为空的员工名字name

select name from emp where manager_id is not null;

        order by排序:

对查询的数据进行排序,有两种排序方式:

        默认升序(asc)

        降序(desc)

注意:order by必须写在from和where的后面

语法:select 列名 from 表名 where 条件 order by 列名;

        DQL执行顺序:

                from 

                where 

                select

                order by

有些人会疑问为什么是这个执行顺序,首先from从哪个表查询,where筛选条件,筛选过后查询数据,最后对查询出来的数据进行排序,是不是感觉合理很多?

        多表查询:

多表查询一定要给连接条件,否则就会出现笛卡尔乘积现象

        内连接(inner join):

语法:inner join 连接的表 on 连接条件

内连接可以通过图来理解, 通过两表的交集进行查询:

        等值连接:      

通过示例来看看,此时我们有两张表一张dept部门表,一张emp雇员表 

此时我们需要查询雇员表中雇员的名字部门表中部门的名字,通过两张图我们可以发现,雇员表有雇员的名字,部门名在部门表中,所以我们需要通过表的内连接进行查询,那么如何进行表的内连接呢,我们可以看雇员表中有deptno,而部门表中也有deptno,所以我们可以通过内连接的等值连接进行表连接,代码这么写:

select emp.ename,dept.dname
from emp
inner join dept
on emp.deptNO = dept.deptno

而这就是等值连接,因为我们on的条件是通过相等来进行表连接的,如果不是通过相等进行表连接那么就是非等值连接

结果:

 

                非等值连接:

刚刚我们了解了等值连接,现在我们通过示例讲讲非等值连接,on的条件通过判断是否相等就是等值连接,而如果on的条件不是是否相等就是非等值连接,我们看代码:

还是这个emp雇员表 

 还有一个工资等级表

 

 示例:查询每个雇员的员工名和工资等级

此时我们就可以通过内连接的方式将emp表和salgrade表连接起来,连接的条件是emp表中工资salary在salgrade工资等级表中的LOSAL最低工资和HISAL最高工资之间

而看到这里有人会发现:呀这个join旁边怎么没有inner啊,那这还是内连接吗,是的mysql的join...on...语法默认就是内连接,inner可以省略

结果:

 

内连接总结:内连接分为等值连接和非等值连接,当on的判断为是否相等时就是等值连接否则就是非等值连接,内连接的inner可以省略。还有一个最重要的一点,表连接的条件至少为n-1个,就是说我们有3张表,那么我们至少要有2个条件

         外连接(outer join):

                孤儿数据:

     外连接:说到外连接我们就要讲到“孤儿数据”,那么什么是“孤儿数据”呢?孤儿数据就是当我们多张表查询时,内连接查询的是他们的交集,那么孤儿数据就是没有被查询到的数据,下图中黄色部分就是孤儿数据,没有被查询到的数据

内连接查询的是表之间的交集,那么交集之外的数据就是孤儿数据

                左外连接(left outer join):

左外连接的图是这样的:

示例:查询雇员的名字和雇员所在的部门名称(使用左外连接)

这是雇员表 ,我们会发现deptno这一列有两个null,如果使用内连接,那么因为部门表没有这个部门,所以这两个如果使用内连接就不会查询出来,就是所谓的"孤儿数据"

这是部门表

所以我们使用左外连接来查询,通过外连接的等值连接查询部门的名字

 结果:

通过结果我们可以发现,左边表的雇员名称是一定会全部输出的,而右边的只是顺便查询

 

                右外连接(right outer join):

右外连接的表是这样的:

右外连接和左外连接的作用几乎都差不多,只是左外连接是左边一定输出,右边顺便输出,而右外连接就是右边一定输出,左边顺便输出

示例:查询雇员的名字和雇员所在的部门名称(使用右外连接)

还是刚刚的代码,只是将left outer join改为right outer join,那么此时这两张表的连接查询就是右外连接实现的,那么右边的表一定输出,而左边是顺便输出

 结果:

此时我们会发现雇员表的张三和李四没有查询出来,而部门表中多了一个OPERATIONS,这是因为雇员表的部门id没有对应部门表的OPERATION部门的部门ID

 

 外连接总结:外连接分为左外连接右外连接,还有一个全连接,全连接因为不怎么用这里就不讲了,而左外连接就是左边必须全部查询出来,右边顺便查询右外连接和左外连接刚好相反,右边一定查询,左边顺便查询


        自连接:

    自连接就是将一张表看成两张表,我们通过示例来理解:

此时要查询出每个雇员的经理名字,而雇员的经理ID对应的就是雇员的某个雇员的ID,所以我们可以通过表的自连接进行查询

 结果:

表连接总结:常用表连接分为内连接外连接,而内连接又分为等值连接与非等值连接,并且语法为(inner join 连接的表 on 条件),inner可以省略on的条件如果是判断相等那就是等值连接如果不是判断是否相等就是非等值连接外连接分为左外连接和右外连接左外连接的意思就是左边一定查询,右边顺便查询。而右外连接就和左外连接相反,右外连接的意思就是右边一定查询,左边顺便查询

        group by数据分组: 

如果没有使用group by那么,数据库会将这张表自动认定为一组数据

语法:select 列 from 表名 where 条件 group by 列;

例子:查询雇员表中各个部门的最低薪水(min函数)

select min(salary) from emp group by dept_id;

结果:

 

        having约束分组后的结果:

where对行筛选,having对分组后的结果再次进行筛选

例子:显示经理号和经理付给雇员的最低薪水。排除那些经理未知的人。排除最低薪水小于等于 $1,500 的组。按薪水降序排序输出。

select mgr,min(sal) 
from emp e 
where e.mgr is not null 
group by e.mgr 
having min(sal) > 1500 
order by min(sal) desc;

          子查询:

子查询是一条select语句,它是嵌在另一个select语句中的子句,使用子查询可以用加您单的语句构建功能强大的语句

可以将子查询放在许多SQL子句中,包括:

where子句,having子句,from子句

子查询又分为单行子查询和多行子查询

        单行子查询:

查询出的结果为一条记录,单行子查询可以使用基础的条件判断运算符

例子:查询emp表中工资高于CLARK员工工资的员工

通过这张表我们可以看到CLARK员工的工资为2450,那么通过子查询我们可以先查询CLARK员工的工资,然后放到where子句中,查询工资大于CLARK员工工资的员工

 结果:

        多行子查询:

查询出的结果为多条记录,而多行子查询不可以使用基础的条件判读运算符,因为如果我们查询出多条语句,mysql也不知道到底与谁做条件判断啊,所以他只能使用特殊的:

        any():看名字已经也能猜出来,表示任意一个的意思,比较一个值与子查询返回的任意一个值

<any意思是小于最大值

>any意思是大于最小值

=any等同于In()

        all():all的意思是所有,相当于and

<all意思就是小于最小值

>all意思就是大于最大值

        in():in就不说了,就是or的意思

数据控制语言(DCL):

mysql是一个多用户的数据库管理系统,按权限用户可分为:root用户,超级管理员和由root用户创建的普通用户,数据控制语言,用来创建数据库用户、控制数据库的访问权限。

        创建用户:

语法:create user "用户名" identified by "密码";

例子:创建用户u1,密码为123456

create user "u1" identified by "123456";

        权限管理:

新用户创建完后是无法登录的,需要分配权限,允许用户对哪个数据库哪个表的数据进行操作,并且设置该用户可以给谁登录

语法:GRANT 权限 on 数据库.表 to "用户名"@"登录主机" identified by "密码" 

        登录主机分为:

        %:允许任何主机登录该用户

        localhost:允许mysql下的主机登录该用户

        IP地址:允许该IP地址的主机登录该用户

例子:给u1用户分配查询(select)Test数据库的emp表的权限,允许任何主机登录该用户,密码为123456

grant select on Test.emp to "u1"@"%" identified by "123456"; 

        删除用户:

语法:drop user "用户名"@"登录主机";        

还有一个事务控制语言(TCL)这个我就不写了       

        

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值