[简单查询](续集上文 mysql基本数据类型和基础命令指示符)
简单查询
1.查询特定的列
-- 示例:查询出所有员工的编号和姓名
select eid,ename(需要查询列的名称) from emp(需要查询的数据表);
2.查询所有的列
-- 方法一
select *(*通配符,代表所有) from emp(需要查询的数据表);
-- 方法二
select eid,ename,sex,birthday,deptid(所有列的名称,中间用逗号隔开) from emp(需要查询的数据表)
3.给列起别名
select 需要被添加别名的原名字 as 添加的别名,需要被添加别名的原名字 as 添加的别名 from 需要查询并添加的数据表;
-- 示例:查询出所有员工的编号和姓名,使用别名
select eid(编号) as(添加别名的关键词) bianhao(添加的别名),ename(姓名) as(添加别名的关键词) xm(添加的别名) from emp(需要查询并添加的数据表);
-- 简化方法
select 需要被添加别名的原名字 添加的别名,需要被添加别名的原名字 添加的别名 from 需要查询并添加的数据表;
-- 示例
select eid(编号) bianhao(添加的别名),ename(姓名) xm(添加的别名) from emp(需要查询并添加的数据表);
-- as关键字可以省略,起别名主要是用于前端获取时修改
4.显示不同的数据
select distinct(关键字) 查询列的名称 from 需要查询的数据表;
-- 查询出员工都分布在哪些部门(相同的部门编号显示一次)
select distinct(关键字) deptid(查询列的名称) from emp(需要查询的数据表);
5.查询的执行计算
select 需要进行计算的列名称*12 from 需要查询的数据表;
-- 示例:查询出所有员工的姓名及其年薪
select ename(姓名),gongzi(月薪)*12 from emp;
6.查询结构排序
-- 升序
select * from 排序的数据表 order by 需要排序的列名称 asc(关键字);
-- 降序
select * from 排序的数据表 order by 需要排序的列名称 desc(关键字);
-- 多个列排序(先按照第一个排列规则排列,排完后有值一样的才会执行的第二个排列规则)
select * from 排序的数据表 order by 需要排序的列名称 desc(关键字),需要排序的列名称 asc(关键字);
-- 示例:查询出所有的部门,结果按照部门编号升序排列
select * from dept(排序的数据表) order by did(需要排序的列名称) asc(关键字);
-- 示例:查询出所有的部门,结果按照部门编号降序排列
select * from dept(排序的数据表) order by did(需要排序的列名称) desc(关键字);
-- 如果按照字符串排序,按照首个字符的Unicode编码排序,不加排序规则,默认是按照升序排列
7.条件查询
-- 普通写法
select * from 查找的数据表 where(关键字) 条件(可以是=,<,>,!=);
-- 特殊写法
select * from 查找的数据表 where(关键字) 条件((is是等于,is not是不等于)用于判断特殊的数值,如:null);
-- 多条件判断查询
-- 逻辑与,and
select * from 查找的数据表 where(关键字) 条件(可以是=,<,>,!=) &&(可以写逻辑与,and进行书写) 条件(可以是=,<,>,!=);
-- 逻辑或,or
select * from 查找的数据表 where(关键字) 条件(可以是=,<,>,!=) ||(可以写逻辑与,or进行书写) 条件(可以是=,<,>,!=);
-- 简化写法
-- 等于简化写法
select * from 查找的数据表 where(关键字) 需要进行判断的列名称) in(等于关键字,等于其中一个) (需要等于的值)
-- 不等于简化写法
select * from 查找的数据表 where(关键字) 需要进行判断的列名称) not in(不等于关键字,不等于任何一个) (需要等于的值)
-- 示例:查询出编号为8的员工
select * from emp(查找的数据表) where(关键字) id=8(条件(可以是=,<,>,!=));
-- 示例:查询出部门编号为null的员工
select * from emp(查找的数据表) where(关键字) dept_id is(等于) null(条件(可以是=,<,>,!=));
-- 示例:查询出工资在8000~10000之间的员工
select * from emp(查找的数据表) where(关键字) gongzi>=8000(条件(可以是=,<,>,!=)) &&(可以写逻辑与,and进行书写) gongzi<=10000(条件(可以是=,<,>,!=));
-- 示例:查询出工资在8000一下或者10000以上的员工
select * from emp(查找的数据表) where(关键字) gongzi<8000(条件(可以是=,<,>,!=)) ||(可以写逻辑与,or进行书写) gongzi>10000(条件(可以是=,<,>,!=));
8.模糊条件查询
-- 普通写法
select * from 查找的数据表 where 需要查询的列名称 like(关键词) '%e%'(模糊查询的条件(%是匹配任意字符));
-- 特殊写法
select * from 查找的数据表 where 需要查询的列名称 like(关键词) '%e_'(模糊查询的条件(%是匹配任意字符可以匹配多个)(_匹配任意字符但只能匹配一个));
-- 示例:查询出姓名中含有字母e的员工
select * from emp where uname(需要查询的列名称) like(关键词) '%e%'(模糊查询的条件(%是匹配任意字符));
-- 示例:查询出姓名中倒数第二个字母是e的员工
select * from emp where uname(需要查询的列名称) like(关键词) '%e_'(模糊查询的条件(%是匹配任意字符可以匹配多个)(_匹配任意字符但只能匹配一个));
-- 以上两个匹配符号(%,_)必须要结合like关键字使用
9.分页查询
原因:查询的结果中有太多的数据,一次显示不完,可以做成分页来显示
1.需要两个已知的条件:当前的页码、每页的数据量
每页开始查询的值 = (当前的页码 - 1) * 每页的数据量
2分页查询语法
select * from emp limit(关键字) 每页开始查询的值(后期可以使用js进行计算),每页的数据量;
-- 示例:查询出第一页的数据,每页显示5个数据量
select * from emp limit(关键字) 0(每页开始查询的值) , 5(每页的数据量);
-- 1.limit后开始查询的值不能写运算,必须写最终的结果
-- 2.开始查询的值和每页的数据量,必须是数值型,不能加引号
复杂查询
1.聚合查询/分组查询
聚合函数:
count() 数量
sum() 求和
avg() 平均值
max() 最大值
min() 最小值
-- 数量函数
select count(*(*是所有列,也可以改成其他列名称))(关键字) from 要查的数据表;
-- 求和函数
select sum((需要统计总和的列名称)关键字) from 查找的数据表 where 条件;
-- 平均值函数
select avg((需要统计平均值的列名称)关键字) from 查找的数据表 where 条件;
-- 最小值函数
select min((需要统计最小值的列名称)关键字) from 查找的数据表 where 条件;
-- 最大函数
select max((需要统计最大值的列名称)关键字) from 查找的数据表 where 条件;
-- 示例: 查询出所有员工的数量
select count(*) from emp;
-- 示例: 查询出所有10号部门员工的工资总合
select sum(gongzi) from emp where dept_id = 10;
-- 示例: 查询出女员工的平均工资
select avg(gongzi) from emp where nan = 0;
-- 示例: 查询出年龄最大的男员工的生日
select min(shengti) from emp where nan=1;
-- 示例: 查询出20部门的最高工资
select max(gongzi) from emp where dept_id=20;
分组查询
select count((需要统计总和的列名称)关键字),sum((需要统计平均值的列名称)关键字) from 查找的数据表 group by(关键词) 分组的列名称;
-- 示例:查询出男女员工的数量,工资总和分别是多少
select count(id),sum(gongzi) from emp group by sex;
-- 分组查询查询通常只是查询聚合函数和分组条件
子查询
多个sql命令的其那套
select * from 查找的数据表 where 条件>(select avg(平均值) from 查找的数据表);
-- 示例:查询出高于工资平均值的员工有哪些
-- 1.先查出平均工资是多少
select avg(gongzi) from emp;
-- 2.查询出高于工资平均值(第一步算出来的)的员工
select * from emp where gongzi>118580823529;
-- 综合完成
select * from emp where gongzi>(select avg(gongzi) from emp);
多表查询
查询的列分布在多个表中,前提是多个表之间已经建立了关联(外键对应另一个表主键)
-- 普通写法
select 数据表名1.查询的列名称1,数据表名2.查询的列名称2 from 表名1,表名2 where
数据表名1.比较的值1=数据表名2.比较的值2;
-- 特殊写法(用于查看所有的员工包括部门为null的)
select 数据表名1.查询的列名称1,数据表名2.查询的列名称2 from 表名1 left join(关键字)
表名2 on(关键字) 数据表名1.比较的值1=数据表名2.比较的值2;
-- 示例:查询出员工的姓名和部门名称
select emp.uname,dept.uname from emp,dept where emp.dept_id=dept.id;
-- 左外连接:确保所有的员工都显示,不管有没有对应的部门
select emp.uname,dept.uname from emp left join dept on emp.dept_id=dept.id;
获取日期中的年份
select year('需要进行提取年份的列名称或年月日') from 需要进行查询的数据表;
--示例: 查询出日期的年份部分 2023-3-30
select year('2023-3-30') from emp;
加密函数
md5(需要加密的列名称或值)(关键字)
-- 为132456加密
select md5('132456')
(非商用,转载表明出处)