MySQL 数据库/表操作及数据增删改

数据库的操作:(DDL)

创建库:

 create database 库名 【charset = "字符集名如utf8"】; 	#创建一个字符集为utf-8的库。
CREATE DATABASE IF NOT EXISTS 库名 【CHARSET='字符集'】;# 一般写法,当库不存在时才会创建

库的删除:(从删库到跑路)

drop database 库名;
drop database if exists 库名;	#一般写法

修改库:
一般不要修改库。包括库名等。
修改字符集:

alter database 库名charset set 数据集名;

查询库:

show databases;		# 查看所有库
select database();	# 查看当前库

使用库:

use 库名;

数据表的操作(DDL)

表的创建:

CREATE TABLE 表名(
	列名1 列类型 【(长度)  约束】,
	列名2 列类型 【(长度)  约束】,
	......
	列名3 列类型 【(长度)  约束】,
);

CREATE TABLEIF NOT EXISTS 表名(
   	列名1 列类型 【(长度)  约束】,
   	列名2 列类型 【(长度)  约束】,
   	......
   	列名3 列类型 【(长度)  约束】,
);

表的删除:

drop table 表名;
drop table 表名 if exists 表名;

表的修改:

  • 修改表名 ALTER TABLE 表名 RENAME TO 新表名;
  • 添加新的列 ALTER TABLE 表名 ADD COLUMN 列名 类型 【约束】;
  • 删除列 ALTER TABLE 表名 DROP COLUMN 列名;
  • 修改列名或类型和约束 ALTER TABLE 表名 CHANGE 字段名 新字段名 【类型,约束】;
  • 修改列类型或约束 ALTER TABLE 表名 MODIFY 字段名 类型 约束;

查看表:

desc 表名;	# 查看表的结构
show create table 表名; # 查看表的创建语句

表的复制:

  • 复制表结构 create table 表名 like 原表;
  • 复制结构和数据 create table 表名 select * from 原表;
  • 只复制部分结构数据 create table 表名 select 列1,列2... from 原表;

数据的操纵语言:(DML)

插入语句 插入值的类型要与列类型一致或兼容

insert into 表名(列名1, 列名2, ...) values(值1, 值2,...),(...),...;#可插入多条 支持子查询 可省略列名。默认所有列,顺序与创建时一致
insert into 表名(列名1,列名2,...)(select语句);	# 子查询插入

不常用的插入方法:

insert into 表名 set 列名1=值1, 列名2=值2,...; 		# 只支持单条记录。

删除表数记录 支持 单表删除与多表删除

  • 单表删除: delete from 表名 where 筛选条件;
  • 多表删除:
    • 92 语法 delete from 表1 别名1, 表2 别名2,... where 连接条件 and 筛选条件;
    • 99 语法: delete from 表1 别名1 inner|left|right 表2 别名2, ...on 连接条件 where 筛选条件;

表中全部删除 truncate table 表名 立即执行,事务中也会立刻删除

修改表记录 支持单表修改与多表

  • 单表删除 update 表名 set 列1=新值1, 列2=新值2。。。where 筛选条件;

  • 多表删除

    • 92 语法:update 表1 别名1, 表2 别名2... set 列=值,... where 连接条件 and 筛选条件;
    • 99 语法:update 表1 别名1 inner|left|right 表2 别名2... set 列=值,... on 连接条件 and 筛选条件;

附1 常见数据类型:

  • 整型 :可分有符号无符号(表创建或修改时类型后接 unsigned 即表示无符号类型,插入数据超出范围会选取临界值。类型后长度则表示显示数据宽度,即不足宽度使用0填充,要搭配关键字zerofill)

    create table 表名 (列1 int(7) zerofill, 列2 int(7), unsigned);

Tinyint (1字节) Smallint(2字节) Mediumint(3字节)Int|integer(4字节) Bigint(8字节)。

  • 小数型:(包含浮点数类型与定点数类型 定点数类型值较为精确)M表示整数部分和小数部分长度之和 D表示小数点后保留位数,不足补零,超出警告(因为decimal是需要精确)M D都可以省略,有默认值。DEC(10,0) 默认,float double 没有精度 根据插入值精度确定。

    • 浮点数 包含 float(4个字节) double(8个字节) float(M,D) double(M,D)
    • 定点数DEC(M,D)|DECIMAL(M,D) 最大取值范围与double相同,给定decimal有效取值范围由M和D决定
  • 字符型:较短文本 char vachar 较长文本 text blob(较长的二进制数据)

    • char(M) M表示最多插入字符数 M0~255之间整数 代表固定长度字符 M可省
    • varchar(M) M表示最多插入字符数 M0~65535之间整数 代表可变长度字符
    • 固定长度 表示char会根据设置的M来分配固定长度字符,而varchar会根据插入字符的长度分配。 如 char(10), varchar(10) 插入数据中国 char会分配固定长度10 varchar会分配2字符长度。varchar省空间但 char 插入插入效率高。
  • 日期型:

    • date(4字节) (1000-01-01~9999-12-31)
    • datetime(8字节) (1000-01-01 00:00:00~9999-12-31 23:59:59)
    • timestamp (4字节) 时间戳 (1970-01-01 08:00:01~2038年某一时刻) 和实际时区有关,更能反映出实际的日期,而datetime只能反映出插入时当地时区
    • time (3字节) 只保存时间
    • year (1字节) (1901~2155)

附2 常见约束:约束(用于限制表中数据,保证数据的准确可靠性(一致性))
六大类型
非空(not null)
默认值(default 值)
唯一(unique) 该字段值具有唯一性 可以为空
检查(check)(MySQL 不支持)
主键(primary key) 字段唯一 并且非空
外键(foreign key)限制两个表的关系

列级约束中可以六种约束都可以写,但是外键约束没有效果
表级约束 除了非空和默认都支持。

列级约束添加 列名 类型 约束1,约束2,。。。一个列可以添加多个约束

CREATE TABLE major(
	id INT PRIMARY KEY,
	maijorName VARCHAR(20)
);

CREATE TABLE stuinfo(
	id INT PRIMARY KEY,	#  主键约束
	stuName VARCHAR(10) NOT NULL,	# 非空约束
	gender CHAR(1) CHECK(gender="男" OR gender="女"), # 检查约束 MySQL中无效
	seat INT UNIQUE, 	# 唯一约束
	age INT DEFAULT 18,	# 默认值约束
	majodId INT REFERENCES major(id)	#外键约束 无效
);

表级约束添加 【CONSTRAINT 约束名(个人起)】 约束类型(列名),
【CONSTRAINT 约束名(个人起)】 可以省略 会有一个默认名

CREATE TABLE stuinfo2(
	id INT,	#  主键约束
	stuName VARCHAR(10),	# 非空约束
	gender CHAR(1) CHECK(gender="男" OR gender="女"), # 检查约束 MySQL中无效
	seat INT, 	# 唯一约束
	age INT,	# 默认值约束
	majorId INT,	#外键约束
	
	CONSTRAINT pk PRIMARY KEY(id),	# 主键  主键名不可更改 默认是PRIMARY
	CONSTRAINT ck CHECK(gender="男" OR gender="女"),	# 检查
	CONSTRAINT uq UNIQUE(seat),	# 唯一
	CONSTRAINT fk FOREIGN KEY(majorId) REFERENCES major(id)	# 外键
);

通用写法:

CREATE TABLE stuinfo3(
	id INT PRIMARY KEY,	#  主键约束
	stuName VARCHAR(10) NOT NULL,	# 非空约束
	gender CHAR(1),
	age INT DEFAULT 18,	# 默认值约束
	seat INT UNIQUE,	# 唯一约束
	majorID INT,
	
	CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id) 
);

注: 主键 唯一 外键 会成为索引
约束添加 修改表时操作 可以再约束前加 CONSTRAINT 约束名,也可以省略

  • 添加约束

  • 非空 ALTER TABLE 表名 MODIFY COLUMN 列名 类型 NOT NULL;

  • 默认值 ALTER TABLE 表名 MODIFY COLUMN 列名 类型 DEFAULT 值;

  • 主键

    • ALTER TABLE 表名 MODIFY COLUMN 列名 类型 PRIMARY KEY;
    • ALTER TABLE 表名 ADD PRIMARY KEY(列名);
  • 唯一约束

    • ALTER TABLE 表名 MODIFY COLUMN 列名 类型 UNIQUE;
    • ALTER TABLE 表名 ADD UNIQUE(列名);
  • 外键ALTER TABLE 表名 ADD FOREIGN KEY(列名) REFERENCES 外键关联表(关联字段);

约束删除 修改表时操作

  • 非空 ALTER TABLE 表名 MODIFY COLUMN 列名 类型 NULL; # NULL可省
  • 默认值 ALTER TABLE 表名 MODIFY COLUMN 列名 类型;
  • 主键 ALTER TABLE 表名 DROP PRIMARY KEY # 主键唯一不用写列名;
  • 唯一约束 ALTER TABLE 表名 DROP INDEX 约束名;
  • 外键 ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
    注: 外键可以通过上述语句删除 但是 索引仍然存在。

MySQL标识列 自增长列 可不用手动插入值,一张表最多一个标识列系统提供默认值 类型只能是数值型 从1开始自动增长 关键字auto_increment 如id int primary key anto_increment; 将id设置为主键并且自增长
修改表时添加:
alter table 表名 modify column 列名 类型 auto_increment;
修改表时删除:

alter table 表名 modify column 列名 类型;

数据库设计三范式
第一范式: 有主键且每一个字段原子性不可再分
第二范式: 所有非主键字段完全依赖主键,不能产生部分依赖(尽量不使用联合主键)
第三范式: 所有非主键字段和主键字段间不能产生传递依赖。

发布了59 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dandanfengyun/article/details/97649788