1.建表的语法格式:
create table 表名(字段名1 数据类型,字段名2 数据类型,...,字段名n 数据类型);
表名:建议以t_或者tbl_开始,可读性强,见名知意
字段名:见名知意即可
表名和字段名都属于标识符。
命名规范:所有的标识符全部都是小写,单词执念用下划线进行衔接
建表时varchar和char类型必须有长度,不然会报错。
例:
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流才行 |
drop table tablename;-- 如果表不存在会报错
drop table if exists tablename;
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(),(),(),();
语法格式:
UPDATE 表名 set 字段名1=值1,字段名2=值2,字段名3=值3...where 条件;
注意:没有条件限制会导致所有数据全部更新,所以记得加where条件。
例如:
update t_user set id=1, name='jack' where name = 'zhangsan'; --将名字叫zhangsan的改为jack
语法格式:
delete from 表名 where 条件;
注意:没有条件会删除整张表所有的数据。
例如:
delete from t_user where id =1;
基本不用
约束:constraint
在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性,有效性,约束就是为了保证表中的数据有效。
非空约束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语句会全部执行!
唯一性约束的字段不能重复,但是可以都为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);-- 不报错
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都一样时才会报错
在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
主键约束相关术语:
给一张表中添加主键:
单一主键:
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');
外键约束相关术语:
设计数据库表,来描述班级和学生的信息
方案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);