数据库查询

数据库查询

增删改查

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;
posted @ 2021-09-10 15:06  内向是一种性格  阅读(142)  评论(0编辑  收藏  举报