DQL、DCL 和mysql常用的函数

一、DQL

1、什么是DQL

1.DQL(Data Query Language)即数据库查询语言,用来查询所需要的信息,在查询的过程中,需要判断所查询的数据与表之间的关,我们可以使用select语句来查询数据。

语法:select * from 表的名称 where 查询的条件

DML与DDL区别?

DDL 对数据库 表结构 增加、修改 删除操作

DML 表结构中的数据 增加(insert)、修改(update) 删除(delete)

数据准备:

sql 复制代码
-- 数据准备
create table emp(
    id int comment '编号',
    workno varchar(10) comment'工号',
    name varchar(10) comment '姓名',
    gender char(1) comment '性别',
    age tinyint unsigned comment '年龄',
    idcard char(18) comment '身份证号',
    workadress varchar(50) comment '工作地址',
    entrydate date comment '入职时间'
) comment '员工表';

insert into emp(id, workno, name, gender, age, idcard, workadress, entrydate)
values (1,'1','柳岩','女',28,'123456789012345678','北京','2020-01-07'),
       (2,'2','张无忌','女',18,'123456789012345678','北京','2020-01-07'),
       (3,'3','韦一笑','女',48,'123456789012345678','北京','2020-05-01'),
       (4,'4','赵敏','女',58,'123456789012345678','北京','2020-01-01'),
       (5,'5','小昭','女',68,'123456789012345678','北京','2020-08-01'),
       (6,'6','杨彪','女',28,'123456789012345678','北京','2020-01-06'),
       (7,'7','范瑶','女',38,'123456789012345678','北京','2020-01-01');

2.六大查询:

sql 复制代码
-- 1.基本查询
select name,workadress,id from emp;

select *
from emp;

select workadress as '工作地址' from emp;

select distinct workadress from emp;

-- 2.条件查询
-- 1.查询年龄等于28的员工
select * from emp where age= 28;
-- 2.查询年龄小于(等于)50的员工
select * from emp where age < 50;
-- 3.查询身份张为null的员工信息
select * from emp where idcard is null;
-- 4.查询身份张不为null的员工信息
select * from emp where idcard is not null;
-- 5.不等于 !=  或者 <>
-- 6.&& and
-- 7.between ... and....    在...到...之间
-- 8.查询年龄等于28或30或24
-- in()  满足其中条件之一即可
select * from emp where age = 28 or age = 30 or age = 24;
select * from emp where age in(28,30,24);
-- 9.查询姓名为两个字的员工 _ %    一个下划线代表一个字符,
select * from emp where name like '__';
-- 10查询身份账号最后一位为X的员工  %代表任意字符
select * from emp where name like '%X';
-- 3.聚合查询
--   (1).聚合函数  注意:null值不参与计算
-- 统计员工数量
select count(*) from emp;
select count(id) from emp;
-- 统计平均年龄
select avg(age) from emp;
-- 统计员工的最大年龄
select max(age) from emp;
-- 统计员工的最小年龄
select min(age) from emp;
-- 统计北京地区员工年龄的和
select sum(age) from emp where workadress = '北京';

-- 4.分组查询
-- where 和 having 的区别:
-- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
-- 判断条件不同:where不能对聚合函数进行判断,而having可以
-- 执行顺序:where > 聚合函数 > having
-- 1.根据性别分组,统计男女的数量  count(字段)
-- 注意:分组之后,查询的字段一般为聚合函数和分组字段,查询其他的字段没有意义
select gender,count(*) from emp group by gender;
-- 2.根据性别分组,统计男性员工和女性员工的平均年龄
select gender,avg(age) from emp group by gender;
-- 3.查询年龄小于30的员工,并根据工作地址进行分组,获取员工数量大于等于3的工作地址
select workadress, count(*) adress_count from emp where age<45 group by workadress having adress_count >= 3;

-- 5.排序查询
-- ASC 升序查询(默认)  DESC 降序

--  1.根据年龄对员工进行升序排序
select * from emp order by age asc;
--  2.根据入职时间对员工进行升序排序
select * from emp order by entrydate asc;
--  3.根据年龄对公司的员工进行升序排序,年龄相同,再按照进入时间进行排序
-- 注意: 如果是多字段排序:当第一个字段相同时,才会按第二个字段排序
select * from emp order by age asc,entrydate desc;
-- 6.分页查询 : select 字段列表 from limit 起始索引,查询记录数;
-- 注意:起始索引重0开始,索引 = (查询页码 - 1)*每页的记录数; 如果查询的是第一页数据,那么起始索引可以省略,直接简写成limit10
-- (mysql中用limit,其他的数据库用的不是limit)
--   1.查询第一页的员工数据,每页展示5条记录
select * from emp limit 5;
--   2.查询第一页的员工数据,每页展示5条记录
select * from emp limit 5,5;

-- --------------------------------DQL语句练习--------------------------------------
-- 1.年龄为2,24,23,的男性员工数量
select * from emp where gender = '男' and age in(2,24,23);
-- 2.性别为男,年龄(20,40),三个字以上
select * from emp where gender = '男' and age between 20 and 40 and name like '___';
-- 3.年龄小于60,男性员工和女性员工的数量
select gender ,count(*) from emp where age < 60 group by gender;
-- 4.年龄小于等于35的姓名和年龄,将结果按年龄进行升序排序,年龄相同则按入职时间
select name,age from emp where age <= 35 order by age asc ,entrydate desc;
-- 5.查询性别为女,年龄在20-40以内的前5个员工的信息,对结果按照年龄升序排序,年龄相同则按入职时间
select * from emp where gender = '女' and age between 20 and 40 order by age asc, entrydate asc limit 5;

-- DQL的编写顺序 select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数
-- DQL的执行顺序 from--where--group by--having--select--order by--limit

3、DQL的编写顺序和执行顺序

复制代码
1.DQL的编写顺序 
select 字段列表 
from 表名列表 
where 条件列表 
group by 分组字段列表 
having 分组后条件列表 
order by 排序字段列表 
limit 分页参数
2.DQL的执行顺序 from--where--group by--having--select--order by--limit

二、DCL

1.什么是DCL

即数据控制语言,主要是用来管理数据库用户,控制数据库的访问权限。

2.常见的用法

sql 复制代码
-- DCL :管理用户,主要是DBA(数据库管理员)使用,开发人员用的较少
-- 主机号可以用%进行通配
-- 1.查询用户
-- 2.创建用户
-- 创建用户itcast ,只能在当前主机localhose访问,密码为123456
create user 'itcast'@'localhost' identified by '123456';

-- 创建用户itcast ,只能在任意主机上访问该数据库,密码为123456
create user 'liusaidh'@'%' identified by '123456';

-- 3.修改用户密码
-- 将用户liusaidh的密码修改为1234
alter user 'liusaidh'@'%' identified with mysql_native_password by '1234';
-- 4.删除用户
drop user 'itcast'@'localhost';
drop user 'root'@'%';

-- DCL:权限控制
-- 1)多个权限之间使用逗号分隔开;2)数据库名和表名都可以用*进行通配,代表所有
-- 1.查询权限
show grants for 'liusaidh'@'%';
-- 2.授予权限
grant all on *.* to 'liusaidh'@'%';
-- 3.撤销权限
revoke all on *.* from 'liusaidh'@'%';

三、mysql常用的函数

1. 字符串函数

sql 复制代码
--  1.concat:拼接
select concat('hello',' mysql');
--  2.lower :转换成小写
select lower('HELLO');
--  3.upper :转换成大写
select upper('hello');
--  4.lpad : 在左侧填充
select lpad('01',5,'-');
--  5.rpad :在右侧填充
select rpad('01',5,'-');
--  6.trim :清除首尾的空格
select trim(' aa s ');
--  7.substring
select substring('hello mysql',1,5);

-- 将员工的工号统一为5位,不到5位的前面补零
update emp set workno = lpad(workno,5,'0');

2.常见的数值函数

sql 复制代码
-- 1.ceil  向上取整
select ceil(1.1);
-- 2.floor   向下取整
select floor(1.5);
-- 3.mod(x,y)  返回x/y的余数
select mod(6,2);
-- 4.rand()  返回0-1内的随机数
select rand();
-- 5.round(x,y)  四舍五入,保留y位小数
select round(2.36,1);

--  案例:生成随机的六位数的验证码
select lpad(round(rand()*1000000,0),'6','0');

3.常见的日期函数

sql 复制代码
-- 1.curdate  返回当前的日期
select curdate();
-- 2.curtime  返回当前的时间
select curtime();
-- 3.now  返回当前日期和时间
select now();
-- 4.year(date)  获取指定date的年份
select year(now());
-- 5.month(date)  获取指定date的年份
select month(now());
-- 6.day(date)  获取指定date的日期
select day(now());
-- 7.date_add(date,INTERVAL expr type )  返回一个 日期/时间 加上一个时间间隔expr后的时间值
select date_add(now(),INTERVAL 70 day );
-- 8.datediff(date1,date2)  返回起始时间date1和结束时间date2之间的天数(第一个时间减去第二个时间)
select datediff(now(),'2024-10-12');

--  案例:查询所有的员工的入职天数,并根据天数进行倒序排序
select name,datediff(curdate(),entrydate) as 'entrydates' from emp order by entrydates desc;

4.流程控制函数(expr 代表表达式)

sql 复制代码
--  1.if(value,t,f)  如果value为true则返回t,否则返回false
select if(true,'ok','error');

--  2.ifnull(value1,value2)  如果value1不为空(null),返回value1,否则返回value2
select ifnull('ok','default');
select ifnull('','default');
select ifnull(null,'default');

--  3.case when [val1] then [res1]...else [default] end 如果val1为true,返回res1,。。。否则返回default默认值
-- 需求:查询员工的姓名和工作地址(北京/上海 -------> 一线城市   ,其他---------->二线城市)
select
    name,
    (case workadress  when '北京' then '一线城市' when '上海' then '一线城市' else '二线城市' end) as '工作地址'
from emp;

--  4.case[expr] when [val1] then [res1] ...else[default] end  如果expr的值等于val1,返回res1,。。。否则返回default默认值
-- 案例:
-- 成绩 : >=80  优秀   >= 60 及格  否则不及格
create table score(
    id int comment 'ID',
    name varchar(20) comment '姓名',
    math int comment '数学',
    english int comment '英语',
    chinese int comment '语文'
) comment '学习成绩表';
insert into score(id, name, math, english, chinese) values (1,'Tom',67,88,95),(2,'Rose',23,66,90),(3,'Jack',56,98,76);

select
    id,
    name,
    (case when math >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) '数学',
    (case when chinese >= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) '语文',
    (case when english>= 85 then '优秀' when math >= 60 then '及格' else '不及格' end) '英语'
from score;
相关推荐
奶糖趣多多8 分钟前
Redis知识点
数据库·redis·缓存
CoderIsArt1 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧3 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
Channing Lewis4 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
追风林5 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
毕业设计制作和分享6 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
ketil276 小时前
Redis - String 字符串
数据库·redis·缓存
Hsu_kk6 小时前
MySQL 批量删除海量数据的几种方法
数据库·mysql
编程学无止境7 小时前
第02章 MySQL环境搭建
数据库·mysql