表的创建(建表)
建表的语法格式:(建表属于DDL语句,DDL包括:oreate drop alter)
create table 表名(
字段名1 数据类型,
字段名2 数据类型,
字段名3 数据类型
);
表名:建议以t_或者tbl_开始,可读性强。
字段名:见名之意
关于mysql中的数据类型
很多数据类型,我们只需要掌握一些常见的数据类型即可。
varchar(最长255)
可变长度的字符串
比较只能,节省空间
会根据实际的数据长度动态分配空间
优点:节省空间
缺点:需要动态分配空间,速度慢。
char:(最长255)
定长字符串
不管实际的数据行的长度是多少
分配固定长度的空间去存储数据
使用不恰当的时候,可能会导致空间的浪费
优点:不需要动态分配空间,速度快
缺点:使用不当可能会导致空间的浪费
varchar和char我们应该怎么选择
性别字段选什么?因为性别是固定长度的字符串,所以选择char
姓名字段选什么?每个人的名字长度不同,所以选择varchar
int(最长11)
数字中的整数型。等同于java的int
bigint
数字中的长整型。等同于java的long
float
单精度浮点型数据
double
双精度浮点型数据
date
短日期类型
datetime
长日期类型
clob
字符串大对象
最多可以存储4G字符串
比如:存储一篇文章,存储一个说明
超过255个字符的都要采用CLOB字符大对象来存储
character largr OBject:CLOB
blob
二进制大对象
Binary large OBject
专门用来存储图片、声音、视频等流媒体数据
往BLOB类型的字段上插入数据的时候,例如插入一个图片,视频等,
你需要使用IO流才行
创建一个学生表
学号、姓名、年龄、性别、邮箱地址
create table t_student(
no int,
name varchar(32),
sex char(1),
age int(3),
email varchar(255)
);
删除表:drop 表+表名
drop table t_student; //当这张表不存在的时候用这个语句会报错
如果这张表存在的话,删除
drop table if exists t_student; //即使已经删除也不会报错
插入数据insert(DML)
语法格式:
insert into 表名(字段1,字段2,字段3...)values(值1,值2,值3);
注意:字段名和值要一一对应,什么是一一对应
数量要对应,数据类型要对应
insert into t_student(no,name,sex,age,email)values(1,'zhangsan','m',20,'zhangsan@123.com');
insert into
t_student(email,name,sex,age,no) values('lisi@123.com','lisi','f',20,2);
insert into
t_student(no) values(3);
注意:insert语句但凡是执行成功了,那么必然会对一条记录
没有给其他字段指定值的话,默认值是null.
drop table if exists t_student;
create table t_student(
no int,
name varchar(32),
sex char(1) default 'm',指定值m
age int(3),
email varchar(255)
);
Field Type Null Key Default Extra
-------+--------------+------+-----+---------+-------+
nol int(11) YES NULL
nanei varchar(32)YEs NULL
sexl char (1) YEs m
age int (3) YES NULL
iemail varchar(255)YEs NULL
------------------------------------------
insert into t_student(no) values(1);
select * from t_student;
no name sex age email
—----+------+------+------+-------
1 NULL m NULL NULL
insert语句中的“字段名”可以省略吗?可以
insert into t_student values(2); //错误的
//注意:前面的字段名胜利的说,等于都写上了,所以值都要写上。
insert into t_student values(2,'lisi','f',20,'lisi@123.com');
insert插入日期
数字格式化:format
select ename,sal from emp;
格式化数字:format(数字,‘格式’)
select ename,format(sal,'$999,999')as sal from emp;
str_to_date:将字符串varchar类型转换成date类型
date_format:将date类型转换成具有一定格式的varchar字符串类型。
create table t_user(
id int,
name varchar(32),
birth char(10) //生日可以使用字符串
);
create table t_user(
id int,
name varchar(32),
birth date //生日可以使用date日期类型
);
desc t_user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| birth | char(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
插入数据:
insert into t_user(id,name,birth) values(1,'zhangsan','01-10-1990'); //1990年10月1日
出问题l:原因是类型不匹配,数据库birth是tate类型,这里给了一个字符串varchar.
可以使用str_to_date函数进行类型转换
str_to_date函数可以将字符串转换成日期类型date?
语法格式:
str_to_date('字符串日期','日期类型')
mysql的日期格式:
%Y 年
%m 月
%d 日
%h 时
%i 分
%s 秒
insert into t_user(id,name,birth) values(1,'zhangsan',str_to_date('01-10-1990'));
str_to_date函数可以把字符串varchar转换成日期date类型数据,
通常使用在插入insert方面,因为插入的时候需要一个日期类型的数据
需要通过该函数将字符串转换成date.
好消息?
如果你提供的日期字符串是这个格式,str_to_date函数就不需要了
%Y-%m-%d
insert into t_user(id,name,birth) values(2,'lisi','1990-10-01');
查询的时候可以以某个特定的日期格式展示吗?
date format
这个函教可以将日期类型转换成特定格式的字符串。
select id,name,date_format(birth,'%m/%d/%Y') as birth from t_user;
+------+----------+------------+
| id | name | birth |
+------+----------+------------+
| 1 | zhangsan | 00/00/0000 |
| 2 | lisi | 10/01/1990 |
| 2 | lisi | 10/01/1990 |
+------+----------+------------+
date_fornat的数怎么用?
date format(日期类型数据,·日期格式)
这个函数通常使用在查询日期方面。设置展示的日期格式.
select id,name,birth from t_user;
+------+----------+------------+
| id | name | birth |
+------+----------+------------+
| 1 | zhangsan | 0000-00-00 |
| 2 | lisi | 1990-10-01 |
| 2 | lisi | 1990-10-01 |
+------+----------+------------+
以上的sQL语句实际上是进行了默认的日期格式化,
自动将薮据库中的date类型转换成varchar类型。
并且采用的格式是mysql默认的日期格式:'%Y-%m-ad'
select id,name,date_format(birth ,'%Y/%m/%d') as birth from t_user;
+------+----------+------------+
| id | name | birth |
+------+----------+------------+
| 1 | zhangsan | 0000/00/00 |
| 2 | lisi | 1990/10/01 |
| 2 | lisi | 1990/10/01 |
+------+----------+------------+
date和datetime两个类型的区别?
date是短日期:只包括年月日信息-
datetime是长日期:包括年月日时分秒信息。
drop table if exists t_user;
create table t_user (
id int,
name varchar(32),
birth date,
create_time datetime
);
id是整数
name是字符串birth是短日期
create_time是这条记录的创建时间:长日期类型
mysgl短日期默认格式:号Y一名m-%d
mysql长日期默认格式:%Y-%m-%d sh: %i :名s
insert into t_user(id,name,birth,create_time)values(1,'zhangsan','1990-10-01','2020-03-18 15:49:50');
mysql> select * from t_user;
+------+----------+------------+---------------------+
| id | name | birth | create_time |
+------+----------+------------+---------------------+
| 1 | zhangsan | 1990-10-01 | 2020-03-18 15:49:50 |
+------+----------+------------+---------------------+
在mysql当中怎么获取系统当前时间?
now()函数,并且获取的时间带有:时分秒信息!!!!是datetime类型的。
insert into t_user(id,name,birth,create_time)values(2,'lisi','1991-10-01',now());
mysql> select * from t_user;
+------+----------+------------+---------------------+
| id | name | birth | create_time |
+------+----------+------------+---------------------+
| 1 | zhangsan | 1990-10-01 | 2020-03-18 15:49:50 |
| 2 | lisi | 1991-10-01 | 2021-11-28 14:04:01 |
+------+----------+------------+---------------------+
修改update (DML)
语法格式:
update表名set字段名1=值1,字段名2=值2,字段名3-值3... where 条件;注意:没有条件限制会导致所有教据全部更新-
update t_user set name = 'jack' , birth = '2000-10-11' where id = 2; //将id2改为jack
+------+----------+------------+---------------------+
| id | name | birth | create_time |
+------+----------+------------+---------------------+
| 1 | zhangsan | 1990-10-01 | 2020-03-18 15:49:50 |
| 2 | jack | 2000-10-11 | 2021-11-28 14:04:01 |
+------+----------+------------+---------------------+
update t_user set name ='jack',birth = '2000-10-11',create_time=now() where id = 2;
mysql> select * from t_user;
+------+----------+------------+---------------------+
| id | name | birth | create_time |
+------+----------+------------+---------------------+
| 1 | zhangsan | 1990-10-01 | 2020-03-18 15:49:50 |
| 2 | jack | 2000-10-11 | 2021-11-28 14:07:21 |
+------+----------+------------+---------------------+
删除数据 delete (DML)
语法格式?
delete from表名where条件;
注意:没有条件,整张表的数据会全部删除!
delete from t_user where id=2; //删除id=2的数据
mysql> select * from t_user;
+------+----------+------------+---------------------+
| id | name | birth | create_time |
+------+----------+------------+---------------------+
| 1 | zhangsan | 1990-10-01 | 2020-03-18 15:49:50 |
+------+----------+------------+---------------------+
insert into t_user(id) values(2); 插入数据id类型为2
+------+----------+------------+---------------------+
| id | name | birth | create_time |
+------+----------+------------+---------------------+
| 1 | zhangsan | 1990-10-01 | 2020-03-18 15:49:50 |
| 2 | NULL | NULL | NULL |
+------+----------+------------+---------------------+
delete from t_user; //删除所有
insert(增) delete(删) update(改) select(查)
insert语句可以一次插入多条记录吗?可以的!
mysql> desc t_user;
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(32) | YES | | NULL | |
| birth | date | YES | | NULL | |
| create_time | datetime | YES | | NULL | |
+-------------+-------------+------+-----+---------+-------+
插入多条数据:
insert into t_user(id,name,birth,create_time)values
(1,'yinzhe','1997-11-18',now()),
(2,'zhenchen','1998-10-06',now()),
(3,'yzc','2013-06-27',now())
;
语法:insert into t_user(字段1,字段2,字段3) values(),(),();
mysql> select * from t_user;
+------+----------+------------+---------------------+
| id | name | birth | create_time |
+------+----------+------------+---------------------+
| 1 | yinzhe | 1997-11-18 | 2021-11-28 16:02:06 |
| 2 | zhenchen | 1998-10-06 | 2021-11-28 16:02:06 |
| 3 | yzc | 2013-06-27 | 2021-11-28 16:02:06 |
+------+----------+------------+---------------------+
快速创建表?
mysql> create table emp2 as select * from emp ;
原理:
将一个查询结果当做一张表新建!!!!!这个可以完成表的快速复制!! !!
表创建出来,同时表中的薮据也存在了!!!
快速删除表中的数据?
//删除dept bak表中的薮据
delete from dept _bak;门/这种删除数据的方式比较慢。
myscl> select * from dept_bak ;
Empty set (o.0o sec)
delete语句删除数据的原理?
表中的数据被删除了,但是这个数据在硬盘上的真实存储空间不会被释放!!!这种删除缺点是:删除效率比较低-
这种删除优点是:支持回滚,后悔了可以再恢复数据!!!
roollback回滚,删除后可恢复
truncate语句删除数据的原理?
这种删除效率比较高,表被一次截断,物理删除。
这种删除缺点:不支持回滚。
这种删除优点:快速。
用法: truncate table dept bak;(这种操作属于DDL操作。)
大表非常大,上亿条记录????
删除的时候,使用delete,也许需要执行1个小时才能删除完!效率较低。
可以选择使用truncate删除表中的数据。只需要不到1秒钟的时间就删除结束。效率较高.
但是使用truncate之前,必须仔细询问客户是否真的要删除,并警告删除之后不可恢复!
truncate是删除表中的数据,表还在。
删除表操作
drop table 表名;//这不是删除表中的数据,是把表删除
对表结构的增删改?
什么是对表结构的修改?
添加一个字段,删除一个字段,修改一个字段!! !
对表结构的修改需要使用:alter属于DDL语句
DDL包括: create drop alter
第一:在实际的开发中,需求一旦确定之后,表一旦设计好之后,很少的进行表结构的修改。因为开发进行中的时候,修改表结构,成本比较高。
修改表的结构,对应的java代码就需要进行大量的修改。成本是比较高的。
这个责任应该由设计人员来承担!
第二:由于修改表结构的操作很少,所以我们不需要掌握,如果有一天真的要修改表结构,你可以使用工具!! !!
修改表结构的操作是不需要写到java程序中的。实际上也不是java程序员的范畴。