数据类型
1.整数
tinyInt 1byte
smallInt 2byte
mediumInt 3byte
int 4byte
2.小数
float 4byte
double 8byte
3.日期
year YYYY 1901-2155
date YYYY-MM-DD
time
4.文本、二进制
tinyblob、blob、smallblob、mediumblob、longblob
tinytext、text、mediumtext、longtext
5.字符
char 定长 0-255
varchar 变长 0-65535
sql优化
1.sql语句优化
不 select *
union 或 union all 代替 or(union可去重,union all不可)
用关联查询(join)代替子查询
2.用索引
数量:每张表<=5
为查询最频繁的字段建
更改频繁的、不能显著区分数据的字段不适合建
3.表优化
字段尽量不为null
单表数据<=300w
字段类型应为符合要求的最小数据类型
禁建预留字段(暂时用不上空在那的)
如何优化慢sql
查原因,明确偶尔慢还是一直慢
偶尔慢考虑
1.数据库在刷新脏页
2.有表锁或行锁,且当前事务未获得锁
补充:mysql脏页是什么
一直慢可以开慢查询,分析慢查询日志
1.未用索引 -> 全表扫描 -> 查询慢
解决:加索引
2.用了索引 -> 索引失效 -> 全表扫描 -> 查询慢
解决:分析失效原因并修复
sql语句
删除
delete from table where
建索引
create index index_name on table(column)
sql四种连接
1.内连接
2.左(外)连接
3.右(外)连接
4.全连接
mysql不支持,可用它法实现
Select * from TableA left join tableB on A.key=B.key;
Union
Select * from TableA right join tableB on A.key=B.key;
筛选的方法
where
group by having
order by
limit
limit
下面两种写法都表示取2、3、4三条数据
select * from article LIMIT 1,3
select * from article LIMIT 3 OFFSET 1
limit 要跳过的数量 , 取的数据的条数
limit 取的数据的条数
limit 取的数据的条数 offset 要跳过的数量
sql分类
DQL:数据查询语言,查
DML:数据操纵语言,增、删、改
DDL:数据定义语言,创建
DCL:数据控制语言,授权、回滚、提交
删除相关
delete
DML,删除行,记录于redo和undo日志,可回滚
truncate
DDL,清空表数据,保留结构,不可回滚
drop
DDL,清除表的数据和结构,不可回滚
其他
起别名
字段 + as + 别名
字段 + 空格 + 别名
去重
distinct
+号只能做运算,不能拼接字符串
拼接用concat(string1,string2)
字符串用单引号,‘abc’
不等:!= 和 <>
查询员工名中第三个字符为e,第五个字符为a的员工名和工资
select * from employees where last_name like '__e_a%';
查询员工名中第二个字符为_的员工名
这里可以采用转义的方法实现
方式一:采用java中的\进行转义
方式二:采用MySQL中的escape “转义符”的方式
select last_name from employees where last_name like '_$_%' esc