数据库学习指令记录

Posted TOPthemaster

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库学习指令记录相关的知识,希望对你有一定的参考价值。

文章目录

1.DQL 数据查询语言

1.1select简单查询

1.select * from 表名 ;       查看相应表数据
2.desc 表名;       describe查看相应表结构
3.select version();   查看mysql版本号
4.select database(); 查看当前使用数据库
5.select 字段名,字段名 from 表名;  查看表中某一字段或者多个字段
6.select * from 表名;   查看所有字段   
					   该指令尽量不用, 效率低,可读性差

7.select 字段名 as 显示字段名 from 表名; 查看字段名并在
当前另起别名,但不影响原表
8. select 字段名(数字格式)* 12 from 表名;
	字段中可以使用数学计算

数据库操作指令中对字符串的修改以及查看使用单引号,更兼容多个版本,
oracle不支持双引号。

1.2 条件查询

select 
	字段1,字段2
from
	表名
where
	条件

常用条件

1.=  <>或!= ... 
	select id from db_user where password = 5456;
2.and    or    between and  (and 优先级比 or 高)
若发生优先级错乱问题,可以使用()强制执行
示例:
	select id from db_user where password is not null and password >80 or password <10000; 会先执行and 后执行or

	select id from db_user where password is not null and (password >80 or password <10000); 先执行or 后执行and

	select id from db_user where password = 5456 or name = 'user1';

	select id from db_user where password between 1 and 8000; 
遵循左小右大
3. is null    is not null
	select id from db_user where password is null;
	查询某条字段是否为空不能用=null衡量
4.in ( 相当于多个or条件 )not in
	select id from db_user where password in (5456,6000) ;
5.like  模糊查询
	%str%查询带有该特殊字符的字段
	%str 查询以该字符结尾的字段 
	str% 查询以该字符开头的字段 
	_str%查询第二个字符是该字符的字段 添加下划线个数
	select id,name,password from db_user where password like '%string%';

1.2 数据排序查询

1.order by 字段  (asc)默认升序
	select id,name,password from db_user order by password;
2.order by 字段  desc    降序
	select id,name,password from db_user order by password desc;
3.多字段排序(某一字段排序出现重复,则使用第二类别排序)
	select id,name,password from db_user order by password desc,id asc; 先按照password降序排,若有重复按照id升序排

1.3 综合排序

select 
		字段
from
		表名
where
		字段
order by
		排序方式

该查询格式顺序不能变。

1.4 数据处理函数

1.单行处理函数
特点:一个输入 一个输出

1.lowper 内容小写转换输出
	select upper(字段) as 字段 from 表名;
2.upper 内容大写转换输出
	select lowper(字段) as 字段 from 表名;
3.substr 截取字段字符串 substr(字段,起始位(从1开始),截取长度)
	select substr(name,2,length(name)-1) from db_user; 截取除首字母后面的信息
	select substr(name,1,1) from db_user;  截取首字母
4.concat 合并字符串
	select concat(upper(substr(name,1,1)),substr(name,2,length(name)-1) ) as 	result from db_user;合并前面截取的字符串 实现首字母改为大写
5.length 获取字段长度
	select length(password) length from db_user;
6.trim 去除空格
7.round 四舍五入保留位数 round(字段,保留位数 0分界 -1代表10位)
	select round(字段)from 表名
8.ifnull 空处理函数ifnull(数据,填充新数据)  任何与null的数学运算结果都为null
9.case..when..then..when..then..else..end
示例: 在db_user中查找出number值,并将job为manager对应的number乘以1.5作为newnum;
	select 
		number as oldnum ,
 		(case job when 'manager' then  number *1.5 else number * 1 end) as newnum
	from 
		db_user;

2.多行处理函数(分组函数)
特点:多个输入 一个输出;
使用时必须先分组,不然一张表默认为一组;
分组函数处理null值会自动忽略;
分组函数不能直接使用在where字句中;涉及关键字语句顺序问题
分组函数可以组合使用。

1. count 计数
	count(*)统计所有行数,包括null,count(具体字段)自动跳过null;
3. avg 求平均值
4. max 求最大值
5. min 求最小值
6. sum 求和
示例:
select max(num)from db_user;

1.5分组查询(*)

总结关键字顺序(不能颠倒)

select
	...
from
	...
where
	...
group by
	...
order by
	...
	执行顺序  from  where  group by select order by 
示例: 假设有多个工作岗位以及不同员工薪资,现有需求,对每个岗位所有员工总工资求和
select
	job,sum(salary)
from
	db_job
group by
	job,..,..,..;
	

having 必须联合group by,使用,用途为对group by分组后的数据再次操作,尽可能使用where先筛选后再分组。
select
	job,sum(salary)
from
	db_job
group by
	job,..,..,..;
having 
	max(salary);

distinct 去除重复记录

select distinct name,..,.. from db_user;

1.6连接查询、多表查询(***)

分类: 按年代划分分别由SQL92与SQL99;
	  按表连接方式划分分为:
		内连接:
			等值连接
			非等值连接
			自连接
		外连接:
			左外连接(左连续)
			右外连接(右连续)
		全连接

外连接:


1.6.1 笛卡尔积现象

select name,user from db_1,db_2;

当使用连接查询时,若不添加任何限制,则查询结果为两张表条项乘积,非常浪费时间。要尽量避免。应该添加相应条件,减少检索浪费。

1.6.2 内连接-等值连接

92版本写法:
	select 
		name,user 
	from 
		db_1,db_2
	where 
		db_1.id=db_2.id;    等值连接,条件为等值关系
99版本写法:
	select
		...
	from
		a表
	(inner)join   默认内连接
		b表
	on
		a,b表的连接条件
	where
		筛选条件

1.6.3 内连接-非等值连接

假设有如下两个表

现需求将员工的工资等级区间查询出来

select
	e.ename,e.sal,s.grade
from
	emp e
join
	salgrade s
on
	e.sal >=s.losal and e.sal<s.hisal  //e.sal between s.losal and s.hisal  非等值连接

1.6.4 内连接-自连接

一张表当成两张表看,假设有表如下,需求将ename所对应的管理员查询出来。

select 
	e.ename as '员工',s.ename as '管理员'
from
	emp e
join
	emp s
on
	e.mgr =s.empno

1.7外连接

外连接与内连接区别在于外连接两表存在主次关系,内连接表之间为平等关系。同一条查询语句中内外连接可以同时使用。

1.7.1 右外连接

右外连接表示将join关键字右边的表作为主表,将所有数据查询出来,顺带查询前面的表数据。
设存在如下表:

现需求查询出对应编号相等的e表d表name。
若使用内连接:

select
	e.ename , d.dname
from 
	emq e
join 
	dept d
on
	e.deptno =d.deptno;


查询结果为两表平等,只有完全匹配的数据才会显示。
若使用外连接:
这里以d表作为主表,所以d表中所有数据将被查询出来,若该数据对应e表无数据则显示null。

select
	e.ename , d.dname
from 
	emq e right join dept d
on
	e.deptno =d.deptno;

1.7.2 左外连接

两个写法是通用的,只有主次之分。

1.8 多表联查

语法:

select
	...
from
	a表
join
	b表
on 
	ab表联查条件
join
	c表
on
	ac表联查条件
......

1.9子查询

子查询是指在select语句中嵌套select语句,被嵌套的语句称为子查询。

1.9.1 where语句子查询

示例:
查询超过工资超过平均值的员工姓名和工资
错误写法:

select 
	ename , sal
from
	emp
where
	 sal> avg(sal);

where子句中不能直接使用分组函数
所以这里需要做两步查询
1.查询平均值工资
2.查询超过平均值工资员工姓名和工资
合并语句

select 
	ename , sal
from
	emp
where
	 sal> (select avg (sal) from emp);

1.9.2 from子查询

from后面的子查询可以将查询结果作为一张临时表使用。
示例:
找出每个岗位平均工资的薪资等级
第一步:找出每个岗位的平均工资

第二步:根据第一步查询出来的临时表去查询登记表
salgrade表

合并:

select
	t.*,s.grade
from
	(select job,avg(sal) as avgsal from emp group by job) t
join
	salgrade s
on
	t.avg(sal) between s.losal and s.hisal;

1.9.3 select子句的子查询

该方式了解即可。

1.10union合并查询结果集

在表连接中,每连接一次新表,则匹配的次数满足笛卡尔积,成本成倍地增加,此时使用union进行分开查询并连接,更加节省资源。
例如:使用or条件查询


使用该方式结果一样,但效率更高。可理解为加法替代了乘法。

1.11limit查询

该语句常用于分页查询中,将结果中一部分数据取出。
使用方法:

select
	ename,sal
from
	emp
order by
	sal desc
limit 5     //前五条 or limit 0,5  limit 起始下标 检索长度  

mysql 中limit在order by后面执行。

2.DML 数据操作语言

该类语言修改数据内容

insert
delete
update

3.DDL 数据定义语言

该类语言主要修改数据结构

create
drop
alter

4.TCL 事务控制语言

commit  事务提交	
rollback 事务回滚

5.DCL 数据控制语言

grant  授权
revoke 撤销权限

以上是关于数据库学习指令记录的主要内容,如果未能解决你的问题,请参考以下文章

java学习笔记之mysql2

核心数据按升序获取最后 20 条记录?

论文解读从可扩展的远程情感监督构建的附有结构和主次标记的MEGA RST 篇章树库

记录学习第一天--计算机基础概述

在 Oracle Forms 中按升序查看记录

[django]主次表如何取出对方数据