1.数据库
数据库(Database)DB是按照数据结构来组织、存储和管理数据的仓库,每个数据库还具有一个或者多个API用于创建和管理或者复制我所保存的数据,之前我们可以将数据存储到本地文件中(序列化) 但是再本地文件中读写速度特别慢 不适合大量的数据存储 所以存储到数据库是最好的方式, 主要分为两种:
- 关系型数据库
- 非关系型数据库(nosql数据库)
1.1 关系型数据库
关系型数据库: 建立在关系模型基础的上的,关系模型就是二维表的方式进行存储 类似于excel表格 常见关系型数据库:
- mysql
- sql server
- oracle
- db2
- 达梦
- GaussDB
1.2 非关系型数据库
非关系型数据库(nosql): 没有特定的关系,不需要创建表结构,存储的数据之间也可以没有关系 适合存储海量的 复杂的 碎片化数据 读写速度特别快 所以一般是基于内存操作的
常见的非关系型有哪些:
- redis
- mongodb
2.1 Navicat快捷键
1.ctrl+q 打开查询窗口
2.ctrl+/ 注释sql语句 --
3.ctrl+shift+/ 取消注释sql语句
4.ctrl+r 运行查询窗口所有sql语句
5.ctrl+shift+r 只会运行选中的sql语句
6.ctrl+l 删除一行
...
3.Mysql
mysql是一种关系型数据库,是由瑞典Mysql AB公司研发的, 目前属于Oracle公司
优势:
- mysql开源的,免费的
- mysql支持大型的数据量存储,可以处理5千万级的数据
- mysql使用标准sql语言格式(其他数据库如果也支持语法基本是一样)
- mysql看可以运行在多个系统上 ,并且支持各种语言C C++ java Python...
- mysql是可以定制化的,你可以修改源码开发属于自己公司mysql系统
4.Sql语句分类 --- 笔试题
-
DDL:数据定义语言,用于创建和删除数据库对象的命令(创建数据库 创建表 创建视图 创建索引 创建触发器 创建函数...) 共同特性不能回滚事务
比如: create(创建) drop(删除) alter(修改) truncate(截断表)
-
DML:数据操作语言,用于操作(增 删 改)数据库表中的数据
比如: insert(新增数据) delete(删除数据) update(修改数据)
-
DQL:数据查询语言,用于查询数据库表中的数据
比如: select(查询数据) --- 最常用 最难得
-
DCL:数据控制语言,用来控制数据库组件许可或者权限
比如: grant(授权) revoke(撤销权限)
-
TCL:事务控制语言,用于提交事务或者回滚事务得
比如: commit(提交) rollback(回滚/撤销)
5.DDL语言
5.1 create命令创建表:
-- 语法规则: [] 可有可无
-- 创建 表关键字
create table 表名(
字段1 数据类型 [约束] [索引] [注释] ,
字段2 数据类型 [约束] [索引] [注释] ,
...
字段n 数据类型 [约束] [索引] [注释]
) [表类型] [表字符集][注释] ;
CrEaTe table student(
stuno int comment '学生编号',
stuname varchar(100) comment '学生姓名',
money double(10,2) comment '学生存款',
time date comment '入学时间'
)comment='学生表';
注:关键字是table , 字段和字段之间通过"," 结束语通过";"
5.2 alter命令修改表
-- 修改表名:
alter table 旧表名 rename 新表名;
-- 添加字段:
alter table 表名 add 字段名 类型;
-- 修改字段:
alter table 表名 change 原字段名 新字段名 类型;
-- 删除字段:
alter table 表名 drop 字段名;
5.3 drop命令删除表
drop table 表名;
6.DML语言
6.1 insert命令新增数据
--新增语法1: 指定字段插入
insert into 表名 (字段1,字段5,字段3) values (值1,值5,值3);
--注: 前面声明得字段 必须和后面值是一一对应
--新增语法2: 全字段插入
insert into 表名 values(值1,...,值n);
--注: 全字段新增 后面的值 必须和表声明的字段一一对应
--新增语法3: 批量插入
insert into 表名 (字段1,字段5) values(值1,值5),(值1,值5),(值1,值5);
insert into 表名 values(值1,...,值n) , (值1,...,值n), (值1,...,值n);
--新增语法4: 借助于select特点实现批量插入
insert into 表 select 值1,...,值n union
select 值1,...,值n union
select 值1,...,值n ;
6.2 update语句
语法:
update 表名 set 字段1=值1,字段2=值2 ... where 条件;
注: where 后面的条件 一般来说必须要加 否则全表更新
条件目的: 就是限制数据集 比如: > < = 来进行控制
6.3删除语句
语法:
delete from 表名 where 条件
注: 删除必须添加条件 否则全表删除
7.Mysql数据类型 ---面试题
- 数值类型:
| 类型 | 大小 | 介绍 |
|---|---|---|
| smallint | 2字节 | 小整型 |
| int | 4字节 | 整型 |
| bigint | 8字节 | 大整型 |
| float | 4字节 | 单精度 |
| double | 8字节 | 双精度 |
| decimal(参数) | 31字节 | 精确数值浮点型 |
-
字符串类型:
类型 大小 介绍 char 255个字符 定长字符串 varchar 65535字节 根据不同字符集存储的字符个数是不同的 变长字符串 text 65535个字符 长文本类型 blob 2的16次方-1字节,将文件转换成二进制保存,但是不推荐存储数据库 推荐存储云服务器或者文件服务器 数据库只需要存储地址 二进制类型 ...... -
char类型和varchar类型区别---面试题
char是属于定长类型,无论存储多少数据所占的空间是固定的 比如:char(10)存储"1"字符也会占10个 比较浪费空间 适合存储一些长度固定的数据 比如:性别 状态
varchar是属于变长类型,所占的空间是根据存储数据决定的 比如:varchar(1000)存储'1'字符也只会占1个 比较节省空间
-
-
日期类型:
| 类型 | 格式 | 介绍 |
|---|---|---|
| date | YYYY-MM-DD %y %m %d | 日期值 |
| time | HH:mm:ss | 时间值 |
| year | YYYY | 年份值 |
| timestamp | YYYY-MM-DD HH:mm:ss | 时间戳 |
| datetime | YYYY-MM-DD HH:mm:ss | 日期时间值 |
-
timestamp和datetime区别 ---面试题
- 容量不同:timestamp占四个字节datetime在5.6之后占5个字节
- 存储不同:timestamp存储的值转换成UTC的时间再进行存入 datetime不会转换 给什么存什么
- 存储null: timestamp如果存储null自动转换now(),datetime不会给什么存什么
- 存储now():timestamp可能与当前时间不一致 因为它会把当前时间转换成UTC来存储 datetime 不会转换 和当前时间是一致的
8.DQL --重点
多表连接查询单独放在下一篇文详解
8.1基础查询
基本语法:[]可有可无 只要写了 前后顺序不能颠倒
select 查询的字段,字段2,... from 表名或者视图名
[where 分组前条件]
[group by 分组的字段]
[having 分组后条件]
[order by 排序的字段 升序(ASC)或降序(DESC)]
[limit [起始下标,]行数];
8.2 where子句
就是将前面的查询结果做第一次筛选
1.查询范围 mysql逻辑运算符: and or not
select * from 表 where 成绩>60;
select * frmo 表 where 成绩>60 and 成绩<80
-- 属于闭区间 包括80和90
select * frmo 表 where between 60 and 80
2.筛选是否为null值
select * from 表 where 字段 is null
select * from 表 where 字段 is not null
3.筛选不等于
select * from 表 where 科目编号 !='java';
select * from 表 where 科目编号 <>'java'; --不存在 ><
4.筛选等于 或者等于多个值
select * from 表 where 部门编号=20;
-- 统计10 30 50部门的员工信息
select * from 表 where 部门编号=10 or 部门编号=20 or 部门编号=50
-- 简化写法 in()函数 等价于或者的意思
select * from 表 where 部门编号 in(10,30,50);
8.3 like子句
如果做查询时,这个条件如果不具体
语法:
select 查询字段 from 表 where 字段 like ???;
- :表示一个字符 一般情况确定 位数时使用
% :可以表示0-n个字符 一般情况下不确定位数时使用
比如:
'%a' : 是a字符结尾
'a%' : 是a字符开头的
'a__': 长度是3 以a字符开头
'%a_': 倒数第二个字符是a
'%a%': 包含a字符的内容 后期做搜索功能最多的实现
8.4 union子句
mysql中union用于链接多个select语句的结果集 最终合并成一个结果集
特点: 浙西select语句如果有重复的数据会自动去重,并且还可以实现数据库列转行
语法:
select 字段1,字段2 from 表
union
select 字段1,字段2 from 表
语法2:如果不想去除多个结果集重复数据 使用union all
注:要求多个查询语句的个数必须是一样的,跟字段类型没有关系
8.5 order by子句
数据库本身的数据默认无序的,因为不知道该用什么规则排序,如果想排序 需要通过关键字order by来实现,并且排序关键字是有先后顺序的 一般是写在除了limit语句的最后
语法:
order by 排序的字段 排序规则:
排序规则: ASC升序(默认值) DESC降序
8.6 limit子句
limit是mysql中用于通过下标(索引值)来限定查询条数的一种方式,它后期也是实现数据分页非常重要的途径,并且limit一般要写在sql语句末尾
语法:
limit [起始索引值,]查询条数;
比如:查询一张表 每页实现5条 查询第三页数据
limit 10,5 //10表示下标为10的数据开始查询,查询5条
比如:查询一张表 前10条数据
limit 0,10;或者 limit 10;
9.mysql约束 --面试题
约束:
-
非空约束:not null 保证字段不能为空
-
默认约束:default保证字段一定会有值,如果没有插入 设置成默认值 如果插入null也算插入了值
-
唯一约束:unique 保证字段唯一性 但是数据是可以为空的,并且 唯一约束 还会自动添加唯一索引
-
检查性约束:check 是用于给字段做一些简单校验 但是mysql会失效,语法是通过的 但是没有效果
-
主键约束:primary key(pk) 用于控制数据唯一的方式,主键约束自带唯一和非空两种功能 但是主键约束每张表只能写一个 并且主键约束也会自动添加索引 叫做主键索引
-
外键约束:foreign key(fk) 定义在具有父子关系的子表中,子表中的外键必须对应父表中的主键(或者唯一键) 目的是为了确保数据的完整性 并且外键可以重复可以为null
前提:添加外键时,一定是先创建父表再创建子表
1.
2.表已存在 添加约束
alter table
alter table 表名 modify 字段 加字段类型 not null;
alter table 表名 add 字段 check();
alter table 表名 alter column 字段 set default 12;
alter table 表名 add foreign key(city_id) references city(id);