第三十八天

查看所有用户 select user,host from mysql.user;

内容回顾

什么是数据库

数据库:

	所有的数据存放的仓库'

​ 每一个文件夹也是一个数据库

数据库管理系统--软件

关系型数据库 和费关系型数据库

​ 关系型数据库: mysql oracle sqllite

非关系型数据库: redis mongodb memcache

数据库管理员-DBA

管理数据库的软件

数据库服务器 一台跑着一个数据库管理软件的机器

表: 文件 一张存储了数据的表

数据\记录: 表中的信息 一行就是一条记录

用户相关操作

查看当前用户是谁: select user()

给当前的用户设置密码 set password= password('123')

创建用户 create user 用户名@ 主机的ip/主机域名 identified by '123'

授权 grant select on 数据库名.* to '用户名'@'主机ip /域名'

授权并创建用户 grant select on 数据库名.* to '用户名'@'主机ip /域名' identified by '123'

查看所有用户 select user,host from mysql.user;

基础的库\表\数据操作

库-文件夹

​ 创建库 create database 库名

​ 切换到这个库下 use 库名

​ 查看所有库 show databases

表-文件
  1. 查看这个库下的所有表 show tables
  2. 展示表的类型
show create table eng2
  1. 表名 加上反引号** tab 上面的

create table 表名(字段名1 数据类型)[(宽度) 约束条件]

uscreate table eng1(name char(12),id  int)

#中括号里面 可以不写   int是11
  1. 删除表 drop table 表名;
数据---文件中的内容
  1. 增 insert into 表 values (一行数据),(一行数据),(一行数据);
#写入多个数据
insert into eng1 valus(1,'xiaowu')(2,'xiaoding')

#单独插入某个值  写入指定的字段
insert into eng1 (name )valus ('小黑')
  1. 删 delete from 表 where 条件
  2. 改: update 表 set 字段名=值, 字段2=值2 where 条件
  3. 查 select 字段 from 表
select * from eng1

查看表结构
  1. desc 表名 可以看到 字段 /类型/长度/ 看不到编码/引擎 / 具体约束信息只能看到一部分
mysql> desc eng1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(18) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.10 sec)
  1. show create table 表名; 查看详细信息

能看到字段/类型/长度/编码/引擎/约束/

今日内容

mysql支持的数据类型

mysql 表的完整性约束 不能有重复的 学号 身份证号

存储引擎--存储数据的方式--(存几个文件的问题)

查看引擎 show engines

查看当前的默认存储引擎:

mysql> show variables like "default_storage_engine";

查询当前数据库支持的存储引擎

mysql> show engines \G;

https://www.cnblogs.com/Eva-J/articles/9682063.html

数据持久化

  1. 支持事务: 为了保证数据的完整性,将多个操作标称原子性操作 --保持数据安全
  2. 支持行级锁:修改的行少的时候使用--修改数据频繁的操作
  3. 支持表级锁: 批量修改多行的时候使用--对于大量的数据的修改
  4. 支持外键:约束两张表中的关联资的不能随意的添加删除--能够降低数据增删改查的出错率

数据存在硬盘上,也就是说数据持久化存储

一张表

​ 数据

​ 表的结构

​ 索引(查询的时候使用的一个目录结构)

数据和索引存在一起 ----2个文件 innodb存储引擎

默认是这个   
  1. 数据索引一个文件

  2. 表结构 一个文件

数据和索引不存在一起 ---3个文件 myisam存储引擎

create table eng1(id int,name char(18)) engine=myisam
  1. 数据
  2. 索引
  3. 表结构

数据存储在内存中,也就是说数据断电消失--1个文件 memory存储引擎

create table eng3(id int,name char(18)) engine=memory
  1. 表结构

面试题:

  1. 你了解mysql存储引擎吗
  2. 你的项目用了什么引擎 为什么
    1. innodb
    2. 多个用户操作的过程中,对同一张表的数据同时做修改
    3. innodb支持行级锁 所以我们使用了这个存储引擎
    4. 为了适应程序未来扩展性, 扩展新功能的时候可能会用到....涉及到维护数据的而完整性
    5. 项目中有一个 什么什么表 ,之间的外键关系是什么,一张表的修改或者删除比较繁琐,怕出错所以做了外键约束

进入库文件夹里面

frm 框架

ibd 数据

数字类型

    无符号数 unsigned   0-255
    有符号数  -128-127

int 够用了

中间没有空格

  1. tiny int 0-255 一字节 ***

  2. small int 0-65535 二字节

  3. medium int 0-16777215 三字节

  4. int 4字节 *** 默认有符号的

需要定义无符号的 加unsigned

create table t1(id int,age tinyint unsigned);

都有约束

    -> ;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | int(11)             | YES  |     | NULL    |       |
| age   | tinyint(3) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+

int 可以11 位这么宽
tinyint(3)    3字节宽
  1. float 4字节 4 5 位
float(5,2)
5------> 总共几位
2-------> 小数几位
  1. double 8字节
create table t2(

f1 float(5,2),   保留两位小数  并四舍五入

f2 float,       ---float(255,30)

f3 double(5,2),

f4 double);     ---double(255,30)
  1. decimal double(65,30) 可以精确30位

    ​ 用不上

数据类型 时间

  1. date 20190930

  2. time 121953

  3. datetime 20190930121953 date +time

date 3字节    1000-01-01/9999-12-31 YYYY-MM-DD
year 3		1901/2155
time 3      HH:MM:SS 	
TIMESTAMP  有自动更新的功能 2038年到期 一般不用

实例

create table t5 (

dt datetime,

d date,

t time,

y year,
tt TIMESTAMP);


 insert into t5 values(now(),now(),now(),now(),now());

+---------------------+------------+----------+------+
| dt                  | d          | t        | y    |
+---------------------+------------+----------+------+
| 2020-03-29 23:23:30 | 2020-03-29 | 23:23:30 | 2020 |
+---------------------+------------+----------+------+
 t5    | CREATE TABLE `t5` (
  `dt` datetime DEFAULT NULL,
  `d` date DEFAULT NULL,
  `t` time DEFAULT NULL,
  `y` year(4) DEFAULT NULL,
  `tt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |


给别的赋予 timesstamp 的自动更新的功能

create table t6(
dt datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

这样就赋予了   dt 自动更新的功能


效果如下:

+---------------------+------+
| dt                  | id   |
+---------------------+------+
| 2020-03-29 23:51:05 |    1 |
| 2020-03-29 23:51:08 |    2 |
| 2020-03-29 23:51:11 |    3 |
| 2020-03-29 23:51:13 |    4 |
+---------------------+------+
4 rows in set (0.00 sec)

字符串

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型	大小	用途
CHAR	0-255字节	定长字符串
VARCHAR	0-65535 字节	变长字符串
TINYBLOB	0-255字节	不超过 255 个字符的二进制字符串
TINYTEXT	0-255字节	短文本字符串
BLOB	0-65 535字节	二进制形式的长文本数据
TEXT	0-65 535字节	长文本数据
MEDIUMBLOB	0-16 777 215字节	二进制形式的中等长度文本数据
MEDIUMTEXT	0-16 777 215字节	中等长度文本数据
LONGBLOB	0-4 294 967 295字节	二进制形式的极大文本数据
LONGTEXT	0-4 294 967 295字节	极大文本数据

char(18) 最多只表示 255个字符

可以不写 长度 
char ----------------这样默认长度是1
char(18)
  1. 定长存储, 不用计算 直接存

  2. 'alex'其余用空格补齐 ----->18

    1. 大于 18 位 的 只存前18位
    适合用char
    
    身份证号
    手机号码
    qq号
    username12-18
    password 32
    银行卡
    

varchar --变长存储 节省空间

必须写长度
varchar(18)
  1. 变长存储 节省空间 ,存取速度慢
  2. 'alex' 'alex4'
适合varchar

评论
朋友圈
微博

例子:

create table t7 (
c1 char,
v1 varchar(8),
c2 char(8),
v2 varchar(8));

enum/set

enmu 单选行为

create table t8(
id int,
name char(18),
gender enum('male','female') ******
);

在里面的可以选, 不在里面的不能选

mysql> insert into t8 values(1,'sdas','male'),(2,'sasas',111);


+------+-------+--------+
| id   | name  | gender |
+------+-------+--------+
|    1 | sdas  | male   |
|    2 | sasas |        |
+------+-------+--------+
2 rows in set (0.00 sec)

set 多选行为

create table t9(
id int,
name char(18),
hobby set('抽烟','喝酒','烫头')
);
insert into t9 values(1,'小屋','抽烟,喝酒,烫头');


'抽烟,喝酒,烫头'   ---------->

--> 引号里面写 逗号   里面还不加引号 <---


不能选 范围外面的项

完整性约束

约束某一个字段 unsigned

无符号数 int

默认值 default

不能重复 unique

自增

主键

外键

10

约束 非符号数

create table t10(

id int unsigned)

;

11

非符号数 不为空

字符串 不为空


create table t11(

id int unsigned not null,
*****无符号数 不能为空

name char(18) not null
);

not null 不生效

设置严格模式:
    不支持对not null字段插入null值
    不支持对自增长字段插入”值
    不支持text字段有默认值

直接在mysql中生效(重启失效):
mysql>set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

配置文件添加(永久失效):
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

not null不生效

设置默认值 12

create table t11(

id int unsigned not null,

name char(18) not null,
male enum('male','female') not null default 'male'
);

设置默认值 男性

default 在那个地方都 可以用
name char(18) not null default '小屋', 

不能重复 unique -值 不能重复 null 可以写入多个

create table t13
(id int inique,
id2 int);

1 1
2 1 
#(1 2) 写不进来了
null 1
null 1

写空 不算重复

联合唯一 unique

create table t14 (id int,
server_name char(12),
ip char(15),
port char(5),
unique (ip,port)
);


表示 两个联合唯一 
192.168.1.1 3333
192.168.1.1 3334

非空+唯一约束

第一个表 被定义位非空+唯一 的那一列 会成为这张表的 primary key (默认第一个)

一张表只能定义一个主键

***PRI *** 是主键

id int primary key

---> 这是制定主键

create table t15 (
id int not null unique,
username_name char(18) not null unique
);

+---------------+----------+------+-----+---------+-------+
| Field         | Type     | Null | Key | Default | Extra |
+---------------+----------+------+-----+---------+-------+
| id            | int(11)  | NO   | PRI | NULL    |       |
| username_name | char(18) | NO   | UNI | NULL    |       |
+---------------+----------+------+-----+---------+-------+

PRI 

学到 day38 9 约束

posted @ 2020-04-01 20:59  小丁变优秀  阅读(139)  评论(0)    收藏  举报