当前位置: 首页 > news >正文

DDL语言

DDL语言
/*
数据定义语言
库和表的管理
一、库的管理
创建、修改、删除
二、表的管理
创建、修改、删除

创建:create
修改:alter
删除:drop

*/

#一、库的管理
#1.库的创建
/
语法:
create database [if not exists]库名;
/

#创建库
CREATE DATABASE IF NOT EXISTS books;

#修改库
#更改库的字符集
ALTER DATABASE books CHARACTER SET gbk;

#删除库
DROP DATABASE IF EXISTS books;

#二、表的管理
#1.表的创建
/
语法
create table 表名(
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】,
列名 列的类型【(长度) 约束】...
)
/
#案例:创建表Book
CREATE TABLE book(
id INT, #编号
bname VARCHAR(20),#书名
price DOUBLE,#价格
authorId INT,#作者编号
publishDate DATETIME #出版日期

);

DESC book;

#案例:创建表author
CREATE TABLE IF NOT EXISTS author(
id INT,
au_name VARCHAR(20),
nation VARCHAR(10)
);
DESC author;

#2.表的修改
/
语法:
alter table 表名 add|drop|modify|change column 列名 【列类型 约束】;
/
#①修改列名
ALTER TABLE book CHANGE COLUMN publishDate pubDate DATETIME;
#②修改列的类型和约束
ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP;#修改列的类型
#③添加新列
ALTER TABLE author ADD COLUMN annual DOUBLE;
#④删除列
ALTER TABLE author DROP COLUMN annual;
#⑤修改表名
ALTER TABLE author RENAME TO book_author;

#3、表的删除
DROP TABLE IF EXISTS book_author;

SHOW TABLES;

#通用的写法:
DROP DATABASE IF EXISTS 旧库名;
CREATE DATABASE 新库名;

DROP TABLE IF EXISTS 旧表名;
CREATE TABLE 表名();

#4.表的复制
INSERT INTO book_author VALUES (1,'aa','fs');

#1.仅仅复制表的结构
CREATE TABLE copy LIKE book_author;
#2.复制表的结构+数据
CREATE TABLE copy2
SELECT * FROM book_author; #复制全部数据

#3.只复制部分数据
CREATE TABLE copy3
SELECT id,au_name #复制id au_name
FROM book_author
WHERE nation = 'fs';

#4.仅仅复制某些字段
CREATE TABLE copy4
SELECT id,au_name
FROM book_author
WHERE 0; #没有满足条件的数据,只复制部门字段 没有数据

#常见的数据类型
/
数值型:
整型
小数:
定点数
浮点数
字符型:
较短的文本:char varchar
较长的文本:text blob(较长的二进制数据)
日期型:
/

#一、整型
/
分类:
tinyint smallint mediumint int/integer bigint
1字节 2 3 4 8
特点:
①如果不设置无符号还是有符号,默认是有符号;如果想设置无符号,需要添加unsigned关键字
②如果插入的数值超出了整型的范围,会报异常,并且插入的是临界值
③如果不设置长度,会有默认的长度;长度代表了显示的最大宽度,如果不够会用0在左边进行填充,但必须搭配zerofill使用!
/

#1.如何设置无符号和有符号
DROP TABLE IF EXISTS tab_int;
CREATE TABLE tab_int (
t1 INT(7) ZEROFILL, #设置长度后,
t2 INT(7) UNSIGNED
);
DESC tab_int;
INSERT INTO tab_int VALUES(75,123456765);

#二、小数
/*
1.浮点型
float(M,D)
double(M,D)
2.定点型
dec(M,D)
decimal(M,D)

特点:

M:代表整数部位+小数部位
D:小数部位
如果超过范围,则插入临界值


M和D都可以省略
如果是decimal,则M默认为10,D默认为0
如果是float和double则会根据插入的数值的精度来决定精度

③定点型的精度较高,如果要求插入数值的精度较高如货币运算等则考虑使用
*/

#测试M和D
CREATE TABLE tab_float (
f1 FLOAT(5,2),
f2 DOUBLE(5,2),
f3 DECIMAL(5,2)
);
INSERT INTO tab_float VALUES(123.45,123.45,123.45);
INSERT INTO tab_float VALUES(123.45,123.45,123.45);
SELECT * FROM tab_float;
DESC tab_float;

#原则:
/
所选择的类型越简单越好,能保存数值的类型越小越好
/

#三、字符型
/*
较短的文本:
char:固定长度的字符
varchar:可变长度的字符

较长的文本
text
blob(较大的二进制)

其他:
binary和varbinary用于保存较短的二进制
enum用于保存枚举
set用于保存集合

特点:
写法 M的意思 特点 空间的耗费 效率
char char(M) 最大的字符数,可以省略,默认为1 固定长度的字符 比较耗费 高
varchar varchar(M) 最大的字符数,不可以省略 可变长度的字符 比较节省 低
*/

#枚举值
CREATE TABLE tab_char(
c1 ENUM('a','b','c')
);

INSERT INTO tab_char VALUES('a');
INSERT INTO tab_char VALUES('A');
INSERT INTO tab_char VALUES('M'); #插不进去

SELECT *FROM tab_char;

#四、日期型
/*
分类:
date只保存日期
time只保存时间
year只保存年

datetime保存日期+时间
timestamp保存日期+时间

特点:
字节 范围 时区等的影响
datetime 8 1000-9999 不受
timestamp 4 1970-2038 受

/
CREATE TABLE tab_date(
t1 DATETIME,
t2 TIMESTAMP
);
SELECT
FROM tab_date;
INSERT INTO tab_date VALUES(NOW(),NOW());

#常见约束
/*
含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性

分类:六大约束
NOT NULL: 非空,用于保证该字段的值不能为空 比如姓名、学号等
DEFAULT: 默认,用于保证该字段有默认值 比如性别
PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空 比如学号、编号
UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空 比如座位号
CHECK:检查约束【MySQL中不支持】比如年龄、性别
FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联的值
在从表添加外键约束,用于引用主表中某列的值 比如:专业编号,员工表的部门编号等

添加约束的时机:
1、创建表时
2、修改表时

约束的添加分类:
列级约束:
六大约束语法上都支持,但外键约束没有效果
表级约束:
除了非空、默认,其他都支持

主键和唯一的对比
保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合
主键 √ × 至多一个 √,但不推荐
唯一 √ √ 可以多个 √,但不推荐

外键:
1、要求在从表设置外键关系
2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
3、主表中的关联列必须是一个key(一般是主键或唯一)
4、插入数据时,先插入主表,再插入从表
5、删除数据时,先删除从表,再删除主表
*/
CREATE TABLE 表名 (
字段名 字段类型 列级约束
字段名 字段类型
表级约束
);

#一、创建表时添加约束
#1.添加列级约束
/
语法:
直接在字段名和类型后面追加 约束类型即可
只支持:默认、非空、主键、唯一
/
CREATE DATABASE student;

USE student;
CREATE TABLE stuinfo(
id INT PRIMARY KEY, #主键
stuName VARCHAR(20) NOT NULL, #非空
gender CHAR(1) CHECK(gender='男' OR gender='女'), #检查
seat INT UNIQUE,#唯一
age INT DEFAULT 18 #默认
majorId INT REFERENCES major(id) #外键
);

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

#查看stuinfo表中所有的索引,包括主键、外键、唯一
SHOW INDEX FROM stuinfo;

DESC stuinfo;

UPDATE stuinfo SET id = 2 WHERE id = 1;
UPDATE stuinfo SET seat = 3 WHERE seat = 2;
ALTER TABLE stuinfo DROP COLUMN majorId;
INSERT INTO stuinfo( stuName) VALUES('ds');
SELECT * FROM stuinfo;

#2.添加表级约束
/
语法:在各个字段的最下面
【constraint 约束名 】约束类型(字段名)
/
DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
id INT ,
stuName VARCHAR(20) ,
gender CHAR(1) ,
seat INT ,
age INT ,
majorId INT,

CONSTRAINT pk PRIMARY KEY(id), #主键
CONSTRAINT uq UNIQUE(seat), #唯一
CONSTRAINT ck CHECK(gender='男' OR gender='女'), #检查
CONSTRAINT fk FOREIGN KEY(majorId) REFERENCES major(id) #外键
);

SHOW INDEX FROM stuinfo;

#通用的写法:
CREATE TABLE IF NOT EXISTS stuinfo(
id INT PRIMARY KEY,
stuName VARCHAR(20) NOT NULL,
sex CHAR(1),
age INT DEFAULT 18,
seat INT UNIQUE,
majorId INT,
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id)
);

#二、修改表时添加约束
/
1.添加列级约束
alter table 表名 modify column 字段名 字段类型 新约束;
2.添加表级约束
alter table 表名 add 【constraint 约束名】约束类型(字段名) 【外键的引用】;
/
#1.添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
#2.添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
#3.添加主键
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#②表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#4.添加唯一
#①列级约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
#②表级约束
ALTER TABLE stuinfo ADD UNIQUE(seat);

#5.添加外键
ALTER TABLE stuinfo ADD FOREIGN KEY(majorId) REFERENCES major(id);

#三、修改表时删除约束
#1.删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;

#2.删除默认
ALTER TABLE stuinfo MODIFY COLUMN age INT;

#3.删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;

#4.删除唯一
ALTER TABLE stuinfo DROP INDEX seat;

#5.删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY majorId;

#标识列
/*
又称为自增长列
含义:可以不用手动的插入值,系统提供默认的序列值

特点:
1、标识列必须和主键搭配吗? 不一定,但要求是一个key
2、一个表中可以有几个标识列? 至多一个
3、标识列的类型只能是数值型
4、标识列可以设置步长
*/

#一、创建表时设置标识列
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE tab_identity(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
#TRUNCATE TABLE tab_idetity;
INSERT INTO tab_identity VALUES(NULL,'john');
SELECT * FROM tab_identity;

#二、修改表时设置标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

#三。修改表时删除标识列
ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY;

转载于:https://blog.51cto.com/14038155/2308004

相关文章:

  • BZOJ 1568: [JSOI2008]Blue Mary开公司
  • Ubuntu 16.04 下 安装go
  • PHP CLI应用的调试原理
  • springboot入门_email
  • Python MetaClass深入分析
  • Python中常见的字符串的操作方法:
  • 记录LNMP多主机架构Wordpress博客实施过程中的一些坑
  • 表单提交时问题总结
  • iOS:The operation couldn’t be completed. (DVTCoreSimulatorAdditionsErrorDomain error 0.)
  • python关于标识符说明
  • 类的自动加载
  • 【DP复习】背包 ovo
  • CSS3 Transform变形(3D转换)
  • Python——数据存储:XML操作
  • python 求助!
  • 【css3】浏览器内核及其兼容性
  • 【译】理解JavaScript:new 关键字
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • CSS魔法堂:Absolute Positioning就这个样
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • js正则,这点儿就够用了
  • Laravel Mix运行时关于es2015报错解决方案
  • php的插入排序,通过双层for循环
  • Twitter赢在开放,三年创造奇迹
  • Vue学习第二天
  • 今年的LC3大会没了?
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 排序(1):冒泡排序
  • 入门到放弃node系列之Hello Word篇
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #QT(一种朴素的计算器实现方法)
  • #vue3 实现前端下载excel文件模板功能
  • #控制台大学课堂点名问题_课堂随机点名
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (三)c52学习之旅-点亮LED灯
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)UDP基本编程步骤
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .gitignore文件---让git自动忽略指定文件
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .sh
  • /usr/bin/env: node: No such file or directory
  • @Mapper作用
  • @Service注解让spring找到你的Service bean
  • [ JavaScript ] JSON方法
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [4.9福建四校联考]
  • [Asp.net mvc]国际化