数据库基础和三大范式以及基本的增删改查命令
Posted GlenLi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库基础和三大范式以及基本的增删改查命令相关的知识,希望对你有一定的参考价值。
所谓数据库就是建库 建表 建约束。
① 确定实体 就是确定有几张表
② 确定表的属性
规范化的三个级别:数据库设计的三大范式!!!!
第一范式(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;
以上是关于数据库基础和三大范式以及基本的增删改查命令的主要内容,如果未能解决你的问题,请参考以下文章
关于android中数据库的创建以及基础的增删改查的相应操作