第1章 表的创建和维护

1.数据类型

1.1 文本

MySQL 5.0之前的版本char(10)或varchar(10)表述的是10个字节
1英文 = 1字节 可以存储10个英文
1汉字 = 2字节(GBK)/3字节(utf-8) 可以存储5个汉字(GBK)/3个汉字(utf-8)

MySQL 5.0之后的版本char(10)或varchar(10)表述的是10个字符
1英文 = 1字符 可以存储10个英文
1汉字 = 1字符 可以存储10个汉字

1.1.1 char 固定文本

将“学生姓名”列设置为char(10) - 表示可以支持最多10个字符
此时将“Tom”存入“学生姓名”中,实际上存了10个字符 可以理解存储的是"Tom"加7个空格。如果名字长度超过10个,无法存入数据。

1.1.2 varchar 可变文本(重要)

将“学生姓名”列设置为varchar(10) - 表示可以支持最多10个字符
此时将“Tom”存入“学生姓名”中,实际上存了3个字符 。如果名字长度超过10个,无法存入数据。

推荐使用varchar类型作为文本数据的类型,优点:

  • 数据在存储中不会有多余的冗余部分(主要指的是填满长度的空格)
  • 数据准确性,"Tom"和"Tom+7个空格"不是一样的数据
1.2 数值
1.2.1 int 整数类型(重要)

int类型支持数据为整数性质

1.2.2 float 浮点数类型(小数)(重要)

float类型支持数据为浮点数性质

1.3 时间
1.3.1 date 日期类型(年月日)(重要)

可以存储“年-月-日”的时间

1.3.2 time 时间类型(时分秒)

可以存储“时:分:秒”的时间

1.3.3 datetime 日期时间类型(年月日时分秒)(重要)

可以存储“年-月-日 时:分:秒”的时间

1.3.4 timestamp 时间戳类型(了解)

在Java体系中,时间原点是1970年1月1日 8时0分0秒 GMT+8。时间戳就是表述时间与时间原点之间的所经过毫秒数(1s = 1000ms)

1.4 其他(了解)
1.4.1 blob 字节流类型(二进制数据)

将二进制文件(图片,声音....)的内容存入blob
一般二进制文件占用的空间比较大,存储这种文件可能会拖慢数据库的执行速度

1.4.2 boolean 逻辑类型("真"和"假")

通常情况下使用int类型替代boolean类型
int中认为 0-假 1-真

2.创建表

建表至少需要提供表名,列名和列的数据类型
这些名字的命名规则:

  • 不能使用中文,只能英文和数字,不能以数字开头
  • 名字中间不允许出现空格
  • 不要使用SQL中的关键字
  • 不能使用已有的名字

命名规范

  • 使用英文单词进行命名

语法

CREATE TABLE 表名(
    列1名 列1的数据类型,
    列2名 列2的数据类型,
        ...
    列n名 列n的数据类型
);

3.约束

约束在表中对数据输入的限制,保证数据录入的准确性

3.1 主键约束 Primary Key(重要)

作用
被主键约束修饰的列,具有唯一性,可以代表一行数据
比如


编号性质的主键的列

编号具有体现某行数据的唯一性,可以代表这一行数据

主键约束的规则

  • 一张表中最多只能有一个主键约束
  • 做为主键的列,其中的数据不能是Null
  • 一个主键约束可以作用在多个列上,叫做“联合主键”
    多个列组成一个主键,这些列数据的组合作为主键出现
    联合主键

面试题
一张表最多只能有一个主键约束
一张表中最多只能有一个列是主键约束 x

主键约束的规范

  • 不使用有实际意义的数据做为主键列,因为实际意义的列可能发生改动

创建主键的两种方式

  • 建表时声明主键约束
    创建表时,直接在主键列后进行primary key进行声明

列级声明:

CREATE TABLE haha(
    hid INT(8) PRIMARY KEY,
    hname VARCHAR(32),
    birthday DATE
);

表级声明:
创建sno和cno为联合主键的表

CREATE TABLE stu_course(
    sno INT(8), 
    cno INT(8),
    score INT(4),
    PRIMARY KEY(sno,cno)
);
CREATE TABLE haha(
    hid INT(8), 
    hname VARCHAR(32),
    birthday DATE,
    CONSTRAINT PK_HAHA PRIMARY KEY(hid)
);
  • 建表后追加主键约束
    为student表的sno列添加主键约束
ALTER TABLE student ADD PRIMARY KEY(sno);
3.2 外键约束 Foreign Key

一张表的某个数据来源于另一张表,这就形成了外键关系
班级表


班级表

学生表


学生表

学生表中cno的数据应该来源于班级表的cno主键,形成外键关系
学生表中cno列依赖于班级表的cno列

为学生表(student)追加外键约束

ALTER TABLE student ADD FOREIGN KEY(cno) REFERENCES classes(cno)

创建学生表(Student)直接设置外键,只有表级声明

CREATE TABLE student(
    sno INT(8) PRIMARY KEY,
    sname VARCHAR(32),
    cno INT(8),
    FOREIGN KEY(cno) REFERENCES classes(cno)
);
3.3 唯一约束 Unique

被唯一约束修饰的列,其中数据不允许出现重复
唯一约束的特点(与主键约束的不同点)

  • 一张表中可以有多个唯一约束
  • 唯一约束的数据中可以有null

主键约束与唯一约束的区别

添加唯一约束的语句
列级声明

create table student(
    sno INT(8) primary key,
    sname VARCHAR(32) unique,
);

表级声明

create table student(
    sno INT(8),
    sname VARCHAR(32),
    primary key(sno),
    unique(sname)
);
3.4 非空约束 Not Null

约束数据不能为null

列级声明

create table student(
    sno INT(8) primary key,
    sname VARCHAR(32) unique not null,
);
3.5 检查约束 Check(MySQL不支持 Oracle支持)

自定义规则
比如约定某个整数类型的列输入的数字不能小于0
check(xxx > 0)
check(score >= 0 and score <= 100)

笔试题:写出五种数据库的约束,各自进行解释?

4.维护表

4.1 删除表

删除表时一定要事先确认
不仅仅删除的是表中的数据,表结构(表自身)都被删除了

drop table 表名;
4.2 截断表(清空表中的数据)

清空表中的数据,保留表结构(表自身)

truncate table 表名;

面试题
- drop和truncate的区别?
答 drop时删除整张表,包含表结构;truncate是截断表,保留表结构

4.3 更改表名

将表student2更名为student3

ALTER TABLE student2 RENAME student3
4.4 更改列名和列的数据类型

更改student3表中的sname列为snamex,同时列的数据类型varchar(64)

ALTER TABLE student3 CHANGE sname snamex VARCHAR(64);
4.5 增加列

为student3表新增birthday列,列的数据类型是date类型

ALTER TABLE student3 ADD COLUMN birthday DATE
4.6 删除列

删除student3表中birthday列

ALTER TABLE student3 DROP COLUMN birthday

本章重点

  1. 表的概念
  2. 各种约束的概念
  3. 主键约束的一些细节(联合主键)
  4. 主键和唯一的区别
  5. drop和truncate的区别
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 4,968评论 0 9
  • MySQL5.6从零开始学 第一章 初始mysql 1.1数据库基础 数据库是由一批数据构成的有序的集合,这些数据...
    星期四晚八点阅读 1,117评论 0 4
  • 以前,以为人生就是顺其自然,你看到的风景,你的所得和所失,都是自然而然,命中注定。 现在却觉得,人生很多的路,都需...
    茉莉冰红茶阅读 133评论 0 1
  • 心理学上认为,人在回忆往事时,大脑会自动转化为第三视角。仔细想想也有道理,否则,我们会不断的沉浸在美好的过...
    cindy_染指流年阅读 207评论 2 0