可以跟着sqlyog学sql
连接数据库 mysql -u username -p password,也可以mysql -uusername -ppassword
修改密码
注释 --
多行注释 /**/
show databases; 显示所有数据库
use 数据库名
show tables; --查看数据库中所有的表
describe 表名; --显示表的字段等所有信息
create database westos; --创建一个数据库
exit; 退出连接
DDL DML DQL DCL
Database Definition/Management/Query/Control Languague
操作数据库
1.创建数据库
create database [if not exists] westos
2.使用数据库
use `westos`
如果你的表名或者字段名是一个特殊字符,就需要带``,比如你的字段名是user, 那么因为mysql内置有个user表,所以查询的时候要
select `user` from westos
因为user会高亮
3.删除数据库
drop database [if not exist] westos
数据库的列类型
数值类型
tinyint 1字节
smallint 2字节
mediumint 3字节
int 4字节
bigint 8字节
float 4字节
double 8字节
decimal 字符串形式的浮点数,金融计算一般decimal
字符串类型
char 字符串固定大小的 1~255字节, char(5) 必定占5个字节
varchar 可变字符串 0~65535字节 varchar(5)就不一定5个字节
tinytext 1~255
text 1~65535
时间日期
date yyyy-mm-dd 日期
time hh:mm:ss 时间
datetime yyyy=mm-dd hh:mm:ss 日期时间,最常用
timestamp 时间戳
字段属性
Unsigned 无符号
zerofill 0填充
自增 auto_increment
非空 not null
默认 default
标准 数据库应该具备 id, gmt_created, gmt_updated, is_deleted, 'version'
创建数据库
/*
*
所有字段用飘号圈起来
字符串用英文单引号括起来
所有语句后面加 ,
*/
create table if not exists `student` {
`id` int(4) not null auto_increment comment '学号',
`name` varchar(30) not null default '匿名' comment '姓名',
primary_key(`id`)
} Engine = INNODB default charset=utf8 --默认不支持中文,所以必须指定charset
创建数据库表的模板
/*
*
所有字段用飘号圈起来
字符串用英文单引号括起来
所有语句后面加 ,
*/
create table [if not exists] `表名` {
`字段名` 列类型 [属性] [索引] [注释],
`字段名` 列类型 [属性] [索引] [注释],
....
`字段名` 列类型 [属性] [索引] [注释],
primary_key(`字段名`)
} Engine = INNODB default charset = utf8
myisam和innodb 区别
innodb 事务支持,行级锁,支持外键约束,这些myisam都不支持
myisam 支持全文索引,类似于百度搜索java
myisam 节约空间,速度快
innodb 安全性高,事务处理,多表多用户操作
所有的数据库文件都在data目录下,本质还是文件存储,
mysql引擎在物理文件的区别:
innodb 在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
myisam 对应文件
*.frm 表结构的定义文件
*.myd 数据文件
*.myi 索引文件
show create database 数据库名 --显示数据库创建语句
show create table 表名 --显示数据库表的定义语句
desc 表名 --显示表结构
事务
就是一组SQL放到一个批次中去执行,要么都成功,要么都失败
事务原则 ACID 原子性(Atomic 要么都成功,要么都失败) 一致性(Consistency) 隔离性(隔离性) 持久性(Durability 事务没有提交,恢复到原状;事务已经提交,则持久化到数据库。 事务一旦提交就不可逆)
隔离性() 是指,比如A和C都对B进行转账,那么这两个事务直接不会相互影响,导致金额混乱,所以这个时候也就涉及到了 数据库的隔离级别 : 读未提交 读已提交 可重复读 串行化
参考: https://blog.csdn.net/dengjili/article/details/82468576
1 脏读 一个事务读取了另外一个事务未提交的数据
2 幻读 第一次读有3行记录,第二次却有4行记录
3 不可重复读 一个事务内,读取某一行数据,多次读取结果不同
MySQL注入
sql里面会拼接 or 关键字,比如 select * from world where 'name' = tang or 1=1, 这样就一直是true,就会盗取非法数据,
所以一般不用statement,而用prepareStatement
PrepareStatement
可以防止SQL注入,使用占位符 ? 代替变量,通过setInt(下标, 值) 来给value里面的?赋值
先prepareStatement 预编译
然后通过setInt setString给参数赋值
再通过statement.executeUpdate() executeQuery()执行
prepareStatement的预防SQL注入的本质,就是把传递进来的参数当做字符,假设其中存在转义字符,比如单引号',那么就直接忽略这个字符