数据库基础

-- 创建用户;CREATE USER'用户名'[@'主机名']IDENTIFIED BY '密码'
-- 主机名可以为空,为空默认为%权限,表示所有主机可连接;
CREATE USER 'jredu'@'localhost' IDENTIFIED BY 'jredu';

-- GRANT TO:给用户分配权限:GRANT 权限名 ON 数据库名.表名 TO 用户@主机
-- ALL表示所有权限 *.*表示所有数据库中所有表
GRANT ALL ON *.* TO 'jredu'@'localhost';
GRANT SELECT,INSERT,DELETE ON mysql.‘user’ TO 'jredu'@'localhost';

-- REVOKE FROM 删除用户权限
REVOKE SELECT 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个字符长度的字符串,如果长度不够会自动空格补齐。N的范围0~255;
② VARCHAR(N):存储可变长度的字符串,最常用的。0~2^16-1*10;
③ TEXT:存储可变长度的字符串。(常用于发布文章等大段内容)0~2^16-1*10^2;
④ TINYTEXT: 0 ~ 2^8-1*10;
⑤ MEDIUMTEXT:0~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:无符号 0 ~ 2^32-1 有符号 -2^31 ~ 2^31-1; 最常用;
⑤ BIGINT:无符号 0 ~ 2^64-1 有符号 -2^63 ~ 2^63-1;

三、浮点型:
① FLOAT:可以精确到小数点后7位有效数字;
② DOUBLE:可以精确到小数点后十五到十六位有效数字;
四、日期时间数据类型:
注意:由于时间存储使用字符串或者时间戳存储,所以数据库中几乎不用日期类型。
① DATE:存储日期和时间数据;
② TIMESTAMP:比DATA更精确;

 

*
【数据库设计的三大范式】
1、第一范式(1NF):数据表中的每一列(每一个字段),必须是不可拆分的最小单元。
也就是确保每一列的原子性。
例如: userInfo:'山东省烟台市 1365464672'
userAds:'山东省烟台市' userTel:'1365464672'
2、第二范式(1NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系;也就是说一个表只描述一件事情。
例如:订单表:只能描述订单相关的信息,所以所有的字段都必须与订单ID相关 ;
产品表:只能描述产品相关的信息,所以所有的字段都必须与产品ID相关;
因此:不能在一张表中,同时出现订单信息与产品信息。
3、第三范式(3NF):满足2NF后,要求:表中的每一列都要与主键直接相关,而不是间接相关。(表中的每一列,只能那个依赖于主键)
例如:
订单表中,需要有客户相关信息,在分理出客户表之后。订单表中,只需要有一个用户即可。而不能有其他的客户信息。因为,其他的用户信息是直接关联于用户ID,而不是关联于订单
ID。

[第二范式与第三范式的本质区别]
在于有没有分出两张表,第二范式是说一张表中包含了多种不同实体的属性,那么必须要分成多张表。第三范式是要求,已经分好了多张表的话,那么一张表中只能有另一张表中的ID(主键),而不能有其他的任何信息(其他的信息,一律使用主键在另一张表查询)。

*/

-- 创建表
-- IF NOTEXISTS可以省略。省略后重复创建报错。如果不省略,则创建时会检查表是否已经存在,如果表存在则不再执行创建语句。

-- 定义列: 列名 数据类型 列定义关键字
-- 常用的列定义关键字:
-- UNSIGNED:设置列为无符号列。只能设置类型为数字类型的列。
-- Auto_INCREMENT:设置列为自动增长列。自动增长列必须是主键。

 


-- PRIMARY KEY:设置主键约束。
-- 【主键】
-- 1、主键的注意事项?主键默认非空!逐渐默认唯一性约束。只有主键才能设置自动增长
-- (主键不一定自增,自增必定是主键)。
-- 2、设置主键的方式?① 在列定义时设置:id INT UNSIGNED PRIMARY KEY,
-- ② 在列定义完成后设置:PRIMARY KEY(id)
-- UNIQUE:设置唯一性约束。该字段不能出现重复值。
-- NOT NULL:设置列非空约束。该字段不能为空。
-- DEFAULT:这支默认值约束。height DOUBLE(3,2) DEFAULT 1.2 height如果不输入默认1.2
-- FOREIGN KEY:设置外键约束。
-- 【外键】
-- 1、设置外键有哪些注意事项?
-- ① 只有innodb的数据库引擎支持外键。
-- 修改.ini文件设置default-storage-engine=INNODB
-- ② 外键与参照列的数据类型必须相同。
-- (数值型要求长度和无符号都相同,字符串要求类型相同,长度可以不同)
-- ③ 设置外键的字段必须要有索引。如果没有索引,设置外键时会自动生成一个索引。
-- 2、设置外间的语法?
-- [CONSTRAINT 外键名] FOREIGN KEY (外键字段) REFERENCES 参照表 (参照字段)
-- [ON DELETE SET NULL ON UPDATE CASCADE ] 设置参照完整性操作
-- 3、外键约束的参照完整性操作?
-- 参照操作:当对参照表的参照字段进行删除或更新参照字段。
-- 参照操作可选值:RESTRICT 拒绝参照表删除或更新参照字段。
-- NO ACTION 与 RESTRICT 相同,但这个指令只在mysql生效
-- CASCADE 删除或更新参照表的参照字段时,外键表的记录同步删除更新
-- SET NULL 删除或更新参照表的参照字段时,外键表的外键设为null