表
表的创建
-
建表的语法格式:(DDL语句,DDL包括:create drop alter)
create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型); create table 表名( 字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型 );
数据类型
-
varchar(最长255,这里的255表示可以储存255个字符)
- 可变长度的字符串
- 会根据实际的数据长度来动态分配空间
- 优点:节省空间 缺点:需要动态分配空间,速度慢
-
char(最长255)
- 定长字符串
- 分配固定长度的空间去存取数据
- 优点:不需要动态分配空间,速度快 缺点:使用不恰当会导致空间的浪费
-
int(最长11)
数字中的整数型,等同于Java的int
-
bigint
数字中的长整型,等同于Java中的long
-
float
单精度浮点型数据
-
double
双精度浮点型数据
-
date
短日期类型,包括年月日
-
datetime
长日期类型,包括年月日还有时间的分秒信息
-
clob
字符大对象,比如存储一篇文章,超过255个字符的都要采用clob字符大对象来存储
-
blob
二进制大对象,专门用来存储图片,声音,视频等流媒体数据
创建一个学生表
要求:储存学生的学号、姓名、年龄、性别、邮箱地址的信息
create table student(
sno int,
sname varchar(32),
age int,
sex char(1),
email varchar(255)
);
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+-----------------+
| Tables_in_my_db |
+-----------------+
| dept |
| emp |
| salgrade |
| student |
+-----------------+
删除表:drop table student;//当这张表不存在的时候会报错
-
快速创建一个表:
create table emp2 as select * from emp; 原理: 将一个查询结果当做一张表新建!!!!! 这个可以完成表的快速复制!!!! 表创建出来,同时表中的数据也存在了!!!
插入数据 insert(DML)
- 语法格式:
insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3...);
- 字段名(属性名)和值要一一对应。数量要对应,数据类型也要对应
insert
into student(sno,sname,age,sex,email)
values(1,'zhangsan',18,'m','zhangsan@123');
+------+----------+------+------+--------------+
| sno | sname | age | sex | email |
+------+----------+------+------+--------------+
| 1 | zhangsan | 18 | m | zhangsan@123 |
+------+----------+------+------+--------------+
//插入的字段的数据不一定和表的顺序一样
insert
into student(sname,sno,sex,age,email)
values('lisi',1,'m',20,'lisi@123');
+------+----------+------+------+--------------+
| sno | sname | age | sex | email |
+------+----------+------+------+--------------+
| 1 | zhangsan | 18 | m | zhangsan@123 |
| 1 | lisi | 20 | m | lisi@123 |
+------+----------+------+------+--------------+
//也可以插入一个字段的数据,但是其他字段会取默认值,如果默认值没有指定就取null
insert
into student(sname)
values('wangwu');
+------+----------+------+------+--------------+
| sno | sname | age | sex | email |
+------+----------+------+------+--------------+
| 1 | zhangsan | 18 | m | zhangsan@123 |
| 1 | lisi | 20 | m | lisi@123 |
| NULL | wangwu | NULL | NULL | NULL |
+------+----------+------+------+--------------+
//当字段名全部省略的时候,每条数据都需要插入数据,并且插入的顺序和建表时的顺序一样
insert
into student()
values(1,'zhaoliu',18,'m','zhaoliu@123');
+------+----------+------+------+--------------+
| sno | sname | age | sex | email |
+------+----------+------+------+--------------+
| 1 | zhangsan | 18 | m | zhangsan@123 |
| 1 | lisi | 20 | m | lisi@123 |
| NULL | wangwu | NULL | NULL | NULL |
| 1 | zhaoliu | 18 | m | zhaoliu@123 |
+------+----------+------+------+--------------+
-
插入多条数据
语法:insert into 表名(字段名1,字段名2…) values(),(),()…();
insert into student(sno,sname) values (2,'as'), (3,'df'), (4,'hg'); +------+----------+------+------+--------------+ | sno | sname | age | sex | email | +------+----------+------+------+--------------+ | 1 | zhangsan | 18 | m | zhangsan@123 | | 1 | lisi | 20 | m | lisi@123 | | NULL | wangwu | NULL | NULL | NULL | | 1 | zhaoliu | 18 | m | zhaoliu@123 | | 2 | as | NULL | NULL | NULL | | 3 | df | NULL | NULL | NULL | | 4 | hg | NULL | NULL | NULL | +------+----------+------+------+--------------+
-
插入子查询结果
语法格式:
insert
into 表名(字段1…)
子查询insert into student(sno,sname) select empno,ename from emp;
-
补充知识点:
如何设置默认值:
drop table if exists t_student; create table t_student( no int, name varchar(32), sex char(1) default 'm',//sex的默认值为m age int(3), email varchar(255) );
插入日期数据
关于日期数据处理的两个函数
str_to_date:将字符串varchar类型转换成date类型
date_format:将date类型转换成具有一定格式的varchar字符串类型。
创建一个famliy表
create table family(
name varchar(4),
birth date);
插入数据
insert
into family(name,birth)
values('zhangsan','01-10-1999');
报错,原因是类型不匹配。数据库birth是date类型,这里给了一个字符串varchar。
-
插入日期有两种方式
使用str_to_date函数语法格式:str_to_date(‘字符串日期’, ‘日期格式’)
mysql的日期格式:
%Y 年//注意这里的Y是大写Y
%m 月
%d 日
%h 时
%i 分
%s 秒
insert
into family(name,birth)
values('zs',str_to_date('01-10-1999','%d-%m-%Y'));
+------+------------+
| name | birth |
+------+------------+
| zs | 1999-10-01 |
+------+------------+
如果输入的字符串日期格式为%Y-%m-%d,就不用str_to_date函数,系统会自动类型转换
insert
into family(name,birth)
values('li','2000-09-09');
+------+------------+
| name | birth |
+------+------------+
| zs | 1999-10-01 |
| li | 2000-09-09 |
+------+------------+
-
查询的时候可以以某个特定的日期格式显示
date_format这个函数可以将日期类型转换成特定格式的字符串。
date_format(日期类型数据, ‘日期格式’)
select name,date_format(birth, '%m/%d/%Y') as birth from family; +------+------------+ | name | birth | +------+------------+ | zs | 10/01/1999 | | li | 09/09/2000 | +------+------------+
-
date和datetime两个类型的区别
date是短日期:只包括年月日信息。
datetime是长日期:包括年月日时分秒信息。mysql短日期默认格式:%Y-%m-%d
mysql长日期默认格式:%Y-%m-%d %h:%i:%s -
获取当前系统时间
now() 函数,并且获取的时间带有:时分秒信息!!!!是datetime类型的
insert into family(name,birth) values('lisi',now()); +------+------------+ | name | birth | +------+------------+ | zs | 1999-10-01 | | li | 2000-09-09 | | lisi | 2021-10-19 | +------+------------+
修改数据(update DML)
-
语法格式:
update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3… where 条件;update family set name='ww' where name='zs'; +------+------------+ | name | birth | +------+------------+ | ww | 1999-10-01 | | li | 2000-09-09 | | lisi | 2021-10-19 | +------+------------+
-
注意:没有条件限制会导致所有数据全部更新。
删除数据(delet DML)
-
语法格式:
delete from 表名 where 条件;修改满足where的元组(记录)
-
注意:没有条件,整张表的数据会全部删除
delete from family where name='lisi';
+------+------------+
| name | birth |
+------+------------+
| ww | 1999-10-01 |
| li | 2000-09-09 |
+------+------------+
delete from family;//删除所有记录
mysql> select * from family;
Empty set (0.00 sec)
-
带子查询的修改语句
where 后面可以有子查询
-
如何快速删除表中的数据
- delete语句删除数据的原理:
- 表中的数据虽然删除了,但是数据存储的空间没有被释放
- 缺点:删除效率比较低
- 优点:支持回滚(可以恢复数据)
- truncate语句(DDL)删除数据的原理:
- 语法:truncate table 表名;
- 表中的数据和数据所占的空间都被删除了
- 缺点:不支持回滚
- 优点:效率高
- delete语句删除数据的原理:
-
无论是delete还是truncate只是三处表中的数据而不是删除表