数据库分类
① 关系型数据库
以表的形式存储数据,表与表之间建立一定的关系(外键)
Orcale、MySQL、SQLServer、DB2...
② 非关系型数据库
以键值对,字符串,文档等形式存储数据,数据之间没有关系
redis、MongDB、HBase...
区别:
1、关系型数据库将数据存储在硬盘上、非关系型数据库将数据存储在内存中
2、关系型数据检索效率远远低于非关系数据库
SQL的基本分类
结构化查询语言是一门特殊的编程语言、主要用途:对于数据库中数据增删改查,按照其功能特点可以分为如下几类
1、 DDL 数据定义语言:对数据库的创建和删除 以及对数据库表的创建删除和修改 关键字:create、drop
2、 DML 数据操作语言:对数据库表中数据的增 删 改 关键字:insert、delete、update
3、 DQL 数据查询语言:对数据库表中数据 查询 关键字:select
4、 DCL 数据控制语言:指定用户 分配权限 关键字:grant、revoke
5、 事务
DDL
Data Definition Language数据定义语言
关键字: create创建 drop删除 alter修改 show展示 database:数据库
一、 库的基本操作
1. 查看所有的数据库
show databases;
2. 创建数据库
语法一:create database 数据库名称 character set utf8;
create database day06;
语法二:create database if not exists 数据库名称 (如果不存在此数据库再创建)
3. 删除数据库
drop database 数据库名称
drop database day06;
4. 选中库
use 数据库名称
use day06;
5. 查看创建数据库语句
show create database 数据库名称
show create database day06;
***DDL数据定义语言:数据库的创建和删除修改、数据库中表的创建删除修改
二、 表的操作 show 展示 alter 修改 create 创建 table 表 drop 删除
1. 查看所有表 (某一个数据库下)
show tables
2. 创建表
create table 表名(
字段1 字段类型,
字段2 字段类型,
字段3 字段类型,
..
字段n 字段类型
);
语法一
create table student(pid int,pname varchar(20),sex char(2),adress varchar(50));
语法二
create table if not exists student (pid int,pname varchar(20),sex char(2),adress varchar(50));
3. 删除表
drop table 表名
drop table student;
4. 查看表结构
desc 表名
5. 查看创建表语句
show create table 表名;
show create table student
三、 修改表
1. 修改表名
alter table 表名 rename 新表名
2. 修改列名
alter table 表名 change 原列名 新列名 列的类型
3. 修改列的类型
alter table 表名 modify 原列名 新类型
4. 添加列
alter table 表名 add 新列名 类型
5. 删除列
alter table 表名 drop 列名
DML
Data Manipulation Language数据操作语言
关键字: 增insert 删delete 改update
(一)插入
语法:
1. 不指定字段插入单个 (表中字段对应值)
insert into 表名 values (值1,值2,值3,值4) 默认情况下需要给所有的列赋值
注意事项:
1、有多少列对应就应该有多少值
2、如果插入的是数值直接给值、除数值以外用双引号|单引号都可以
2. 指定字段插入单个(给部分列插入值)
insert into 表名 (列名1,列名2,列名3) values (值1,值2,值3)
注意事项:
1、声明的列和值要一一对应
2、如果插入的是数值直接给值、除数值以外用双引号|单引号都可以
3.批量插入
insert into 表名 (列1,列2,列3) values(值1,值2,值3),(值1,值2,值3),(值1,值2,值3)
注意:
1. 整型、浮点型 不需要加引号 ,字符型和日期类型 需要加引号
2. 插入的值必须满足类型和约束
3. 值和列名一一对应
4. 如果约束:(对当前列进行限制保证当前列数据的有效性和准确性)是 null 和 default 可以不插入
(二)删除
1.删除单个
delete from 表名 [where 条件]
2.删除所有
delete from 表名
truncate table 表名
(三)修改
-- 修改操作
-- 修改单条数据
-- update 表名 set 列1=值1,列2=值2,列3=值3 [where 条件]
-- 示例:将马蓉的地址修改成 飞机上
update stu set adress =‘飞机上‘ where pid =1;
-- 示例:将李小璐的名称改为马苏,性别改成男,adress改成李小璐家
update stu set name=‘马苏‘,sex=‘男‘,adress=‘李小璐家‘ where pid =2;
-- 没有加条件
-- 示例:将所有人的性别都改成女
update stu set sex =‘女‘;
DQL
(一)基本查询
语法:select 查询列表 from 表名;
1.查询结果虚拟表,不是真实存在
2.查询列表,可以是常量、字段名、表达式、函数和组合
(二)条件查询
语法: select 查询列表 from 表名 [where 条件]
条件形式
1.条件表达式: > < >= <= != <>
2.逻辑表达式: and or not
3.模糊条件: like( _:表示一个任意字符 %:通配0到多个任意字符) / between(包含开始和结束). . .and / in / not null
4.去除重复 distinct
DCL
1. 查看当前数据库系统中的用户
select * from mysql.user;
2. 创建新用户 默认没有权限
-- create user 用户名@远程|本地 identified by 密码
create user ‘dbh‘@‘%‘ identified by ‘123456‘;
3. 分配权限
-- grant 权限 on 库.表 to 用户 *:如果在库或者表上写*表示所有的库或者所有的表
grant select on day06.users to ‘dbh‘@‘%‘;
-- 将day06下用户表的所有权限都给它
grant all on day06.users to ‘dbh‘@‘%‘;
-- 将用户的权限提高到和root一样
grant all on *.* to ‘dbh‘@‘%‘;
4. 查看用户的权限
-- show grants for 用户名
show grants for ‘root‘@‘localhost‘;
5. 取消权限
-- revoke 权限 on 库.表 from 用户
revoke all on *.* from ‘dbh‘@‘%‘;
revoke all on day06.users from ‘dbh‘@‘%‘;
-- 只取消更新(包括insert)权限
revoke update on day06.users from ‘dbh‘@‘%‘;
6.删除用户
-- drop user 用户名
-- drop user 用户名
drop user ‘dbh‘@‘%‘;
MySQL数据库中数据类型
常用的:
mysql数据库中的数据类型
① 整型:tinyint/smallint/int/bigint byte(-128 127) short int long
② 浮点型:float(n,m) double(n,m) decimal(n,m) 准确值 n和m可以省略
n:整数位 + 小数位 的个数
m:小数位的个数
例:decimal(6,2) 总共能存6位数字,末尾2位是小数,字段最大值 999999.99 (小数点不算在长度内)
③ 字符型
varchar(10) 变长字符串 n必选 保存字符最大个数 性能低
char(n) 定长字符串 n可选 默认为1 保存字符最大个数 性能高
④ 日期
date 日期 年月日
time 时分秒
datetime 日期 年月日时分秒
2020-10-15 11:43:12
timestamp 时间戳 1970开始 2037年12月31日 23:59:59
mysql中没有boolean类型、通常我们会使用int类型来表示boolean类型 0:false 1:true
简述delete删除和truncate删除的区别
方式上:delete删除是逐行删除、truncate是删除整张表、然后再创建一张一模一样的表结构
效率上:truncate删除效率要高于delete
回滚上:delete删除数据可以回滚(可以找回来)truncate一旦删除数据将无法找回
自增序列上:delete删除会保留原有的自增序列、而truncate不会保留
mysql常见约束
mysql常见的约束
① 概述:用于限定当前列中的值 保证数据的准确性 和 有效性
② 常见约束
1. not null 被约束的列不能为空
2. unique 唯一约束 被约束的列下的值不允许重复 但是null可以有多个
3. primary key 主键约束
被约束的列下的1、值不能重复 2、不能为null 提高查询的效率(主键约束默认会给当前列创建一个索引) 一个表通常只有一个主键
4. default 默认约束 指定默认值
5. foreign key 外键约束
描述两个表之间的关系, 从一个表中(从表)某一列的值 来源于另一个表(主表)的主键值
alter table 从表 add foreign key(从表外键字段) references 主表(主表的主键)
其中:
① 表级约束:生成索引
primary key / unique / foreign key
② 列级约束
not null / default / primary key / unique
区分:
表级约束可以同时约束多列、列级约束只能约束一列
数据库体系
数据库系统:数据库管理员+数据库管理系统+数据库
数据库管理员 通过操作 数据库管理系统 来 操作数据库
联合主键
联合主键: 多个字段联合在一起使用组成一个主键;(单字段的可以添加, 但是多个字段的值不可以重复);
比如这种时候
商品品牌 商品型号
诺基亚 920
三星 NOTE2
诺基亚 8088
比如这样商品品牌可能有重复,都是诺基亚,但是诺基亚厂商生产的商品型号是不会重复的 也比如,可能好多品牌都有920这个型号,但是一个品牌只有一个920的型号
所以就靠这样的联合主键来确定这条记录的唯一性
内连接和外连接的区别
1.内连接查询它的查询时两张表返回的交集, 去掉没有连接条件的部分;
2.外连接查询是以其中一张表为基准, 去匹配另一张表, 如果匹配到了, 显示对应的数据, 如果匹配不到, 则以null补全;
where与having之间的区别(面试题):
1.where不能放在分组之后
2.having是和分组一起使用, 放在分组之后, 它的作用相当于where;
3.where是分组前的第一次筛选, having是分组后的第二次筛选;
4.where后面条件中不能和聚合函数一起使用, 而having可以;
Select查询书写顺序
SELECT distinct 字段 FROM 表名 WHERE 条件 GROUP BY(分组) 字段 HAVING 条件 ORDER BY(排序) 字段 limit 索引,每页显示条数;
mysql中常见的函数
length();获取长度
lower();转小写
upper()转大写
substr()截取字符 索引从1开始
LPAD(char1,n,char2)在字符串char1的左端填充字符串char2直到长度达到n;如果char1.length>n,则返回char1左端的n个字符。
trim();#去除两侧空格
concat(str,str1);#字符串拼接
CEIL();#向上取整
FLOOR():#向下取整
ABS();#取绝对值
RAND();#随机数(0,1)
ROUND();#四舍五入
MOD(被除数,除数);#取余
TRUNCATE(小数,保留位数);#藏取小数位
now();#获取当前的时间日期+时间
year(now())/month(now())/day(now())#年/月/日
date_format(日期,‘%Y年%m月%d日 %H时%i分%s秒‘‘);#指定日期的格式
curdate();#当前日期
curtime();#当前时间
ifnull()
流程控制结构
1. if();
2. 相当于if(){}else if(){}else if(){}结构
case
when条件表达式 then 值或者表达式
when条件表达式 then 值或者表达式
...
else 值或者表达式
end
#聚合
调用语法:select函数名(实参列表);
聚合数和单行函数的区别:
单行函数:将—个数据进行处理,返回一个值
聚合函数:将虚拟表看做一个组,处理一组数据,返回一个值
常见的聚合函数:
最大值max()
最小值min()
平均值avg()
总和sum()
总记录数count()
事务
事务:一组预编译的sql语句要么全部执行成功、要么全部执行失败。
-- 开始事务
start transaction;
-- 事务提交
commit;
-- 回滚事务
rollback;
将事务的提交方式设置手动
set autocommit =0;
事务的特性
特性:
① 原子性:多条sql作为一个整体、要么全部执行成功、要么全部执行失败。事务是一个不可分割的单元
② 一致性:事务要么全部成功、成功状态、要么全部失败就失败状态、状态的一致性
③ 持久性:事务一旦提交将永久发送改变、不受外在因素干扰。
④ 隔离性:多个事务执行的过程中、相互隔离互不影响。
事务的隔离级别
事务的隔离级别:
隔离级别:低 --- 高
1. 读未提交 read uncommitted
引发问题:脏读、不可重复读、幻读
解决:提升隔离级别
2. 读已提交 read committed
引发问题:不能读重复数据、幻读
解决:提升隔离级别
3. 可重复读 repeatable read
引发问题:幻读
解决:提升隔离级别
4. 串行化 serializable
补充:
脏读:读取到了未提交的数据
不可重复读:同一个事务中,对于同一数据,执行完全相同的select语句时可能看到不一样的结果。
幻读:当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行;
幻读和不可重复读的区别
不可重复读
重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样。(一个事务多次读取同一范围内数据时,另外一个发生了事务发生insert操作并提交了)。数据变化。
幻读
重点在于新增或者删除:在同一事务中,同样的条件,,第一次和第二次读出来的记录数不一样。(一个事务多次读取同一条数据时,另外一个发生了事务发生update,delete操作并提交了。insert操作一条新数据并不会影响刚才被读的那条数据。)。行数变化。
mysql的默认隔离级别
mysql默认隔离级别:可重复读
oracle sqlServer的默认隔离级别:读已提交
MySql数据库复习