操作数据库中的表 > 操作数据库中表 > 操作数据库中的表的数据
操作 | 命令 |
---|---|
创建数据库 | create database [if not exists] 数据库名称; |
删除数据库 | drop database [if exists] 数据库名称; |
使用数据库 | use 数据库名称; |
查看数据库 | show databases; |
数值
类型 | 大小 |
---|---|
tinyint | 十分小的数据 1个字节 |
smallint | 较小的数据 2个字节 |
mediumint | 中等大小的数据 3个字节 |
int |
标准的整数 4个字节 |
bigint | 较大的数据 8个字节 |
float | 浮点数 4个字节 |
double |
浮点型 8个字节 |
decimal |
字符串形式的浮点数 |
字符串
类型 | 大小 |
---|---|
char | 字符串固定大小 0-255 |
varchar |
可变字符串 0-65535 (对应java 里面的 String) |
tinytext | 微型文本 2^8 - 1 |
text |
文本串 2^16 - 1 保存大文本 |
时间日期
java.util.Data
类型 | 大小 |
---|---|
data | YYYY-MM-DD , 日期格式 |
time | HH::mm:ss,时间格式 |
datatime |
YYYY-MM-DD HH::mm:ss 最常用的 |
timestamp | 1970.1.1 到现在的毫秒数 |
year | 年份表示 |
null
Unsigned:
zerofill:
autoincrement:
非空 not null:
默认:
create table if not EXISTS `student`(
`id` int(4) not null auto_increment COMMENT '学号',
`name` varchar(30) not null DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(30) not null DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) not null DEFAULT '女' COMMENT '性别',
`birthday` datetime DEFAULT null COMMENT '出生日期',
`address` varchar(100) DEFAULT null COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT null COMMENT '邮箱',
PRIMARY key (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
show create database lianxi; -- 查看创建数据库的语句
show create table student; -- 查看创建数据库表的语句
desc student; -- 查看表的具体的结构
关于数据库引擎
MYISAM | INNODB | |
---|---|---|
事务支持 | 不支持 | 支持 |
数据行锁 | 不支持 | 支持 |
外键 | 不支持 | 支持 |
全文索引 | 不支持 | 支持 |
表空间的大小 | 较小 | 较大,约为myisam的2倍 |
常规使用操作:
alter table student rename student1; -- 修改表名
alter table student1 add age int(11); -- 增加列属性
alter table student1 MODIFY age varchar(11); -- 修改表的字段(修改约束)
alter table student1 change age age1 int(1); -- 字段重命名
alter table student1 drop age1; -- 删除表的字段
drop table if exists student1; -- 删除表
-- 班级表
create table if not EXISTS `grade`(
`gradeid` int(10) not null auto_increment COMMENT '年纪id',
`gradename` varchar(50) not null COMMENT '年纪名称',
PRIMARY key (`gradeid`)
)ENGINE=INNODB DEFAULT charset=utf8;
-- 学生表(建表的时候同时创建外键)
create table if not EXISTS `student`(
`id` int(4) not null auto_increment COMMENT '学号',
`name` varchar(30) not null DEFAULT '匿名' COMMENT '姓名',
`pwd` varchar(30) not null DEFAULT '123456' COMMENT '密码',
`sex` varchar(2) not null DEFAULT '女' COMMENT '性别',
`birthday` datetime DEFAULT null COMMENT '出生日期',
`address` varchar(100) DEFAULT null COMMENT '家庭住址',
`email` VARCHAR(50) DEFAULT null COMMENT '邮箱',
`gradeid` int(10) not null COMMENT '学生的年级',
PRIMARY key (`id`),
key `FK_gradeid` (`gradeid`),
constraint `FK_gradeid` FOREIGN key (`gradeid`) REFERENCES `grade` (`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 创建表的时候没有添加外键
alter table `student`
add constraint `FK_gradeid` foreign key(`gradeid`) references `grade` (`gradeid`)
反正就按照这个记住,在学生这里的gradeid和grade中的grade有外键关系,那么我们创建student的时候,gradeid必须要在grade中有,然后删除grade中的时候,如果有student用的这个gradeid的话,就不能删除
以上的操作都是物理外键,数据库级别的外键,我们不建议使用!(避免数据库过多造成困扰,了解即可)
最佳实践:
数据库意义:数据存储、数据管理
DML语言:数据库操作语言
操作符 | 含义 | 范围 | 结果 |
---|---|---|---|
= | 等于 | 5=6 | false |
<> 或 != | 不等于 | 5<>6 | true |
< | |||
> | |||
<= | |||
>= | |||
between … and … | 在某个范围里面 | [2,5] | |
and | 我和你&& | 5> 1 and 1>2 | false |
or | 我或你 || | 5>1 or 1>2 | true |
注意:
这个之前不知道:
Truncate作用:清空表中的数据,表的结构和索引约束不会变
delete 和 truncate 区别
了解即可:Delete删除后,重启数据库的现象
- InnoDB:自增列会从1开始(存在内存当中的,断点既失)
- MyISAM:继续从上一个自增量开始(存在文件中的,不会丢失)
(Data Query LANGUAGE):数据查询语言
作用:取出select查询出来的结果中重复的数据,只显示一条
数据库中的表达式:文本值、列、null、函数、计算表达式、系统变量…
作用:检索数据中符合条件的值
运算符 | 语法 | 描述 |
---|---|---|
is null | a is null | 如果操作符为null,结果为真 |
is not null | a is not null | 如果操作符不为mull,结果为真 |
between | a between b and c | 若a在b之间,则结果为真 |
like | a like b | SQL匹配,如果a匹配b,则结果为真 |
in | a in (a1, a2…) | 假设a在a1,或a2…其中的某一个值中,结果为真 |
举个例子
-- 左连接
select a.id, a.name from tablea as a left JOIN tableb as b on a.id = b.id;
-- 右连接
select b.id, b.name from tablea as a right JOIN tableb as b on a.id = b.id;
-- 内连接
select a.id, a.name from tablea a INNER JOIN tableb b on a.id = b.id;
-- 特殊左连接
select a.id, a.name from tablea as a left JOIN tableb b on a.id = b.id where b.id is null;
-- 特殊右连接
select b.id, b.name from tablea a right JOIN tableb b on a.id = b.id where a.id is null;
-- 全连接
select a.id, a.name from tablea a left join tableb b on a.id = b.id union
select b.id, b.name from tablea a right join tableb b on a.id = b.id;
-- 显示两个表独有的数据
select a.id, a.name from tablea as a left JOIN tableb b on a.id = b.id where b.id is null union
select b.id, b.name from tablea a right JOIN tableb b on a.id = b.id where a.id is null;
自己的表和自己的表连接,核心:一张表拆为两张一样的表
也就是说相当于我们用一张表存下了一个上下级关系,如果要查上级的话,where pid = 1,就可以查出来了,如果查对应的下级的话,根据上级的categoryid = pid去查找下级即可
排序
分页
本质:在where语句中嵌套一个子查询
链表查询和子查询都可以使用,看你怎么搞了
函数名称 | 作用 |
---|---|
ABS | 绝对值 |
SQRT | 求二次方根 |
MOD | 求余 |
LENGTH | 计算字符串长度,返回字符串字节长度 |
LOWER | 将字符串中的字母变成小写 |
UPPER | 将字符串中的字母变成大写 |
SUBSTRING | 截取字符串,返回从指定位置开始的指定长度的字符串 |
REVERSE | 字符串反转 |
CURDATE / CURRENT_DATE | 返回当前系统的日期值 |
CURTIME / CURRENT_TIME | 返回当前系统的时间值 |
NOW / SYSDATE | 返回当前系统的日期和时间值 |
MONTH | 获取指定日期中的月份 |
YEAR | 获取年份 |
MAX | 查询指定列最大值 |
MIN | 查询指定列最小值 |
COUNT | 统计查询结果的行数 |
SUM | 求和 |
AVG | 求平均值,返回指定列数据的平均值 |
要么都成功,要么都失败,将一组SQL放在一个批次中去执行
事务原则:ACID原则,原子性、一致性、隔离性、持久性 ;(脏读、幻读)
原子性:是指一个事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
一致性:事务前后数据的完整性必须保持一致
隔离性:事务的隔离性是多个用户并发访问的时候,数据库为每一个用户开启的事务,不能被其他事务的数据所干扰,多个并发事务之间要相互隔离
持久性:指一个事务一旦被提交,它对数据库中数据就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响(事务一旦提交就不可逆了)
脏读、不可重复读和幻读
命令 | 作用 |
---|---|
set autocommit = 0; | 关闭事务自动提交 |
set autocommit = 1; | 开启事务自动提交(默认开启) |
start transaction | 标记一个事务的开始,从这个之后的sql都在同一个事务下 |
commit | 手动提交 |
rollback | 回滚到原来的样子 |
savepoint 保存点名 |
设置一个事务的保存点,这个可以和rollback联合使用,当事务失败的时候,rollback to savepoint 保存点名 即可 |
RELEASE SAVEPOINT ·保存点名· | 删除保存点 |
案例
MySQL官方对索引的定义为:索引(index)是帮助MySql高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构
在一个表中,主键索引只能有一个,唯一索引可以有多个
索引的数据结构
Hash类型的索引
Btree:InnoDB的默认数据结构
为什么需要数据规范化
要求数据库表的每一列都是不可分割的原子数据项
满足第一范式,每张表只描述一件事情
满足第一、第二范式,第三范式需要确保数据表中的每一列数据和主键直接相关,而不能间接相关
规范性 和 性能的问题
关联查询的表不得超过三张