数据库查询
数据库查询
增删改查
增
insert into 表名 (column1, column2) values (value1,value2)
删
delete from 表名 where 条件
改
update 表名 set column1=value1, column2=value2 where 条件
查
select * from 表名
查询语句
通配符:
% 匹配0个或任意多个字符
_ 下划线, 匹配一个字符
= 精准匹配
like 模糊匹配
regexp 使用正则表达式来匹配
排序:
order by 排序,默认升序
order by 字段 asc 升序排序
order by 字段 desc 降序排序
其他:
group by 聚合
having 对结果筛选
distinct 去除重复的行
limit 限制
聚合函数:
count 计数
sum 求和
max 求最大值
min 求最小值
avg 求平均值
where语句没法与聚合函数同时使用。 可以使用having 对结果进行筛选
比较运算符:
> , < , = , !=
或者 <>, >= , <=
in (values1, values2....)
between v1 and v2 在v1 到 v2 直接(包含v1,v2)
1. between A and B 用法
查询是否在 A - B 之间, 包含A B
# 1. 取值3000-5000 之间的值 select * from emp where sal>=3000 and sal <=5000; # 2. 取值3000-5000 之间的值 select * from emp where sal between 3000 and 5000; # 3. 不在3000与5000之间的值 select * from emp where sal not between 3000 and 5000
2. 基本查询语句
select 基本查询
# 查询 emp 表中 所有数据 select * from emp; select empno, ename from emp; # 查询指定列 select empno 工号, ename 姓名, job 工作, sal 工资 from emp; 给列别名增加可读性
3. 正则使用
查询中的正则 regexp 使用正则表达式来匹配
# 使用正则关键字 # 查询name 以a 开头的人的所有信息 select * from emp where name regexp '^a';
4. 逻辑运算
# 逻辑运算 and (&&) | or (||) | not # 两个条件同时满足 | 满足其中一个条件 | 一个都不满足(取反) select * from t1 where math >=60 and english >=60 ; # 同时满足两个条件 select * from t1 where math >=60 or english >=60 # 满足其中一个就行 select * from t1 where math >=60 and not english >= 60; # and 两个同时满足,后面not 取反 english <60
5. 排序
# 关键字 order by asc (默认升序) | desc (降序) select * from emp order by deptno; # 关键字后面跟需要排序的 字段 select * from emp order by deptno asc ; # 按照deptno 列升序排序 (默认) select * from emp order by deptno desc; # 按照deptno 列降序排序
6. 去重
关键字 destinct
# 关键字 destinct select distinct deptno from emp; select distinct(deptno) from emp ; # 这样好像也可以
7. group by 分组 和 having
group by 根据给定数列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。
注: 一般情况下group 需要与统计函数(聚合函数)一起使用才有意义
- max 最大值
- min 最小值
- sum 求总数和
- avg 求平均值
- count 求总行数
查找每个部门的最高工资: select deptno,max(sal) from emp group by deptno; # 查找每个部门最高工资和最高工资人数 select deptno,max(sal),count(*) from emp group by deptno; # 查找部门在 10,20 中对 部门分组, 查最高工资,和最高工资人数 select deptno, max(sal),count(*) from emp where deptno in (10,20) group by deptno; # 分组后面没法跟where语句, having对结果进行筛选 select deptno,max(sal),count(*) from emp group by deptno having count(*)>5; # 查找工资加提成大于2000的人 信息 select empno,ename,sal+ifnull(comm,0) sum from emp having sum >2000;
总结:
having 与where区别:
1、having与where类似,根据条件对数据进行过滤筛选
2、where针对表中的列发挥作用,查询数据
3、having对查询结果中的列发挥作用,筛选数据
多表查询
表的连接 : 纵向连接、内连接、左连接、右连接
- left join 左连接
- right join 右连接
- inner join 内连接
- union 纵向连接, 合并
常规表查询: 查询表中所有字段 select * from emp, dept where emp.deptno=dept.deptno; 查询某个字段 select dept.deptno,dept.dname, emp.ename,emp.job from emp,dept where emp.deptno=dept.deptno;
表的连接:纵向连接/内连接/左连接/有链接
左连接 left join
# 左连接 【以左表为标准连接右表】 select emp.ename, emp.job,dept.deptno from dept left join emp on emp.deptno=dept.deptno;
右连接 right join
# 右连接 【以右表为标准连接左表】 select emp.ename,emp.job,dept.deptno from dept right join emp on emp.deptno-dept.deptno;
内连接: inner join
# 内连接:取多表之间的交集 select emp.ename, emp.job, dept.deptno from emp inner join dept on emp.deptno=dept.deptno;
纵向连接,合并 union
# 表结构相同。 不相同,可以伪造相同 select name,math, english , "" as "chinese" from t2 union select name,math,english ,chinese from t3;
例题:
查询英语前三名
select * from t3 order by english desc limit 3;
查询总分,以降序排列
select * , math + english + chinese as total from t3 order by total desc ;
查询总分第一名
select * ,math +english+chinese as total from t3 order by total desc limit 1;
查询英语最高分的姓名及分数
select name,english from t3 order by english desc limit 1;
查询总成绩的平均分第一名:
select * , (math+english + chinese )/3 as avg from t3 order by avg desc limit 1;