创建表:
建表的语法格式:(建表属于DDL语句,DDL包括: create, drop, alter)
方式1:
create table 表名(字段名1 数据类型,字段名2,数据类型,字段名3,数据类型);
表名:建议以t_或者tbl_开始,可读性强,顾名思义
字段名:顾名思义
表名和字段名都属于标识符
数据类型:
其实在MySQL中包含了很多数据类型,但是我们只需要掌握一些常见的即可
char(最长255): 定长字符串
在上述实例中,我们规定名字的字段为10个字符,但是现在传入的Jack只有4个字符,由于char是定长字符长,因此即使传入的对象的字段小于10个,他依然会开辟10个内存空间大小,剩下未被占据的空间,将有空格补充
varchar(最长255): 可变长度的字符串
举例:
上述实例中,我们规定名字的字段为10个字符,但是现在传入的实例对象“jack”只有4个字符,那么此时varchar就会动态的分配4个字符的内存空间
对比于char,varchar的优点在于它比较智能,能够根据实际的数据长度动态分配空间,在一定程度上节省了空间,而char不论实际的数据长度是多少,都会分配定义时的固定长度去存储数据,使用不恰当的时候,可能会导致空间的浪费
既然如此,char就没有一丁点的好处吗?
当然不是,varchar虽然有那么多的优点,但是它有一个很大的缺点就是需要动态分配空间,速度慢,而char因为不需要动态分配内存空间,所以速度会比较快一些
那么他们二者该如何选择呢?
根据实际字段灵活变通
举例:
性别只包含两种:男or女,那么我们对于性别字段当然是选char,大可不必选择varchar
再比如名字字段,我们就必须选择varchar,因为它的长度并不是固定不变的
int(最长11):数字中的整数型,等价于Java中的int
bigint:数字中的长整形,等价于Java中的long
float:单精度浮点型数据
double:双精度浮点型
date:短日期类型
datetime:长日期类型
clob:字符串大对象
最多可以存储4G的字符串,比如:存储一篇文章,存储一个说明,超过255个字符的都需要使用该对象存储
blob:二进制大对象
专门用来存储照片声音,视频等流媒体数据
往blob类型的字段上插入数据的时候,例如插入一个图片,视频等,必须使用IO流才能完成
举例;
create table student1 ( id int, name varchar(10), age int(3), sex char(1), email varchar(255) );
执行该命令后左边刷新:
删除表:
-- 建议采用第二种方式删除表 -- 第一种: drop table t_student;-- 当这张表不存的时候会报错 -- 第二种 drop table if exists t_student ;-- 如果这张表存在,删除
插入数据:
语法格式:
-- 字段名和值需要一一对应,数量和数据类型都要相互对应 insert into 表名(字段名1,字段名2,字段名3......) values(值1,值2,值3);
举例:
-- 完整插入 insert into student1 (id,name,age,sex,email) values(21100,'张三',10,'男','3242841279@qq.com');
查询结果:
-- 部分插入 insert into student1 (id) values(21100);
查询结果:
上述的部分插入,将数据成功插入了指定的字段id中,那么我们是否可以用同样的方法,将名字也插入呢?
insert into student1 (name) values('jack');
查询结果如下:
名字并没有成功插入我们上一条记录中的名字字段中,而是产生了一条新的记录
由此我们可以得出一个结论,insert语句但凡是执行成功了,那么必然会多一条记录,没有给其他字段指定字段值的话,默认值是NULL
修改默认值NULL:
修改某个字段的默认值:default
举例:
email varchar(255) default "无"
查询结果:
省略insert后面的字段名:
如果要省略字段名进行数据的插入,那么必须将数据与字段对应起来
,比如第一个字段是id,那么你传输的第一个数据就必须需是id的值,顺序是不能颠倒的
insert into student2 values(2,"张三",18,'男',"75986@qq.com");
不能传入单个字段的数据,例如下述所举例的这种就是不可以的
insert into student2 values(2);
insert插入日期:
MySQL给出了一种函数:str_to_data()函数:
不过需要注意的是,该函数并不是专门的日期插入函数,而是将字符串转换为日期格式
语法格式:
str_to_date('字符串日期','日期格式')
MySQL的日期格式:
%y---年 %m---月 %d---日 %h---时 %i---分 %s---秒
举例:
insert into t_user(id,name,birth)values(21100234,张三,str_to_date('12-1900-1','%m-%Y-%d'));
但并不是所有的日期在插入的时候需要使用该函数进行转换,当你所插入的日期恰好满足%m-%Y-%d时,此时该字符串会被自动转换成日期类型
举例:
insert into t_user(id,name,birth)values(21100234,'张三','1999-12-1');
以默认格式显示日期:
举例:
select id,name,birth as birth from t_user;
查询结果:
以特定格式显示日期:
使用date_format()函数
举例:
select id,name,date_format(birth,'%m/%d/%y') as birth from t_user;
查询结果:
date和datetime的区别:
date是短日期:只包括年月日信息
MySQL默认短日期格式:%y-%m-%d
datetime是长日期:包括年月日时分秒信息
MySQL默认长日期格式:%y-%m-%d %h:%i:%s
获取系统当前时间:
now()函数
在定义时,应设置为datetime类型的,这样才能够精准的获取当前系统时间
修改表中的数据:update[DML]
语法格式:
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3......where 条件;
注意:没有条件限制会导致所有数据全部更新
举例:
- 将id号为10的学生的姓名改变为"jason",年龄改变为10岁,生日改变为2000-10-10 update student set name='jason',age=10,birth='2000-10-10' where id=10;
注意:日期的格式在输入时,必须按照MySQL默认的格式来写
删除数据:delete[DML]
语法格式:
delete from 表名 where 条件;
注意:如果没有条件限制,整张表的数据会全部被删除
举例:
-- 删除student表中id为2的这条记录 delete from student from id=2; -- 删除student表中的所有数据 delete from student;
上述这种删除数据的方式:执行效率比较慢,表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放,因此它支持回滚,可以通过rollback;命令恢复已被删除的数据;
truncate语句:[DDL]
删除数据的效率比较高,表被一次截断,数据在硬盘上的真实存储空间也会得到释放,但是它并不支持回滚,数据一旦被删除就无法恢复
语法:
truncate table 表名;
上述所说的delete和truncate,都是删除表中的数据,而表结构并没有被删除
,而下述的这种方法才是将表结构都给删除了
drop table 表名; //删除表,将表中的数据连同表结构一起删除
插入数据:insert[DML]
语法格式:
插入单条数据:
insert into 表名(字段1,字段2,字段3....)values(值1,值2,值3......);
插入多条数据:
语法格式:
insert into 表名(字段1,字段2,字段3....) values (值1,值2,值3......),(值1,值2,值3......),(
快速创建表:
语法格式:
-- 将as后的查询结果当做要创建的新表 create table 表名 as select.....;
这可以完成表的快速复制
,表在创建的瞬间,表中的数据也存在了
将查询结果插入到一张表当中:
-- 将select语句的查询结果插入到student表中 insert into student select......;
约束:
在创建表的时候,,我们可以给表中的字段增加一些约束,来保证这个表中数据完整性,有效性
非空约束:not null
举例:
当我们在创建表的时候,对于名字字段增加了约束条件不能为空,因此,当给该表插入数据时,名字部分的数据不能是空的
注:该约束只有列级约束,并没有表级约束
create table teacher( id int, name varchar(255) not null );
小tip:xxxx.sql这种文件被称为sql脚本文件
sql脚本文件中编写了大量的sql语句,当我们执行sql脚本文件时,该文件中所有的sql语句都会被执行,如果想要批量的执行sql脚本文件,那么在MySQL中可通过source D:\course\03-Mysql\document\xxx.sql命令
唯一性约束:unique
唯一性约束的字段不能重复,但是可以为null
举例:
当我们在创建表的时候,对于id字段增加了约束条件不能为空,因此,当给该表插入数据时,id字段的数据不能重复
create table person( id int unique, age int, );
两个字段联合起来具有唯一性:
假设我们要求表中的name和email联合起来具有唯一性:
错误写法:
create table t_vip( id int, name varchar(255) unique, -- 约束添加到某个字段后面的约束属于列级约束 name varchar(255) unique, );
上述这种创建表是不符合我们的需求的,因为这样创建出来的表的含义是:email具有唯一性,name具有唯一性
那么对于下面将要插入表中的两组数据来说,并不能成功插入,原因是名字字段重复了
但是我们的需求是email+name联合具有唯一性即可,也就是说下面的两组数据,虽然名字字段重复,但是email字段并不重复,所以它们联合起来也是不重复的,理论上应该是可以插入数据的,因此上述这种创建表的方式是错误的
insert into t_vip(id,name,email) values(1,'张三','zhangsan@123.com'); insert into t_vip(id,name,email) values(1,'张三','zhangsan@sina.com');
正确写法:
create table t_vip( id int, name varchar(255), name varchar(255), unique(name,email), //这种没有添加到某个列级后面的约束属于表级约束 );
此时才表示email+name唯一
当多个字段联合起来需要添加约束时,适用表级约束,单个字段需要添加约束,适用列级约束
not null和unique联合使用:
举例:
create table t_vip( id int, name varchar(255) not null unique -- 表示name字段既不能为空,也不能重复 );
我们查看t_vip表结构,发现name字段变成了主键