create table 表明(字段名1 数据类型,字段名2 数据类型)
表明和字段名都是标识符
字符类型 | 含义 | 例子 |
---|---|---|
varchar | 可变长度的字符串 | 根据传来数据的实际长度分配空间,节省空间,但是速度慢,最长255 |
char | 定长字符串 | 不管实际数据长度,都分配固定长度的空间去存储数据,使用不恰当会导致空间浪费,但速度快,如性别字段就可以固定,最长255 |
int | 整数型 | 最长11位 |
bigint | 长整型 | |
float | 单精度浮点 | |
double | 双精度浮点 | |
date | 短日期 | 只包括年月日,默认格式:%Y-%m-%d |
datatime | 长日期 | 包括年月日、时分秒默认格式:%Y-%m-%d %h:%i:%s |
clob | 字符大对象 | 最高4G字符串(文章简介等),超过255字符的,用其存储对象 |
blob | 二进制大对象 | 专门用来存储声音、视频等流媒体数据 |
create table t_student(
no int,
name varchar(10),
sex char(1),
age int(3),
email varchar(255)
);
create table t_student( no int,name varchar(10),sex char(1),age int(3),email varchar(255));
drop table 表名;//当这张表不存在时会报错
drop table if exists 表名 ;//如果这张表存在删除
create table t_student(
no int,
name varchar(10),
sex char(1) default ‘m’;
age int(3),
email varchar(255)
);
insert 语句只要执行成功必然会多一条记录,没有给其他字段指定值,则默认值是null
语法格式:
insert into 表名(字段名1,字段名2.。。) values(值1,值2.。。)
insert语句中字段名可以省略,但是全省略等于都写上了,所以值要全部写上
insert into t_student (no,name,sex,age,email) values(12,‘wqww’,‘m’,23,‘wsqwswqdx@122’);
str_to_date:将字符串转换为date
date——format:将date类型转换成varchar字符串类型
str_to_date("字符串日期’,'日期格式’)
mysql的日期格式
%Y 年
%m月
%d日
%h时
%i分
%s秒
create table t_user(
birth date
);
insert into t_user(birth) values(str_to_date(‘01-10-1990’,‘%d-%m-%Y’));
mysql> select * from t_user;
+------------+
| birth |
+------------+
| 1990-10-01 |
| 1990-10-01 |
+------------+
注:如果提供的日期字符串是以下格式则不用写str_to_date函数
%Y-%m-%d
date_format(‘’日期类型数据‘’,‘’日期格式‘’)
通常使用在设置展示的日期格式时使用。
获取系统当前时间now(),且获取时间带有时分秒信息,是datetiome类型的
如果只获取当前的年月日,不要时分秒用**CURDATE() **函数
insert into t_user(id,name,birth,creat_time) values(2020,‘rng’,‘2012-10-1’,now());
语法:
insert into 表名(字段1,z字段2) values(),(),();
insert into t_user(id,name,birth,creat_time) values(2011,'dk','2020-1-1',now()),(2012,'v5','2022-3-6',now());
+------+------+------------+---------------------+
| id | name | birth | creat_time |
+------+------+------------+---------------------+
| 2020 | rng | 2012-10-01 | 2022-03-12 12:24:20 |
| 2011 | dk | 2020-01-01 | 2022-03-12 12:30:58 |
| 2012 | v5 | 2022-03-06 | 2022-03-12 12:30:58 |
+------+------+------------+---------------------+
create dept_bak select * from dept;
insert into dept_bak select * from dept
mysql> select * from dept_bak;
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
8 rows in set (0.00 sec)//有8条记录了,没插入之前复制dept表只有4条记录
在MySQL中,创建触发器语法如下:
CREATE TRIGGER trigger_name
trigger_time trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
其中:
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句,每条语句结束要分号结尾。
【NEW 与 OLD 详解】
MySQL 中定义了 NEW 和 OLD,用来表示
触发器的所在表中,触发了触发器的哪一行数据。
具体地:
在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
使用方法: NEW.columnName (columnName 为相应数据表某一列名)
作用:监视某种情况,并触发某种操作
很多人都不提倡使用触发器,因为这是一个隐藏的过程不好管理。
语法格式:
uodate 表名 set 字段名1=值1,字段名2=值2…where 条件;
注:若没有条件限制泽会导致数据全部更新
更改前
mysql> select * from t_student;
+------+------+------+------+---------------+
| no | name | sex | age | email |
+------+------+------+------+---------------+
| 12 | wqww | m | 23 | wsqwswqdx@122 |
+------+------+------+------+---------------+
update t_student set no=123,age=18 where name=‘wqww’;
更改后
mysql> select * from t_student;
+------+------+------+------+---------------+
| no | name | sex | age | email |
+------+------+------+------+---------------+
| 123 | wqww | m | 18 | wsqwswqdx@122 |
+------+------+------+------+---------------+
1 row in set (0.00 sec)
mysql可以使用的语法,其他的不行
rename table这个SQL语句来修改表名的基本语法是:
RENAME TABLE <旧表名> TO <新表名>;
sqlite 用下面的语法
alter table titles_test rename to titles_2017;
缺点:删除效率比较低
语法格式
delete from 表名 where 条件;
注:如果不加条件会删除所有记录
delete * from t_user;
delete from t_user where id=2;
creat table emp2 as select *from emp;
将select *from emp查询出来的表当做一张新表存进去
缺点:不支持回滚,无法恢复
truncate table dept_bak;
rollback://rollback后任然为empty,所以无法回滚
大表进行删除用delete删1h才能删完,效率较低,用truncate删除只需要不到1s。
删除之前询问是否真的删除,警告删除之后不可恢复。
注意:drop table 表名不是删除表中数据,是把一整个表删除,truncate是删除表数据,表还在。
在实际的开发中一旦需求确定之后,很少对表结构进行修改,因为开发进行中的时候修改表结构成本较高
在创建表时对表中字段加入约束,保证表中数据的完整性和有效性。
非空约束 :not null
唯一性约束:unique
主键约束:primary key(简称:PK)
外键约束:foreign key
检查约束:check(mySQL不支持,oracle支持)
约束字段不能为空
create table t_vip(id int, name varchar(11) not null);
insert into t_vip(id,name) values(12,'lisi');
mysql> insert into t_vip(id) values(12);//此时报错,name字段不能为空
ERROR 1364 (HY000): Field 'name' doesn't have a default value
unique
约束的字段不能重复,但是可以为null,null不算重复
drop table if exists t_vip;
create table t_vip(id int, name varchar(10) unique,email varchar(255));
insert into t_vip(id,name,email) values(10000,'lisi','[email protected]');
insert into t_vip(id,name,email) values(10200,'lisi','182828');//执行该语句报错
ERROR 1062 (23000): Duplicate entry 'lisi' for key 'name'
drop table if exists t_vip;
create table t_vip(id int, name varchar(10) ,email varchar(255),unique(name,email));
insert into t_vip(id,name,email) values(10000,'lisi','[email protected]');
insert into t_vip(id,name,email) values(10000,'lisi','[email protected]');
+-------+------+---------------+
| id | name | email |
+-------+------+---------------+
| 10000 | lisi | [email protected] |
| 10000 | lisi | [email protected] |
+-------+------+---------------+
约束添加在列后面的较列级约束,约束没有加在列后面的叫表级约束,如多个字段联合起来约束就是表级约束 not null没有表级约束
drop table if exists t_vip;
create table t_vip(id int, name varchar(10) ,email varchar(255) not null unique);
mysql> desc t_vip;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
| email | varchar(255) | NO | PRI | NULL | |
+-------+--------------+------+-----+---------+-------+
source=“文件路径”
主键约束相关术语
主键约束:是一种约束
主键字段:该字段上添加了主键约束的字段
主键值:主键字段上的每一个值就叫做主键值
主键值是每一行记录的唯一标识,是每一行记录的身份证号!!
任何一张表都应该有主键,没有主键,表无效!!
如何给一张表添加主键约束?
drop table if exists t_vip;
create table t_vip(id int primary key,name varchar(20));
insert into t_vip(id,name) values(12345,‘‘rng’)
drop table if exists t_vip;
create table t_vip(id int ,name varchar(20),primary key(id));
insert into t_vip(id,name) values(12345,‘‘rng’)
一个字段做主键叫做单一主键,两个字段做主键叫做复合主键,但是在实际开发中不建议使用复合主键,单一主键就可以达到身份标识的作用,效果达到即可
drop table if exists t_vip;
create table t_vip(id int ,name varchar(20),primary key(id,name))
是不可以的,一张表主键约束只能添加一个,复合主键的约束也只有一个,也就是说也只写了一个primary key
//错误:主键不能重复
drop table if exists t_vip;
create table t_vip(id int primary key,name varchar(20)primary key);
int
bigint
char等类型
主键值一般都是数字,都是定长的
自然主键:主键值是一个自然数,和业务没关系,尽量使用自然主键
业务主键:主键值和业务紧密联系,如银行卡账号
在实际生活中使用自然主键使用较多,因为主键只要做到不重复即可,主键一旦和业务挂钩,当业务发生变动的时候可能会影响到主键值
drop table if exists t_vip;
create table t_vip(id int primary key auto_increment,name varchar(20));
insert into t_vip(name) values(‘lisi’);
insert into t_vip(name) values(‘lisi’);
mysql> select * from t_vip;
+----+------+
| id | name |
+----+------+
| 1 | lisi |
| 2 | lisi |
+----+------+
外键约束:一种约束,限制可以添加的有效约束范围
外键字段:该字段上添加了外键约束
外键值:外键字段上的每一个值
业务背景:请设计数据库表来描述班级和学生的信息
存在一张表中是可以的
缺点:数据冗余,空间浪费,设计失败
t_class 班级表
class(pk) classname
100 高三1班
101 高三2班
t_student学生表
no(pk) name cno(班级编号)【FK引用t_class这张表的classno】
————————————————————
1 jack 100
2 jim 100
3 pik 101
当cno字段没有任何约束的时候可能导致数据无效,例如如果是102的话,但是102班级是不存在的,所以需要给cno添加外键约束,保证这个字段只有100和101
当我们设置外键约束之后我在学生表中输入的班级数据,就必须是班级表中存在的数据
drop table if exists t_student;
drop table if exists t_class;
create table t_class(classno int primary key,classname varchar(255));
create table t_students(no int primary key auto_increment,name varchar(255),cno int,foreign key(cno) references t_class(classno));