常见的数据库类型:
网状结构数据库:美国通用电气公司IDS(Integrated Data Store),以节点形式存储和访问。
层次结构数据库:IBM公司IMS(Information Management System)定向有序的树状结构实现存储和访问。
关系结构数据库:Oracle、DB2、MySQL、SQL Server,以表格(Table)存储,多表间建立关联关系,通过分类、合并、连接、选取等运算实现访问。
非关系型数据库:ElastecSearch、MongoDB、Redis,多数使用哈希表,表中以键值(key-value)的方式实现特定的键和一个指针指向的特定数据。
常用的数据库
Oracle: 大型重量级数据库
SqlServer:微软的数据库
MySql:开源轻量级数据库
DB2:IBM推出的商业数据库
SQLLite:嵌入式数据库
常见的UI工具
Navcat:是以直觉化的图形用户界面而建的
SQLyog:提供了完整的图形界面
Datagrip:idea中的专门的数据库操作工具
数据库操作:
DDL
创建数据库
create databas <数据库名>
查看数据库
show databases;
切换数据库
use <数据库名>
删除数据库
drop <数据库名>
查看状态
status
表的操作
创建表(表的命名规范要使用蛇形命名法,词与词之间要使用_分割,都要是小写)
create table <表名>(字段1 类型1,字段2 类型2)
删除表
drop table <表名>
添加字段
-- 选中一个表,给它添加一个字段和类型
alter table <表名> add <要添加的字段> <添加的字段类型>
-- 选中一个表,在指定字段后面添加
alter table <表名> add <要添加的字段> <添加的字段类型> after <要添加的位置>
修改字段
alter table <表名> change <要修改的字段> <修改的类型>
删除一个字段
alter table <要删除的表名> drop <要删除的字段>
重命名表
alter table <要修改的表名> raname <修改后的名字>
清除表中的数据
truncate <要清除的表名>
DMl(增删改查)
插入数据
insert into <表名>(列1,列2) values (值1,值2)
如果将列隐藏,那就意味着插入所有的列,主要列的顺序要和创建表的顺序一致
更新数据
update <表名> set 列名1 = 值1, 列名2 = 值2 where 列=值
删除数据
delete from <表名> where 列=值
查询
select * from <表名>
DCL
创建一个新用户
create user `xiaoming`@`localhost` identified with mysql_native_password BY '123';
查看用户(从mysql数据中的user表中进行查询)
select user, host from mysql.user;
给用户授权
grant all on testdb .* to 'xiaoming'@'localhost';
撤销所有的权限
revoke all on testdb.* from 'xiaoming'@'localhost';
MySql的数据类型
整数类型(支持无符号)
tinyint:1个字节
smallint:2个字节
mediumint:3个字节
int(integer)占4个字节
bigint:8个字节
create table tb_user(
id tinyint, -- 有符号的,范围是-128-127
age tinyint unsigned -- 无符号的,范围是0-255
);
小数类型
float:单精度,4个字节
double:双精度,8个字节
declmal:根据整数部分和小数部分决定
字符串类型
-
char类型:长度是不可变的,最大值范围只能是0-255
-
无论插入的数据是多长,那么都是固定长度
char(50) 插入数据是'小明',大小还是50
-
-
varchar类型:长度是可以变的,最大值的访问0-65535
-
插入的数据数据的长度是根据最终插入数量决定的
varchar(50) 插入'小明明天' ,大小是2+4
-
-
MEDIUMTEXT:中等字符串0-16777215
-
Long类型,就是longtext的缩写,字符串类型,存储的值0-4294967295
-
Blob:存在的是二进制类型对应的byte类型,例如图片,音频等等
char 和 varchar 以及 text
-
char 和 varchar中括号的n代表可以存多少个字符
-
char可以存放255个字符
-
varchar最多可以存放16383个字符(65535/4)
-
需要2个字节存放当前字符的长度
-
还需要1个字节用于存放null字符串
-
最终可以存放的字节是65535-2-1
-
-
-
最终占多数个字节和当前字段的编码有关系
latin1: 单字符最大占 1个字节 gbk:单字符最大可占用 2个字节 utf8:单字符最大可占用 3个字节 uth8mb4:单字符最大占 4个字节
create table tb_user( name varchar(65534) )charset = latin1;
-
如何选择
-
如果当前字段,不长而且长度是固定的就选择char类型,例如:手机、身份证
-
如果当前的字段,超过了5000的字,直接使用text类型,并且还需要分表
create table tb_new(
nid int,
title varchar(200)
);
create table tb_new_detail(
nid int,
detail text
);
其他任何情况都使用varcha -
日期类型
主要分为日期和时间
日期是:年月日
时间是:时分秒
Date 是日期
Time 是时间
Datetime 是时间日期
create table tb_user(
uid int,
birthday date, -- 时期
created datetime, -- 日期时间
begin time -- 时间
);
-- 插入数据,now()是一个函数用于存储当前的时间
insert into tb_user values(1,'1999-12-3',now(),'9:00:00');
-
TIMESTAMP时间戳(可以实现自动更新和默认值的功能)
-
create table tb_user( uid int, birthday date, -- 时期 created datetime, -- 日期时间 begin time, -- 时间 lastupdate timestamp default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
时间的常用函数
select month(birthday) from tb_user; -- 可以获取月份
select year(birthday) from tb_user; -- 可以获取年份
select day(birthday) from tb_user; -- 可以获取日份
select week(birthday) from tb_user; -- 本年的第几周
select weekday(birthday) from tb_user; -- 获取星期几
两个日期间隔的年月日
xxxxxxxxxx -- 两个日期之间的天数
select
DATEDIFF(now(),birthday) from tb_user;-- 两个日期之间的月份
select
PERIOD_DIFF(date_format(now(),'%Y%m'),date_format(birthday,'%Y%m')) from tb_user;-- 两个日期的年份
select
YEAR(now()) - YEAR(birthday) from tb_user;