《数据库系统原理》日常使用
2021-10-13 11:21:48 0 举报
AI智能生成
实操语句,适用于自考、日常使用
作者其他创作
大纲/内容
需要请联系1031574211
学习前提
MariaDB与mysql 的操作命令一致,所以直接学习mysql即可
二者的关系
先创建有了mysql
后mysql被sun公司收购
后sun公司被Oracle公司收购,mysql的所有权归于Oracle
而创始人随后为mysql另开分支,创建了mariadb,并且其完全兼容mysql的所有命令和api
常用命令
登录
mysql -u+(用户名) -p+(密码,如果不写,则后面输入密码时看不见内容)
退出
exit
直接ctrl+c(强制退出)
查看所有数据库
show databases;
查看该数据库中的表
show tables;
使用某个数据库
use 数据库名字;
创建数据库
create databases 数据库名;
导入数据库
source 绝对路径;
查看表的数据结构
desc 表名
查看mysql数据库的版本号
select version();
查看当前使用的数据库
select database();
DQL
概念:数据查询语言(凡是带有select 关键字的都是查询语句)
写法
select ....from ...where ...group by ...having ...order by ...limit ...
语句顺序:
第一步:from
第二步:where
第三步:group by
第四步:having
第五步:select
第六步:order by
第七步:limit
查看表内所有的数据
select * from 表名;
简单查询
select 字段名 from 表名;
查询多个字段
select 字段名,字段名,..... from 表明;
列起别名
select dname as deptname from 表名;
select dname deptname from 表名;
select dname "dept name" from 表名;
select dname 'dept name' from 表名;
列参与数学运算
select name,money*12 from emp;
条件查询
条件语句
= 等于
<> 或!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
between .... and ... 两个值之间,等同于>= and <=
is null 为空
不可用 = null因为数据的null不是一个值,不能用等号衡量
is not null 非空
and 并且
or 或者
in 包含,相当于多个or (not in 不在这个范围中)
in不是一个区间,括号内的是具体值
查询薪资是800或者500的员工
select 名字,员工 from 表名 where 工资 = 800 or 工资 = 5000;
select 名字,员工 from 表名 where 工资 in (800,5000);
not 取非,主要用在is和in
like 模糊查询,支持%或下划线匹配
% 匹配任意个字符
以T结尾
where 列名 like '%T';
以T开头
where 列名 like 'T%';
下划线,一个下划线只匹配一个字符
第二个字母为A
where 列名 like '_A%';
第三个字母为A
where 列名 like '__A%';
当存在双重条件语句时,可加括号进行修饰
找出工资大于2500并且部门编号为10或20的员工
select * from emp where 工资 > 2500 and (部门编号 = 10 or 部门编号 = 20);
排序
升序
select 列名 from 表名 order by 列名2;
默认情况下是按照列名2进行升序(由小到大)
select 列名 from 表名 order by 列名2 asc;
按照列名2进行升序(由小到大)
降序
select 列名 from 表名 order by 列名2 desc;
按照列名2进行降序(由大到小)
多个字段排序
查询员工名字和薪资要求按照薪资升序,如果薪资一样的话再按照名字升序排列
select 名字,工资 from 表名 order by 工资 asc ,名字 asc
按照字段位置进行排序
select 列名1,列名2 from 表名 order by 2;
按照列名2 进行排序(不建议再开发中这样写)
数据处理函数/单行处理行数
特点:一个输入对应一个输出
lower
转换小写
upper
转换大写
substr
去字串
select substr(列名,1,1) from 表名;
concat
字符串拼接
案例
首字母大写
select name from student;
select upper(substr(name,1,1)) from student;
select substr(name,2,length(name) - 1) from student;
select concat(upper(substr(name,1,1)),substr(name,2,length(name) - 1)) as name from student;
length
取长度
trim
去空格
format(数字,'格式')
将查询结果的数字进行格式化
select ename,format(sal,'$999,999') as sal from emp;
str_to_date
将字符串varchar转换成date日期
date_format
格式化date日期成varchar字符串
通常用在查询日期方面,设置展示日期格式
now()可以获取当前时间
round
四舍五入
round(数值,保留几位小数)
若为负数,则保留到负几的整数位
rand()
生成随机数
只生成小数,如果需要整数,请配合round使用
ifnull
可将null转换成一个具体值
格式:ifnull(数据,被当作的值)
case...when...then...then...else...end
案例
当员工岗位为aaa时,工资上调10%;当工作岗位为bbb时,工资上调50%;其他保持不变;旧工资为old,调整后的工资为new;
select name, job, old, (case job when 'aaa' then old*1.1 when 'bbb' then old*1.5 else old end) as new from 表名;
分组函数/多行处理函数
特点:
多个输入对一个输出
分组函数不可使用在where后面
因为分组函数需要在分组之后才能使用where执行的时候还没有分组
分组函数可以在select和order by 时使用
select后面只能跟着参加分组的字段,以及分组函数
格式:
select ... from ... group by ...
执行顺序:
1.from
2.where
3.group by
4.having
5.select
6.order by
函数
count
计数
sum
求和
avg
平均数
max
最大值
min
最小值
having
可以对分组完成后的数据进一步的过滤
但having不能单独使用,必须和group by 联合使用,且不能代替where
一般在having中使用的都是where语句无法实现的功能
案例
找出每个部门,每个岗位的最高工资
select deptno,job,max(sal) from emp group by deptno,job;
找出每个部门的最高工资,要求显示最高薪资大于3000
select deptno,max(sal) from emp group by deptno having max(sal) > 3000;
优化策略:where和having,优先选择where,where实现不了的再选择having
select deptno,max(sal) from emp where sal > 3000 group by deptno;
找出每个部门的平均薪资,要求显示平均薪资高于2500
select deptno,avg(sal) from emp group by deptno having avg(sal)>2500;
找出每个岗位的平均薪资,要求显示平均薪资大于1500的,出'aaa'岗位之外
select job,avg(sal) as avgsal from emp where job != 'aaa' group by job having avg(sal) > 1500 order by avgsal desc;
distinct
去除关键字,放置在所有字段的最前方,表示把所有字段名去除重合数据
笛卡尔积现象
表的连接次数在只用where的时候会调用多次数据,效率不高
select ename,dname from emp,dept;
表连接使用join,可以减少调用次数,效率更高(99语法,语言更清晰)
select e.ename,d.dname from emp e join dept d on e.deptno = d.deptno;
99语法
select ...from ainner join bon a和b的连接条件where 筛选条件
inner 可省略
连接查询
内连接
特点:完成能够匹配上这个条件的数据查询出来
和外连接不同,没有主次关系
等值连接
非等值连接
自连接
外连接
特点:在外连接中存在主次关系,会把主表的数据全部查询出来,并关联查询左边的表
左外连接和右外连接可以相互转换,更改right 和left即可
左外连接
案例
selecet e.ename,d.dnamefrom dept d left outer join emp eon e.deptno = d.deptno
outer可以省略
右外连接
案例
selecet e.ename,d.dnamefrom emp e right outer join dept don e.deptno = d.deptno
outer可以省略
全连接
多表连接
连接查询中,内连接和外连接可以联合使用
语法
select .... from .... join ... on ... join ... on ... join ... on ...
子查询
select语句中嵌套select语句,被嵌套的语句被称为子查询
语法
select ...(selecet)from ...(select)where ...(select)
案例
比最低工资高的员工和工资(where的子查询)
select ename,sal from emp where sal > (select min(sal) from emp);
每个岗位的平均工资的薪资等级(from的子查询)
select t.*,s.grade from (select job,avg(sal) as avgsal from emp group by job) t join salgrade s on t.avgsal between s.losal and s.hisal
找出每个员工的部门名称,显示员工名和部门名(select的子查询)
select e.ename,e.depno,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;
该方式的子查询结果只能返回一个,不能多个
合并
案例
合并工作岗位为'aaa'和'bbb'的员工
select ename,jpb from emp where job = 'aaa'uninoselect ename,job from emp where job = 'bbb';
特点
使用or的查询匹配次数满足笛卡尔积,查询次数成倍的翻使用unino的查询匹配可以减少匹配次数
注意事项
unino在结果集合并的时候要求列数相同
在合并的时候最好两个的数据类型一致,orcle会报错,mysql不会
limit
将查询结果的一部分取出来,通常使用在分页查询分页的作用是为了提高用户的体验,因为一次全部查出来,用户体验差,可以一页页翻
用法
limit 5
取出前五
limit 0,5
从下标0开始取,长度为5
案例
取出前五名的员工
select ename,sal from emp order by sal desc limit 5;
注意:mysql中limit在order by 之后执行
分页
limit (页数-1)*分页长度,分页长度
DML
概念:数据操作语言(对表的数据进行insert、delete、update的都是DML)
数据类型
varchar(最长255)
可变长度的字符串
char (最长255)
定长字符串(不管实际多大,会分配固定长度的空间去存储,不恰当的时候会浪费空间)
int(最长11)
java的int
bigint
java的long
float
单精度高的浮点型
double
双精度高的浮点型数据
date
短日期类型
%Y-%m-%d
datetime
长日期类型
%Y-%m-%d %h:%i:%s
clob
字符大对象最多可以存储4G的字符串,例如存储一批那文章超过255个字符的都要采用CLOB字符大对象来存储
blob
二进制大对象专门来存储图片、声音、视频等流媒体往BLOB类型插入数据的时候,需要使用IO流
mysql的日期格式
%y
年
%m
月
%d
日
%h
时
%i
分
%s
秒
建表
create table 表名(字段名1 数据类型,字段名2 数据类型,字段名3 数据类型);
快速复制建表
create table emp2 as select * from emp;
删表
drop table 表名;
当表不存在的时候会报错
drop table if exists 表名;
如果这张表存在就删除
插入数据
插入单条记录
insert into 表名(字段名1、字段名2、字段名3...) value (值1、值2、值3...);
插入多条记录
insert into 表名 (字段名) values (...),(...)...
将查询结果插入(很少用)
insert into dept_bark select * from dept;
注意:插入时需要跟形参对应
修改数据
update 表名 set 字段名-值1,字段名2-值2,where 条件;
删除数据
delete from 表名 where 条件;
不加条件会全部删除,但是比较慢,数据可以恢复
快速删表
truncate table 表名
效率较高,无法恢复
DDL
概念:数据定义语言(对表的结构进行create、drop、alter的都是DDL)
约束
非空约束:no null
字段不能为空
案例
create tabele v_vip{ id int, name varchar(255) not null};
唯一性约束:unique
约束的字段不能重复,但可以为null
案例
列级约束:单个字段具有唯一性
create tabele v_vip{ id int, name varchar(255) unique};
表级约束:多个字段联合起来具有唯一性
create tabele v_vip{ id int, name varchar(255),email varchar(255),unique(name,email)};
主键约束:Primary key(简称PK)
相关术语
主键约束
一种约束
主键字段
被加了主键约束的字段
主键值
主键字段的每一个值叫做:主键值
单一主键
表内只存在一个主键
复合主键
使用表级约束的多个主键
自然主键
主键值是一个自然数,和业务没关系
业务主键
主键值和业务挂钩,例如银行卡账号做主键值
自增
auto_increment
主键的特征
not null + unique(不能为空,同时不能重复)
主键值一般都是定长的,不建议使用varchar,一般使用int、bigint、char等
外键约束:foreign key(简称Fk)
相关术语
外键约束
一种约束
外键字段
该字段添加了外键约束
外键值
外键字段中的每一个值
业务背景
请设计数据库表,描述“班级和学生”的信息
班级表
将班级名称对应编号
create table t_class{ classon int primary key, classname varchar(255)};
学生表
使用对应的班级编号
create table t_student{ no int primary key auto_increment, name varchar(255), cno int, foreign key(cno) refereces t_class(classno)};
格式
foreign key(子表字段) refereces 父表(父表字段)
问题
子表中的外键引用的父表中的某个字段,被引用的这个字段必须时主键吗
不一定是主键,但至少有unique约束,因为外键引用可以为null
外键可以为null吗
可以为null
检查约束:check(mysql不支持,oracle支持)
分支主题
存储引擎
怎么添加/指定存储引擎
show create table 表名;
ENGING
指定存储引擎
默认的存储引擎是:InnoDb
CHARSET
指定这张表的编码方式
默认的字符编码方式是:UTF8
九大存储引擎
当前5.5.36支持8个,版本不同支持情况不同
常用存储引擎
MyISAM存储引擎
特点
有三个文件:格式文件(存储表结构).frm、数据文件(存储表内容).MYD、索引文件(存储表上的索引,减少搜索范围).MYI
可被转换为压缩、只读表来节省空间
提示
主要是主键或者具有unique约束的字段会自动创建索引
InnoDB存储引擎
特点
支持事物,支持数据库崩溃后自动恢复机制,非常安全
.frm格式文件
MEMORY存储引擎
特点
表数据及索引存储在内存中,查询快
不能包含TEXT或BLOB字段
表级锁机制
不安全,关机之后数据消失
.frm格式文件
TCL
概念:事务控制语言(transaction)
事务提交:commit
清空事务性的日志文件,将数据持久化到数据库表中,标志这事务的成功结束
语句顺序
start transaction
DML语句
提交:commit
事务回滚:rollback
将之前的DML语句全部撤销,并且清空事务性的日志文件,标志这事务的失败结束
回滚只能回滚到上一次的提交点,但是mysql每执行一条语句,则提交一次(自动提交),需要另外关闭自动提交机制
语句顺序
start transaction
DML语句
回滚:rollback
四个特性
原子性
说明事物师最小的工作单元,不可再分
一致性
同一个事务中,所有操作要么同时成功,要么同时失败
隔离性
A事务和B事务之间具有一定的隔离A事务在操作一张表的时候,另一个事务B也操作这张表的话(多线程并发,具有安全问题)
持久性
事务最终结束的一个保障
隔离级别
读未提交:read uncommitted(最低的隔离级别)
事务A可以读取到事务B未提交的数据(脏读现象)
读已提交:read committed
事务A只能读取到事务B提交之后的数据(不可重复读取数据)
可重复读:repeatable read
事务A开启之后,每一次在事务A读取到的数据都是一致的,即使事务B修改了数据仍然不会改变(幻影读,不够真实)
mysql 的默认事务隔离级别就是可重复读
序列化 / 串行化:serializable(最高的隔离级别)
最高隔离级别,效率最低
事务排队,不能并发
查看当前事务隔离级别
select @@tx_isolation
更改隔离级别
set global transaction isolation level 隔离级别;
索引(Index)
在数据据库表的字段上添加的,为了提高查询效率存在的机制,相当于是一个目录在mysql当中以一个树的形式存在(自平衡二叉树,B-Tree)mysql中,竹简上,以及unique字段都会自动添加索引
什么条件下,会考虑给字段添加索引
条件一:数据量庞大
条件二:该字段经常出现在where后面
条件三:不常使用DML语句操作该字段
创建索引
create index 索引名 on 表名(字段名)
删除索引
drop 索引名 on 表名
查看一条sql语句是否使用了索引进行检索
explain sql语句
索引失效
第一种情况:在使用模糊查询,并且条件是以“%”开头时索引无法使用
第二种情况:在使用or的时候会失效,如果使用or那么要求两边都添加索引,不然两边都会失效
第三种情况:联合索引
第四种情况:where当中的参与列进行了运算
第五种情况:在where当中索引列使用了函数
视图
新建视图
create view 视图名 as DQL语句
后面只能跟着DQL语句,并且形成的视图后修改其中的数据,先关联的表也会一起修改
删除视图
drop view 视图名
插入视图
insert into 视图名(字段名) values(值)
修改视图数据
update 视图名 set 字段名 = 值 where 条件
在开发的应用
简化select语句,简化开发
假设有一条非常复杂的sql语句,并且在不同的位置上反复的使用,每次使用都需要对这个sql语句重新的编写,很长很麻烦。这时候就可以利用视图来进行开发,利于后期的维护
提示
视图对应的语句只能是DQL语句。但是视图对象创建完成之后,可以对视图进行增删改查等操作
增删改查,又叫做“CURD”,在公司内部统一沟通的术语
C:Create(增)
R:Retrive(查:检索)
U :Update
D:Delete
DBA
数据导出
mysqldump 数据库名>路径.sql -u root -p 密码
指定数据表
mysqldump 表名>路径 -u root -p 密码
数据导入
第一步:先登录到mysql数据库服务器上
第二步:创建数据库:create database 数据库名(需要和之前的库名保持一致)
第三步:使用数据库:use 数据库
子主题
DCL
数据控制语言
授权:grant
撤销权限:revoke
数据库设计三范式
第一范式
要求任何一张表必须有主键,每一个字段原子性不可再分
第二范式
建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖
第三范式
建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖
三范式是面试官经常问的,所以一定要记,可减少表中数据的冗余和空间的浪费
0 条评论
下一页