MySQL数据库基础知识(二)

数据库基础知识二

    • 1. 表(DDL语句:create alter drop)
      • 1.1 创建表
      • 1.2 删除表
      • 1.3 给表中插入数据(DML)
      • 1.4 修改表中数据update(DML)
      • 1.5 删除表中数据delete(DML)
      • 1.6 快速删除表中数据truncate(DDL)
      • 1.7 对表结构进行修改alter(DDL)
    • 2. 约束(******重要*****)
      • 2.1 约束分类
        • 2.1.1 非空约束:NOT NULL
        • 2.1.2 唯一性约束:UNIQUE
          • 2.1.2.1 两个字段联合起来具有唯一性
          • 2.1.2.2 NOT NULL和unique的联合使用
        • 2.1.3 主键约束PRIMARY KEY
        • 2.1.4 外键约束FOREIGN KEY

1. 表(DDL语句:create alter drop)

1.1 创建表

1.建表的语法格式:

create table 表名(字段名1 数据类型,字段名2 数据类型,...,字段名n 数据类型);
表名:建议以t_或者tbl_开始,可读性强,见名知意
字段名:见名知意即可
表名和字段名都属于标识符。
命名规范:所有的标识符全部都是小写,单词执念用下划线进行衔接
建表时varcharchar类型必须有长度,不然会报错。

例:
CREATE TABLE T_STUDENT(
	NO INT,
	NAME VARCHAR(32),
	SEX CHAR(1),
	AGE INT,
	EMAIL VARCHAR(32)
);

建表时如果需要指定某个字段的默认值:
CREATE TABLE T_STUDENT(
	NO INT,
	NAME VARCHAR(32),
	SEX CHAR(1) default ‘m’,
	AGE INT,
	EMAIL VARCHAR(32)
);

快速创建表:将一次查询结果当做一张表新建
create table emp2 as select * from  emp;

2.MySql中的数据类型

数据类型 用法
varchar(最长255) 可变长度的字符串,比较智能,节省空间,可根据实际的数据长度动态分配空间,所以缺点是速度慢
char(最长255) 固定长度字符串,无论实际数据多长,都分配固定的长度空间,优点:速度快,缺:使用不当会造成空间浪费
int(最长11位) 整型,等同于Java中的int
bigint 长整型,等同于Java中的long
float 单精度浮点型数据
double 双精度浮点型数据
date 短日期类型
datetime 长日期类型
clob(Character Large OBject) 字符大对象,最多可以存4G的字符串,比如存一篇文章,一个说明等。超过255个字符的都要用CLOB字符大对象来存储
blob(Binary Large OBject) 二进制大对象,专门用来存储图片、声音、视频等流媒体数据,往BLOB类型的字段上插入数据时需要使用IO流才行

1.2 删除表

drop table tablename;-- 如果表不存在会报错
drop table if exists tablename;

1.3 给表中插入数据(DML)

INSERT INTO 表名(字段名1,字段名2,字段名3...) VALUES(1,2,3...);
注意: 1.字段名和值要一一对应,数量和数据类型都要对应
	  2.INSERT语句只要执行成功了,表中必然会多一条记录。
例:
INSERT INTO T_STUDENT(NO,NAME,SEX,AGE,EMAIL) VALUES(1,'ZHANGSAN','男',20,'zhangsan.com');
INSERT INTO T_STUDENT(EMAIL,AGE,SEX,NAME,NO) VALUES ('lisi.com', 20,'f', 'LISI', 2);
INSERT INTO T_STUDENT(NO) VALUES (3);-- 没有给其他字段赋值是,默认值为NULL
INSERT INTO T_STUDENT VALUES ('wangwu.com', 21,'f', 'WANGWU', 4); -- 字段名如果省略,默认为都有,此时值都要写上,并且与建表时的顺序要一一对应。
SELECT * FROM T_STUDENT; 
create table t_user(
	id int,
	name varchar(32),
	birth date, -- date是短日期,只包括年月日,默认格式:%Y-%m-%d
	create_time datetime -- datetime是长日期,包括年月日时分秒,默认格式:%Y-%m-%d %h:%i:%s
);
insert into t_user (id,name,birth,create_time) values (1,'zhangsan','1990-06-20','2022-06-20 22:33:59');
insert into t_user (id,name,birth,create_time) values (1,'zhangsan','1991-06-20',now());
-- now()函数可以获取系统当前时间,并且是datetime类型的
insert into t_user (id,name,birth,create_time) values (1,'zhangsan','1991-06-20',now()), (2,'lisi','1992-06-20',now());
-- insert一次插入多条数据: insert into TableName(字段名1,字段名2) values(),(),(),();

1.4 修改表中数据update(DML)

语法格式:

UPDATE 表名 set 字段名1=1,字段名2=2,字段名3=3...where 条件;
注意:没有条件限制会导致所有数据全部更新,所以记得加where条件。
例如:
update t_user set id=1, name='jack' where name = 'zhangsan'; --将名字叫zhangsan的改为jack

1.5 删除表中数据delete(DML)

语法格式:

delete from 表名 where 条件;
注意:没有条件会删除整张表所有的数据。
例如:
delete from t_user where id =1;

1.6 快速删除表中数据truncate(DDL)

  • delete语句删除数据原理: 表中的数据虽然被删除了,但是这个数据在硬盘上的真实存储空间不会被释放
    优: 支持回滚,后悔了可以恢复数据
    缺:删除效率较低
  • truncate语句删除数据原理:表被一次截断,物理删除。
    优:快速。
    缺点:不支持回滚,删除之后数据无法恢复。
    用法:truncate table 表名;

1.7 对表结构进行修改alter(DDL)

基本不用

2. 约束(*重要)

约束:constraint
在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性,约束就是为了保证表中的数据有效。

2.1 约束分类

  • 非空约束:not null
  • 唯一性约束: unique
  • 主键约束:primary key(简称PK)
  • 外键约束:foreign key(简称FK)
  • 检查约束:check (mysql不支持,oracle支持)

2.1.1 非空约束:NOT NULL

非空约束not null约束的字段不能为NULL;

create table t_vip(
	id int,
	name varchar(32) not null
);
insert into t_vip(id, name) values(1,'zhangsan');
insert into t_vip(id) values(2); --会报错:Field 'name' doesn't have a default value

NOTE: xxxx.sql文件是sql脚本文件,其中写了大量的sql语句,在mysql中使用source …/xxx.sql(文件位置)来批量执行SQL语句,执行SQL脚本文件的时候,该文件中所有的sql语句会全部执行!

2.1.2 唯一性约束:UNIQUE

唯一性约束的字段不能重复,但是可以都为NULL,都为null不算重复

create table t_vip(
	id int(5),
	name varchar(32) unique --约束直接添加到列后面的叫列级约束
);
insert into t_vip values (1, 'lisi');
insert into t_vip values (2, 'zhangsan');
insert into t_vip values (3, 'zhangsan');-- 报错:Duplicate entry 'zhangsan' for key 
insert into t_vip(id) values (4);
insert into t_vip(id) values (5);-- 不报错
2.1.2.1 两个字段联合起来具有唯一性
create table t_vip(
	name varchar(32),
	email carchar(255)
	unique(name,email) --约束没有直接添加在列后面的叫表级约束
);
insert into t_vip values ('zhangsan','[email protected]');
insert into t_vip values ('zhangsan','[email protected]');--不报错,name和email都一样时才会报错
2.1.2.2 NOT NULL和unique的联合使用

在MySQL中,如果一个字段同时被NOT NULL和UNIQUE约束,该字段自动变成主键(oracle中不是!)

create table t_vip(
	id int(5),
	name varchar(32) not null unique
);
insert into t_vip values (1, 'zhangsan');
insert into t_vip values (2, 'zhangsan'); --报错,name不能重复
insert into t_vip(id) values (3);  --报错,name不能为null

2.1.3 主键约束PRIMARY KEY

主键约束相关术语:

  • 主键约束:就是一种约束
  • 主键字段:该字段上添加了主键约束,这样的字段叫主键字段
  • 主键值:主键字段中的每一个值
  • 主键的作用:
    主键是每一行记录的唯一标识,是每一行记录的身份证号
  • 主键的特征:
    not null+ unique(主键值不能为NULL,同时也不能重复)
  • 一张表主键约束只能添加一个
  • 主键值建议使用:int,bigint,char等类型,不建议使用varchar,主键一般都是数字,并且是定长的

给一张表中添加主键:

单一主键:
create table t_vip(
	id int(5),
	name varchar(32) primary key -- 列级约束,单一主键
);
insert into t_vip values (1, 'zhangsan');
insert into t_vip values (2, 'zhangsan'); --报错,name不能重复
insert into t_vip(id) values (3);  --报错,name不能为null

复合主键:在实际开发中不建议使用复合主键
create table t_vip(
	id int(5),
	name varchar(32),
	email varchar(255),
	primary key(id,name) -- 表级约束,用来给多个字段联合起来添加约束,叫复合主键
);
insert into t_vip values (1,'zhangsan','[email protected]');
insert into t_vip values (1,'lisi','[email protected]');--不报错,id和name都一样时才会报错

主键除了单一主键和复合主键的分类之外,还可以分为自然主键和业务主键
自然主键:主键值是一个自然数,和业务没关系
业务主键:主键值和业务紧密相关,例如拿银行卡号做主键值。
在实际开发中,自然主键使用较多,因为主键只需要做到不重复就行,不需要有意义,主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以不建议使用。

在MySQL中,有一种机制,可以帮我们自动维护一个主键值:auto_increment,表示自增,从1开始,以1自增

create table t_vip(
	id int(5) primary key auto_increment,
	name varchar(32)
);
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('zhangsan');

2.1.4 外键约束FOREIGN KEY

外键约束相关术语:

  • 外键约束:就是一种约束
  • 外键字段:该字段上添加了外键约束,这样的字段叫外键字段
  • 外键值:外键字段中的每一个值
  • 外键的作用:保证外键字段的值是有效的
  • 子表中的外键引用的父表中的某个字段,该字段不一定是主键,但至少得具有唯一性
  • 外键值可以为NULL
  • 一旦有外键约束,外键值就不能随便写了,它来自于父表中的某个字段中的值

设计数据库表,来描述班级和学生的信息
方案1:学生信息和班级信息放在同一张表中

NO NAME CLASSNO CLASSNAME
1 zhangsan 10 实验第一中学高三一班
2 jack 10 实验第一中学高三一班
3 lisi 10 实验第一中学高三一班
4 lilei 20 实验第一中学高三二班
5 hanmeimei 20 实验第一中学高三二班
6 wangwu 20 实验第一中学高三二班

以上方案的缺点:数据冗余,空间浪费
方案2:学生信息和班级信息放在不同的表中
班级表(父表):

classno classname
10 实验第一中学高三一班
20 实验第一中学高三二班

学生表(子表):

NO NAME CNO(外键)
1 zhangsan 10
2 jack 10
3 lisi 10
4 lilei 20
5 hanmeimei 20
6 wangwu 20

当cno字段没有任何的约束时,可能会导致存入无效的数据,比如存入30,单30班级并不存在。为了避免这种事情发生,保证cno字段中的值都是有效值,就需要给cno字段添加外键约束。那么,cno字段就是外键字段,cno中的每一个值都是外键值。
注意:

  • 删除表的顺序:先删子,再删父(父表的顺序要在子表中用)
  • 创建表的顺序:先创建父,再创建子
  • 删除数据的顺序:先删子,再删父
  • 插入数据的顺序:先插入父,在插入子

sql语句:

create table t_class(
	classno int primary key,
	classname varchar(32)
);
insert into t_class values (10,'实验第一中学高三一班'), (20,'实验第一中学高三二班');

create table t_student(
	no intint primary key auto_increment,
	name varchar(32),
	cno int,
	foreign key(cno) references t_class(classno)
);

insert into t_student(name,cno) values ('zhangsan',10),('jack',10),('lisi',10),('lilei',20),('hanmeimei',20),('wangwu',20);

如果改成不存在的值,会报错:
MySQL数据库基础知识(二)_第1张图片

你可能感兴趣的:(笔记,数据库,mysql,java)