常见MySQL语句学习+练习

说明:本文章个人总结,用来练习学习和练习mysql语句

MySQL语句练习一

--   ========
--     查询语句的书写顺序和执行顺序
-- select ===> from ===> where ===> group by ===> having ===> order by ===> limit
--    查询语句的执行顺序
-- from ===> where ===> group by ===> having ===> select ===> order by ===> limit
create database db;

show databases db;


use test_db;  -- 选择数据库

show tables;  -- 查看当前数据库下的表

desc students;  -- 查看表结构

show create table students;  -- 查看数据库的建表结构

-- 对表的操作
create table students
(
    id      int auto_increment
        primary key,
    name    varchar(50) null,
    age     int         null,
    major   varchar(50) null,
    project varchar(10) null
);      -- 创建表

drop table if exists students; -- 删除表


-- (列)对表内容的列操作
alter table students add project varchar(5);   -- 添加

alter table students change project project varchar(10);   -- 修改

alter table students drop column project;   -- 删除字段

rename table students to  students_new;  -- 重命名表

-- (行)对表内容的行操作
    -- 添加数据insert
insert into tb_emp1 (id,username,gender,job,create_time) values(1,'小明',1,2,now());

insert into tb_emp1 values(2,'小明',1,2,now());

insert into tb_emp1 values(3,'小明',1,2,now()),(4,'小明',1,2,now());  -- 插入多行

     -- 更新数据
update tb_emp set name='张三' where id=1;
update tb_emp set entrydate='2010-01-01';

     -- 删除数据
delete from tb_emp where id=1;
delete from tb_emp ;



-- ============== 查询 ================

select * from tb_emp where name like '%张%' and gender = 1 order by update_time desc limit 10,10;

-- 基本查询
select name,entrydate from tb_emp;  -- 查询指定字段

select id,username,password,name,gender,image,job,entrydate,create_time,update_time from tb_emp;  -- (企业推荐)查询所有字段

select * from tb_emp;

select name as '姓  名' ,entrydate as '入职日期' from tb_emp; -- 查询时候设置别名

select name  '姓  名' ,entrydate  '入职日期' from tb_emp; -- 查询时候设置别名(as省略)

select distinct job from tb_emp; -- 去除重复记录的查询

-- 条件查询
            -- 1. 查询 姓名 为 杨逍 的员工
select * from tb_emp where name='杨逍';

            -- 2. 查询 id小于等于5 的员工信息
select *from tb_emp where id<=5;

            -- 3. 查询 没有分配职位 的员工信息
select * from tb_emp where job is null;

            -- 4. 查询 有职位 的员工信息
select * from tb_emp where job is not null;

            -- 5. 查询 密码不等于 '123456' 的员工信息
select * from tb_emp where password !='123456';
select * from tb_emp where password <>'123456';

            -- 6. 查询 入职日期 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间的员工信息
select * from tb_emp where entrydate >='2000-01-01' and entrydate<='2010-01-01';
select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01';

            -- 7. 查询 入职时间 在 '2000-01-01' (包含) 到 '2010-01-01'(包含) 之间 且 性别为女 的员工信息
select * from tb_emp where entrydate between '2000-01-01' and '2010-01-01' and gender=2;

            -- 8. 查询 职位是 2 (讲师), 3 (学工主管), 4 (教研主管) 的员工信息
select * from tb_emp where job=2 or job=3 or job=4;
select * from tb_emp where job in(2,3,4);

            -- 9. 查询 姓名 为两个字的员工信息
select * from tb_emp where name like '__';

            -- 10. 查询 姓 '张' 的员工信息
select * from tb_emp where name like '张%';

-- 聚合(函数)查询
            -- 1. 统计该企业员工数量
select count(id) from tb_emp;   -- 统计的是非 NULL 的值
select count(*) from tb_emp;    -- 推荐 统计的是全部值(包括NULL)
select count('A') from tb_emp;

            -- 2. 统计该企业员工 ID 的平均值
select avg(id) from tb_emp;

            -- 3. 统计该企业最早入职的员工
select min(entrydate) from tb_emp;

            -- 4. 统计该企业最迟入职的员工
select max(entrydate) from tb_emp;

            -- 5. 统计该企业员工的 ID 之和
select sum(id) from tb_emp;


-- 分组查询
            -- 1. 根据性别分组 , 统计男性和女性员工的数量
select gender,count(*) from tb_emp group by gender;
select * from tb_emp group by gender;
            -- 3. 先查询入职时间在 '2015-01-01' (包含) 以前的员工 , 并对结果根据职位分组 , 获取员工数量大于等于2的职位
select job,count(*) from tb_emp where entrydate<='2015-01-01' group by job having count(*) >=2;




-- 排序查询
            -- 1. 根据入职时间, 对员工进行升序排序
select * from tb_emp order by entrydate asc;

select * from tb_emp order by entrydate ;
            -- 2. 根据入职时间, 对员工进行降序排序
select * from tb_emp order by entrydate desc;

            -- 3. 根据 入职时间 对公司的员工进行 升序排序 , 入职时间相同 , 再按照 更新时间 进行降序排序
select * from tb_emp order by entrydate,update_time desc;

-- 分页查询
    -- 起始索引=(页码-1)*每页展示
            -- 1. 从起始索引0开始查询员工数据, 每页展示5条记录
select * from tb_emp limit 0,5;
select * from tb_emp limit 5;

            -- 2. 查询 第1页 员工数据, 每页展示5条记录
select * from tb_emp limit 0,5;
            -- 3. 查询 第2页 员工数据, 每页展示5条记录
select * from tb_emp limit 5,5;

            -- 4. 查询 第3页 员工数据, 每页展示5条记录
select * from tb_emp limit 10,5;

-- if(条件表达式,true取值,false取值)
select if(gender=1,'男性员工','女性员工')性别,count(*) from tb_emp group by gender;

-- case 表达式 when 值1 then 结果1 when值2 结果2 else 否则结果 end
select (case job when 1 then '班主任' when 2 then '讲师' when 3 then '学生主管' when 4 then '教研主管' else '未分配' end) 职位,
count(*)
from tb_emp
group by job;

-- year():返回年份  curdate():返回当前时间  concat():连接字符

-- 查全体学生的姓名及其年龄
--       select sname,(year(curdate())-year(sbirthdate))from student;
-- 查询全体学生的姓名、出生日期和主修专业,输出包含 'Date of Birth:' 列
--       select sname,concat('Date of Birth:',sbirthdate),smajor from student;



-- 多变设计: 多的一方添加外键

MySQL语句练习二

use db_04;

-- A. 查询员工的姓名 , 及所属的部门名称 (隐式内连接实现)
select * from tb_dept d,tb_emp e where d.id=e.dept_id;

-- B. 查询员工的姓名 , 及所属的部门名称 (显式内连接实现)
--  select * from tb_dept d inner join tb_emp e on d.id=e.dept_id;

-- A. 查询员工表 所有 员工的姓名, 和对应的部门名称 (左外连接)
select e.name,d.name from tb_emp e left join tb_dept d on e.dept_id=d.id;

-- B. 查询部门表 所有 部门的名称, 和对应的员工名称 (右外连接)
select d.name,e.name from tb_emp e right join tb_dept d on e.dept_id=d.id;


-- ========================= 子查询 ================================
-- 标量子查询
-- A. 查询 "教研部" 的所有员工信息
select * from tb_emp where dept_id=(select id from tb_dept where name='教研部');

-- B. 查询在 "方东白" 入职之后的员工信息
select * from tb_emp where entrydate>(select entrydate from tb_emp where name='方东白');

-- 列子查询
-- A. 查询 "教研部" 和 "咨询部" 的所有员工信息
select id from tb_dept where name='教研部' or name='咨询部';

select * from tb_emp where dept_id in(select id from tb_dept where name='教研部' or name='咨询部');


-- 行子查询
-- A. 查询与 "韦一笑" 的入职日期 及 职位都相同的员工信息 ;
select entrydate,job from tb_emp where name='韦一笑';
select * from tb_emp where entrydate=(select entrydate from tb_emp where name='韦一笑') and job=(select job from tb_emp where name='韦一笑');
    -- 利用类似python元组来实现行
select * from tb_emp where (entrydate,job)=(select entrydate,job from tb_emp where name='韦一笑');


-- 表子查询
-- A. 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息
select  * from tb_emp where entrydate>'2006-01-01';
select  dept_id from tb_emp where entrydate>'2006-01-01';


select *,d.name from (select  * from tb_emp where entrydate>'2006-01-01') e ,tb_dept  d where e.dept_id=d.id;


-- =====案例====
-- 1. 查询价格低于 10元 的菜品的名称 、价格 及其 菜品的分类名称 .
select d.name ,d.price,c.name from dish d,category c where d.category_id=c.id and d.price<10;

-- 2. 查询所有价格在 10元(含)到50元(含)之间 且 状态为'起售'的菜品名称、价格 及其 菜品的分类名称 (即使菜品没有分类 , 也需要将菜品查询出来).
--   错的: select * from dish d,category c where d.category_id=c.id and  d.price between 10 and 50 and d.status=1;

select d.name,d.price,c.name
from dish d
         left join category c on d.category_id = c.id
where d.price between 10 and 50
  and d.status = 1;
-- 3. 查询每个分类下最贵的菜品, 展示出分类的名称、最贵的菜品的价格 .
select  c.name,max(d.price) from dish d,category c where d.category_id=c.id group by c.name;

-- 4. 查询各个分类下 状态为 '起售' , 并且 该分类下菜品总数量大于等于3 的 分类名称 .
select c.name,count(*) from category c,dish d where d.category_id=c.id and d.status=1 group by c.name having count(*)>=3;

-- 5. 查询出 "商务套餐A" 中包含了哪些菜品 (展示出套餐名称、价格, 包含的菜品名称、价格、份数).
select * from setmeal s
                  left join setmeal_dish sd on s.id = sd.setmeal_id
                  left join dish d on sd.dish_id = d.id
where s.name = '商务套餐A';


-- 6. 查询出低于菜品平均价格的菜品信息 (展示出菜品名称、菜品价格).
select avg(price) from dish;
select * from dish where price<(select avg(price) from dish);



-- ======= 索引 ==========
        -- 提高查询效率
-- 创建 : 为tb_emp表的name字段建立一个索引 .
create index idx_tmp_name on tb_emp(name);

-- 查询 : 查询 tb_emp 表的索引信息 .
show index from tb_emp;

-- 删除: 删除 tb_emp 表中name字段的索引 .
drop  index idx_tmp_name on tb_emp;  

难点语句解答

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值