数据库(DataBase)是用来组织、存储和管理数据的仓库。
SQL(英文全称:Structured Query Language)是结构化查询语言,专门用来访问和处理数据库的编程语言。
DQL
数据查询语言
SELECT
DML
数据操纵语言
INSERT
UPDATE
DELETE
DDL
数据定义语言
CREATE
DROP
ALTER
DCL
数据控制语言
GRANT
REVOKE
tinyint
smallint
int
bigint
float
double
decimal
char
varchar
text
blob
date
time
datetime
timestrap
YYYY
YYYY-MM-DD
HH-MM-SS
YYYY-MM-DD HH:MM:SS
YYYY-MM-DD HH:MM:SS
timestamp
的数值是与时区相关
UTC
(Universal Time Coordinated)系统协调时区(全时间统一公用的时间)进行存储,以系统当前所在时区进行显示对比 | timestamp | datetime |
---|---|---|
存储空间 | 4字节 | 8字节 |
时区 | 与时区有关 | 不受时区影响 |
时间范围 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
[inner] join on
left join on
right join on
group by
order by
limit
abs(x)
绝对值ceil(x)
返回大于或等于x的最大整数round(x)
返回四舍五入的整数floor(x)
返回等于或小于x的最大整数mod(x)
获取 a / b 的余数(如果id需要是偶数或者奇数时就可以使用mod
)
select 字段 from 表名 where 查询条件(分组前) group by(含聚合)having 查询条件(分组后排序) order by(排序) limit 分页;
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
内连接:[inner] join on
只显示两表共有的数据(交集数据)
#查找 emp 中拥有部门的所有员工信息(也包含部门信息)
SELECT * FROM emp e INNER JOIN dept d ON e.dNo = d.deptNo;
外连接:
left join on
显示 join 左边的表的所有数据(不管两个表是否匹配),对于不匹配的部分都用 NULL 表示right join on
显示 join 右边的表的所有数据(不管两个表是否匹配),对于不匹配的部分都用 NULL 表示以谁为主谁中的所有信息都出现
SELECT * FROM emp e LEFT JOIN dept d ON e.dNo = d.deptNo;
SELECT * FROM emp e RIGHT JOIN dept d ON e.dNo = d.deptNo;
网上有的说数据库的 5 大约束,有的是 6 大约束,MySQL中没有检查约束 的
/*Oracle*/
CREATE TABLE student(
id int primary key auto_increment,/*主键约束*/
name varchar(50) not null,/*非空约束*/
sex varchar(10) default '男',/*默认约束*/
age number(9),
check(age>=18 and age<=70)/*检查约束*/
);
/*MySQL*/
CREATE DATABASE IF NOT EXISTS company;
USE company;
DROP TABLE IF EXISTS dept;
DROP TABLE IF EXISTS emp;
CREATE TABLE dept(
did INT PRIMARY KEY AUTO_INCREMENT COMMENT '部门ID',/*主键约束*/
dname VARCHAR(50) UNIQUE COMMENT '部门名称'/*唯一约束*/
);
CREATE TABLE emp(
uid INT PRIMARY KEY AUTO_INCREMENT COMMENT '员工ID',
ename VARCHAR(50) NOT NULL COMMENT '员工姓名',/*非空约束*/
etype VARCHAR(50) DEFAULT '普通员工' NOT NULL COMMENT '员工类型',
dept_id INT COMMENT '部门ID',/*默认约束*/
FOREIGN KEY(dept_id) REFERENCES dept(did)/*外键约束*/
);
事务是数据库操作最小的逻辑工作单元,它包含了一个或多个业务操作,这些操作要么都执行要么都不执行,是不可分割的,一起向系统去提交的。事务常常用来确保数据的一致性。
项目中我们通过 @Transactional
注解,这个注解是Spring框架提供的事务管理(声明式事务管理)
通常我们在业务层中,若一个方法中涉及到多个增删改查操作,此时需要在该方法上通过 @Transactional
注解开启事务管理;也可以在业务层接口上添加@Transactional
START TRANSACTION
show variables like 'autocommit';
SET AUTOCOMMIT=0
禁止自动提交SET AUTOCOMMIT=1
开启自动提交COMMIT
ROLLBACK
创建视图:
create view 视图名 as select查询语句...
create view 视图名(列名1,列名2...) as select查询语句...
使用视图:
select * from 视图名
删除视图:
drop view 视图名
用途:
*
号,查什么字段写什么字段select * from emp limit 1;
or
关键字,容易引起索引失效GRANT
命令,添加新的用户,授予远程访问权限grant all privileges on *.* to root @"%" identified by "root";
flush privileges; # 强制刷新
localhost
登入mysql后,更改 mysql
数据库里的 user
表里的 host
项,将 localhost
改称 %
update user set Host = '%' where Host = 'localhost' and User='root';
flush privileges; # 强制刷新
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。
在数据中,索引相当于字典的目录一下,通过索引可以快速的检索数据。
MySQL 索引的建立对于 MySQL 的高效运行时很重要的,索引可以大大提高 MySQL 的检索速度。
创建索引时,需要确保该索引时应用在 SQL 查询语句的条件(一般作为 where 子句的条件)
创建索引的字段我们建议是唯一,不为空,经常被查询的字段。
CREATE INDEX indexName ON tableName (username);
ALTER TABLE tableName ADD INDEX indexName (columnName);
DROP INDEX indexName ON tableName;
CREATE TABLE tableName(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username)
);
CREATE UNIQUE INDEX indexName ON tableName(username);
ALTER table tableName ADD UNIQUE [indexName] (username);
CREATE TABLE tableName(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username)
);
explain
索引会大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT
,UPDATE
,DELETE
。因为更新表时,MySQL 不仅要保存数据,还要保存(更新)一下索引文件。
B-Tree
平衡二叉树的结构)可以大大加快数据的检索速度,这也是创建索引的最主要的原因。数据量庞大
该字段经常作为查询条件
该字段很少的DML操作(insert,delete,update),因为操作之后,索引需要重新排序
建议
select *
like
左边包含 %
or
关键字not in
和 not exists
order by
的坑- [x] 持续更新中…