数据库基础和三大范式以及基本的增删改查命令

 所谓数据库就是建库 建表 建约束。
① 确定实体 就是确定有几张表
② 确定表的属性
规范化的三个级别:数据库设计的三大范式!!!!
第一范式(1NF):原子性:数据表中的每一列是不可拆分的最小单元,也就是确保每一列的原子性。
例如:userInfo:'山东省烟台市 11233445667'
拆分成: ‘山东省烟台市’ 和‘'11233445667“:


第二范式(2NF):满足1NF后,要求:表中的所有列都依赖于主键,而不能有任何一列与主键没有关系。
也就是说每张表只能描述一件事情。
例如:订单表只能描述订单相关的信息,所以所有的字段都必须与订单id相关;
产品表,只能描述产品相关的信息,所以所有的字段都必须与产品ID相关。


第三范式(3NF):满足2NF后要求是表中的所有字段只与主键相关(依赖于主键),而不依赖于其他属性,
确保每一列都只与主键直接相关,而不是间接相关。
例如:订单表中,需要有客户相关信息,在分离出客户表之后。订单表中值需要有一个用户ID即可,
而不能有其他的客户信息。因为,其他的用户信息是直接关联于用户ID,而不是关联于订单ID,
【第二范式与第三范式的本质区别在于有没有分出两张表来】:第二范式是说一张表中包含了多种不同试题的属性,那么唏嘘分成多
张表,第三范式是在于已经分好了多张表的话,那么,一张表中只能有另一张表的ID(主键),而不能
有其他的任何信息(其他的信息,一律用主键在另一表查询)

-- 创建表
-- IF NOT EXISTS 可以省略 省略后重复创建时会包报错。如果省略,则创建时会检测表是否已存在,如果表存在则不再执行创建语句。
-- 定义列:列名 数据类型 列定义关键字
-- 常用的列定义关键字:
-- UNSIGNED:设置列为无符号列,只能设置类型为数字类型列。
-- AUTO_INCREMENT:设置列为自动增长列。自动增长列必须是主键。


-- PRIMARY KEY:设置主键约束。
-- 【主键】
-- 1、主键的注意事项?主键默认为空!主键默认唯一性约束!
-- 只有主键才能设置自动增长(主键不一定自增,自增的必定是主键)。
-- 2、设置主键的方式?① 在列定义时设置:id INT PRIMARY KEY ② 在定义完成后设置:PRIMARY KEY(id);
-- UNIQUE:设置唯一性约束。该字段不能出现重复值。例如:age SMALLINT UNIQUE,
-- DEFAULT:设置默认值约束。height DOUBLE(3,2) DEFAULT 1.2 heighit 如果不输入默认为1.2
-- NOT NULL:设置非空约束,该字段不能为空。

-- FOREIGN KEY:设置外键约束
-- 【外键】
-- 1、设置外键有哪些注意事项
-- ① 只有innodb的数据引擎支持外键
-- 修改my.ini文件设置default——storage_engine
-- ② 外键与参照列的数据类型必须相同,字符串要求类型相同,长度可以不同。
-- 2、设置外键的语法
-- CONSTRAINT 外键名 FOREIGN KEY (外键字段) REFERENCES 参照表(参照字段)
-- ON DELETE SET NULL ON UPDATE CASCADE 设置参照完整性操作:
-- 3、外键约束的参照操作
-- 参照操作:当对参照表的参照字段进行删除或者是更新时,外键表中的外键如何应对

-- 参照操作可选值:restrict 拒绝参照表删除或者是更新参照字段。
-- NOACTION 与RESTRICT相同,但这个指令只在MySQL生效
-- CASCADE 删除 或更新残渣表的参照字段,外键表的记录同步删除更新
-- SET NULL 删除或更新参照表的参照字段,外键表的外键设为NULL
--
USE mydb;
-- 删除表
DROP TABLE IF EXISTS tb1;

CREATE TABLE IF NOT EXISTS tb1(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255),-- name是关键字,所以使用反引号``包裹
age SMALLINT,
height DOUBLE(3,2) DEFAULT 1.2
-- PRIMARY KEY(id)
);
CREATE TABLE IF NOT EXISTS CLASSES(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
classname VARCHAR(255) NOT NULL
);
CREATE TABLE IF NOT EXISTS `USER`(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
clsid INT UNSIGNED,
`name` VARCHAR(255) NOT null ,
CONSTRAINT user_fk_classes FOREIGN KEY (clsid) REFERENCES classes(id) ON DELETE SET NULL ON UPDATE CASCADE
)

/*SQY 多行注释 */
-- SQL单行注释
-- 创建用户:CREATE USER ‘用户名’[@'主机名'] IDENTIFIED BY ‘密码’
-- 主机名可以为空,为空默认为%权限,表示所有主机可连
CREATE USER 'jredu'@'localhost' IDENTIFIED BY 'jredu';


-- GRANT 给用户分配权限:GRANT 权限名 ON 数据库名.表名 TO '用户'@'主机';
-- ALL表示所有权限 *.*表示所有用户中的所有表
GRANT ALL ON *.* TO 'jredu'@'localhost';

GRANT SELECT ON mysql.'user' TO 'jredu'@'localhost';

-- REVOKE FROM 删除用户权限
REVOKE ALL ON *.* FROM 'jredu'@'localhost';

-- 创建数据库,CREATE DATABASE[IF NOT EXISTS] 数据库名 [CHARACTER SET [=]'UTF8'] []代表可写可省
-- 如果省略IF NOT EXISTS在重复创建数据库时,会报错
CREATE DATABASE IF NOT EXISTS myDB3 CHARACTER SET 'UTF8';

-- 删除数据库 DROP DATABASE [IF EXISTS] 数据库名
DROP DATABASE IF EXISTS mydb2;

-- 查询本机中所有的数据库
SHOW DATABASES;

-- 使用mydb这个数据库 表示下面的查询都将默认针对mydb数据库。
USE mydb;


-- 显示数据库中的所有数据表格SHOW TABLES[FROM 数据库]
SHOW TABLES FROM mysql;


/*
mysql中常见的数据类型:

一、字符型:
① CHAR(N):表示的是固定长度的字符串,如果长度不够会自动空格补齐。N的范围是0-255
② VARCHAR():存储可变长度的字符串。最为常用。大约是->0-(2^16-1)*10;
③ TEXT: 存储可变长度的字符串(常用与发布文章的等大段内容)。0-65535*10^2;
④ TINYTEXT:0 ~(2^8-1)*10 ;
⑤ MEDIUMTEXT: 2~(2^24-1) * 10^3;
⑥ LONGTEXT: 0~(2^32-1) * 10^4;
⑦ enum("男","女"):枚举类型,字段只能容纳枚举出的数据。

二、整形
① TINYINT:无符号 0-2^8-1; 有符号 -2^7 ~ 2^7-1;
② SMALLINT:无符号 0~2^16-1 有符号 -2^15 ~ 2^15-1;
③ MEDIUMINT:无符号 0~2^24-1 有符号 -2^23 ~ 2^23-1;
④ INT:无符号 -2^32-1 有符号 -2^31 ~ 2^31-1;
⑤ BIGINT:无符号 0~2^64-1 有符号-2^63 ~ 2^63-1;
三、浮点型
①FLOAT 可以精确到小数点后七位有效数字
②DOUBLE 可以精确到小数点后十五位到十六位数字
四、日期和时间数据类型
注意:由于时间存储使用字符串或者是时间戳存储,所以数据库中几乎不用日期类型。
①DATE:存储日期和时间数据
②TIMESTAMP:比DATE更精准。


*/

  

SHOW COLUMN FROM classes;

SHOW TABLES;
-- 显示数据表结构
SHOW COLUMNS FROM tb1;
-- 显示表
SHOW CREATE TABLE tb1;
-- 删除表
DROP TABLE IF EXISTS tb1;

-- 修改表名 ALTER TABLE 旧表名 RENAME [TO]新表名;
ALTER TABLE tb1 RENAME tb2;
-- 同时修改多表名 RENAME TABLE tb3 TO tb1[,`user`TO user1...];
RENAME TABLE tb3 TO tb1,`user`TO user1;

--
-- 修改字段 列
-- ALTER TABLE 表名 CHANGE 旧列名 新列名 列定义 [FIRST|AFTER 某一列]
-- FIRST:将这个字段调整为表格第一列 AFTER 某一列:将这个字段放到某一列后面。
ALTER TABLE tb1 CHANGE `uername` `uername`VARCHAR(200) NOT NULL AFTER age;
-- MODIFY 只修改列定义,不能改名
ALTER TABLE tb1 MODIFY `uername` VARCHAR(200) NOT NULL AFTER age;
-- 删除表中某一列
ALTER TABLE tb1 DROP height;
-- 新增一列 必选部分:ALTER TABLE tb1 ADD height DOUBLE(8,2)
ALTER TABLE tb1 ADD height DOUBLE(8,2)DEFAULT 1.2 AFTER age;
-- 新增多列 不能调整列的位置,只能插在最后。
ALTER TABLE tb1 ADD(
weight DOUBLE(3,2) UNSIGNED,
school VARCHAR(255)

);


-- 增加主键约束
ALTER TABLE tb1 ADD PRIMARY KEY(age);

-- 删除主键约束 删去自增
ALTER TABLE tb1 DROP PRIMARY KEY;
-- 新增唯一性约束
ALTER TABLE tb1 ADD UNIQUE KEY(username);
-- 删除唯一性约束:由于创建唯一性约束会创建索引,所以删除时,需要删除索引
ALTER TABLE tb1 DROP INDEX username;

-- 设置默认值约束
ALTER TABLE tb1 ALTER age SET DEFAULT 20;
-- 删除默认值约束
ALTER TABLE tb1 ALTER age DROP DEFAULT;
SHOW COLUMN FROM tb1;
SHOW TABLES;