mysql指令集

DDL:

show databases; 

select database();

create database if not exists demo2 ;

drop database if exists demo2;

Use 数据库名;

Show tables;

Desc 表名;

Show create table 表名;

create table demo2 ( id int );

alter table demo2 add age int;

alter table demo2 change age name varchar(10) comment '姓名' ;

alter table demo2 drop id ;

alter table demo2 rename to demo3;

drop table if exists demo3;

truncate table demo2;

DML:

insert into demo2(id) values (2);

insert into demo2(id) values (3),(4);

insert into demo2 values (5),(6);

update demo2 set id =1 where id =2;

delete from demo2 where id = 6;

DQL:

select id from demo2;

select * from demo2;

select id as '标签' from demo2;

select distinct id as '标签' from demo2;

  1. 查询年龄等于 88 的员工

select * from emp where age=88;

  1. 查询年龄小于 20 的员工信息

select * from emp where age<20;

C. 查询年龄小于等于 20 的员工信息

 select * from emp where age<=20;

D. 查询没有身份证号的员工信息

select * from emp where idcard is null;

E. 查询有身份证号的员工信息

select * from emp where idcard is not null;

F. 查询年龄不等于 88 的员工信息

select * from emp where age <> 88;

G. 查询年龄在15岁(包含) 到 20岁(包含)之间的员工信息

select * from emp where age between 15 and 20;

  1. 查询性别为 女 且年龄小于 25岁的员工信息

select * from emp where age < 25 and gender = '女';

select * from emp where age < 25 and gender = 女;(错误)

I. 查询年龄等于18 或 20 或 40 的员工信息

select * from emp where age in (18,20,40);

J. 查询姓名为两个字的员工信息 _ %

select * from emp where name like '__';

select * from emp where name like __;  //ERROR 1054 (42S22): Unknown column '__' in 'where clause'

K. 查询身份证号最后一位是X的员工信息

 select * from emp where idcard like '%x';

聚合函数

SELECT 聚合函数(字段列表) FROM 表名 ;

注意 : NULL值是不参与所有聚合函数运算的。

A. 统计该企业员工数量

select count(*) from emp;

B. 统计该企业员工的平均年龄

select avg(age) from emp;

C. 统计该企业员工的最大年龄

select max(age) from emp;

D. 统计该企业员工的最小年龄

select min(age) from emp;

E. 统计西安地区员工的年龄之和

select sum(age) from emp where workaddress = '西安';

分组查询

SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组

后过滤条件 ];

执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组

之后对结果进行过滤。

判断条件不同:where不能对聚合函数进行判断,而having可以

注意事项:

 • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

 • 执行顺序: where > 聚合函数 > having 。

 • 支持多字段分组, 具体语法为 : group by columnA,columnB

A. 根据性别分组 , 统计男性员工 和 女性员工的数量

select gender,count(*) from emp group by gender;

B. 根据性别分组 , 统计男性员工 和 女性员工的平均年龄

 select gender,avg(age) from emp group by gender;

C. 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址

select workaddress from emp where age<45 group by workaddress having count(*)>=3;

D. 统计各个工作地址上班的男性及女性员工的数量

 select gender,workaddress,count(*) from emp group by workaddress,gender;

排序查询

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2

A. 根据年龄对公司的员工进行升序排序

select * from emp order by age;

B. 根据入职时间, 对员工进行降序排序

select * from emp order by entrydate desc;

C. 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序

select * from emp order by age,entrydate desc;

分页查询

SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;

注意事项:

 • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。

 • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。

 • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。

A. 查询第1页员工数据, 每页展示10条记录

select * from emp limit 10;

B. 查询第2页员工数据, 每页展示10条记录 --------> (页码-1)*页展示记录数

select * from emp limit 10,10;

DCL:

select * from mysql.user;

create user 'sinksank'@'localhost' identified by '123456';

 alter user 'sinksank'@'%' identified with mysql_native_password by '1234';

drop user 'itcast'@'localhost';

show grants for 'sinksank'@'%';

grant all on demo to 'sinksank'@'%';

revoke all on demo from 'sinksank'@'%';

---------------分割

函数:

select concat('Hello' , ' MySQL');

select lower('Hello');

select lower('Hello');

select lpad('01', 5, '-');

select lpad('01', 5, '-');

select lpad('01', 5, '-');

select substring('Hello MySQL',1,5);

select ceil(1.1);

select floor(1.9);

select mod(7,4);

select rand();

select round(2.344,2);

select curtime();

select curdate();

select now();

select YEAR(now());

select MONTH(now());

select DAY(now());

select date_add(now(), INTERVAL 70 YEAR );

select datediff('2021-10-01', '2021-12-01');

select if(false, 'Ok', 'Error');

select ifnull('Ok','Default');

select ifnull('','Default');

select ifnull(null,'Default');

mysql> select name, (

    ->  case workaddress when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end ) as '地址'

-> from emp;

约束

mysql> create table tb_user(

    -> id int auto_increment primary key,

    -> name varchar(10) not null unique,

    -> age int check (age>0 && age<=120),

    -> status char(1) default '1',

    -> gender char(1)

    -> );

多表查询:

A. 查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)

 表结构: emp , dept

 连接条件: emp.dept_id = dept.id

select e.name,d.name from emp e , dept d where e.dept_id = d.id;

//一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段。

查询emp表的所有数据, 和对应的部门信息

  select e.*,d.name 部名 from emp e left join dept d on e.dept_id = d.id;

 查询dept表的所有数据, 和对应的员工信息(右外连接)

select e.name,d.* from emp e right join dept d on e.dept_id = d.id;

查询员工 及其 所属领导的名字

select a.name,b.name from emp a, emp b where a.managerid = b.id;

查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来

select a.name '员工', b.name '领导' from emp a left join emp b on a.managerid =

b.id;

注意事项:

 在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底是哪一张表的字段。

对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。

union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。

将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.

select * from emp where salary < 5000

union all

select * from emp where age > 50;

子查询

根据子查询结果不同,分为:

A. 标量子查询(子查询结果为单个值)

B. 列子查询(子查询结果为一列)

C. 行子查询(子查询结果为一行)

D. 表子查询(子查询结果为多行多列)

根据子查询位置,分为:

A. WHERE之后

B. FROM之后

C. SELECT之后

查询 "销售部" 的所有员工信息

select * from emp where dept_id = (select id from dept where name = '销售部');

查询在 "方东白" 入职之后的员工信息

select * from emp where entrydate > (select entrydate from emp where name = '方东白');

查询 "销售部" 和 "市场部" 的所有员工信息

mysql> select * from emp where dept_id in (select id from dept where name = '销售部' or

    -> name = '市场部');

查询比 财务部 所有人工资都高的员工信息

select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name = '财务部'));

查询比研发部其中任意一人工资高的员工信息

select * from emp where salary > some(select salary from emp where dept_id = (select id from dept where name = ' 研发部'));

查询与 "张无忌" 的薪资及直属领导相同的员工信息 ;

select * from emp where (salary,managerid) in (select salary,managerid from emp where name = '张无忌');

 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息

select * from emp where (job,salary) in ( select job, salary from emp where name =

'鹿杖客' or name = '宋远桥' );

 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息

select e.*, d.* from (select * from emp where entrydate > '2006-01-01') e left

join dept d on e.dept_id = d.id ;

事务:

手动提交

SELECT @@autocommit ;

START TRANSACTION 或 BEGIN ;

或SET @@autocommit = 0 ;

COMMIT

ROLLBACK

-- 开启事务

Begin;

-- 1. 查询张三余额

select * from account where name = '张三';

-- 2. 张三的余额减少1000

update account set money = money - 1000 where name = '张三';

-- 3. 李四的余额增加1000

update account set money = money + 1000 where name = '李四';

-- 如果正常执行完毕, 则提交事务

commit;

-- 如果执行过程中报错, 则回滚事务

-- rollback;

事务隔离级别

SELECT @@TRANSACTION_ISOLATION;

SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |

READ COMMITTED | REPEATABLE READ | SERIALIZABLE }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值