就业班_JavaEE_day07_08_09_mysql
一 关系型数据库管理系统 (存放数据和数据之间的关系 一对一 一对多 多对多 er实体图) er?
RDBMS = Manager + Databases
Database = Tables
Table = 表结构 + 表记录
二 mysql安装和卸载 见文档
1 mysql安装有二个目录,一个是程序安装目录,一个是data存放目录。data目录存放在c:\programdata目录下,卸载时该目录不会删除,需要手动删除。
2 net stop mysql net start mysql 停用和启用mysql服务
3 命令行登录 mysql -u root -p -h 表示服务器IP 不写表示本机 -P 表示端口
4. my.ini,MySQL最为重要的配置文件
> 配置MySQL的端口:默认为3306,没有必要去修改它;
> 配置字符编码:
* [client]下配置客户端编码:default-character-set=gbk
可以用来解决命令行乱码问题,命令行默认是gbk编码,用连接工具不存在该问题。
* [mysqld]下配置服务器编码:character-set-server=utf8
> 配置二进制数据大小上限:
* 在[mysqld]下配置:max_allowed_packet=8M
补充:
show variables '%character%'; 查看字符编码
character_set_client、character_set_results、character_set_connection、character_set_server 、character_set_data
三 SQL 结构化查询语言 structured query language (SQL标准 + 方言)
DDL 数据定义语言
DML 数据操作语言
DQL 数据查询语言
DCL 数据控制语言
四 DDL
1 数据库
create database shopping;
drop database shopping;
show databases;
alter database shopping character set utf8;
注意 在mysql中的utf8字符集中没有-。
查询当前数据库 select database();
使用某个数据库 use shopping;
2 数据类型
java类型 mysql类型
byte tinyint
short smallint
int int
long bigint 表示整数 常用int
float float
double double 表示小数,常用double(5,2),该写法表示有三位整数,2位小数,即最大值为999.99
decimal 在表示钱方面使用该类型,因为不会出现精度缺失问题;
char char(255) varchar(65535)
boolean ?
String char varchar
Date date time datetime timestamp
Blob blob
Clob text
注意
char varchar 可变不可变 char 长度不够补空格 varchar 长度不够不补 自适应。
datetime timestamp 区别 datatime 没插入时 补null timestamp 没插入时 补系统时间
3 完整性约束
primary key
添加主键
alter table stu add primary key(sid);
删除主键
alter table stu drop primary key;
主键自增长 auto_increment 这是mysql的方言 添加和删除自增长 用change
unique
not null
foreign key
添加外键
alter table stu add FOREIGN KEY(u_id) REFERENCES t_user(uid);
删除外键
alter table user drop foreign key FK_user;
4 表
创建表
create table user (
id int primary key auto_increment,
name varchar(20) unique,
age int not null
);
删除表
drop table user;
修改表
添加字段
alter table user add birthday date not null;
修改字段类型和长度
alter table user modify age int(20);
修改字段名称
alter table user change age age1 int(15) ;
修改表名
rename table user to user_bak;
查询表
show tables;
show create table student;
desc student;
五 DML
插入记录
insert into user values(1,'lisi',10);
insert into user( name,age) values('zhangshan',20);
注意 字符串和日期 用单引号
删除记录
delete from user where id =1;
注意 delele 和 truncate 的区别
delete 属于dml语句 有日志记录 可以恢复
truncate 属于ddl语句 没有日志记录 不可以恢复 相当于drop table ,然后 createdtable 。
更新记录
update user set age = 30 where id =1 ;
注意 删除和更新操作实际应用中都会带条件。
六 DCL
创建用户
create user user1@localhost identified by '111'; 表示创建user1密码111只能在localhost上登录
create user user1@'%' identified by '111'; 表示创建user1密码111,在所有IP上都能登录
给用户授权
grant create,alter,drop,insert,update,delete,select on mydb1.* to user1@localhost;
表示给user1授予mydb1库上的(create,alter,drop,insert,update,delete,select)权限
grant all on mydb1.* to user1@localhost; 表示给User1授予mydb1库上的所有权限
撤销授权
revoke create,alter,drop on mydb1.* from user1@localhost;
查看用户权限
show grants for user1@localhost;
删除用户
drop user user1@localhost;
修改用户密码 注意:需要先切换到mysql自带的数据库中(mysql); 需要root身份登录
update user set password=password('111') where userid= 'user1';
flush privileges;
注意:user1@localhost 用户名和ip是绑定的。 create,alter,drop...on mydb1.* 权限和数据库是绑定的。
七 DQL
1 表与表之间的关系
a 一对一:例如公民表和身份证表。设计方案有二种:
a 在身份证表中添加外键,指向公民表的主键,并且给外键添加唯一约束;
b 给身份证表中的主键添加外键约束,即身份证表的主键也是外键。该方案不可取,因为身份证表的主键被赋予了业务属性。主键一般采用非业务字段。
注意:另外也可以将二张表设计成一张表。
b 一对多:例如部门表和员工表。设计方案:
在多的一方(员工表)添加外键,指向部门表的主键。
c 多对多:例如学生表和课程表。设计方案:
创建中间表。给出两个外键,一个指向学生表的主键,一个指向课程表的主键。
另外实际开发中,一般不创建真实外键,而是添加关联字段,通过程序来保证数据的完整性。
注意,外键约束指的是不能外键字段的内容不能超出主键的内容范围,但是不包含NULL 同时主键列如果要删除的话,必须保证外键没有指引它的引用。
2 单表查询
格式如下:
select
from
where
group by
having
order by
limit
注意 limit a, b 其中a从0开始 b表示取多少行数据。
第一页 0-9 limit 0,10 limit (page-1)*10, 10
第二页 10-19 limit 10,10
第三页 20-29 limit 20,10
注意:
a 模糊查询 like 有二个占位符 _ 表示任意一个字符 % 表示任意多个字符
b IFNULL(comm, 0) 任意字段类型与null做算数运算都返回null , 不能转化为数字的字段做算数运算被当作0处理。
c x=null 任意字段=null返回的都是false 需要通过is null 来判断。
d sql中赋值和判断都用= 没有==。
e mysql中连接二个字符串 用concat(a,b,c,d)可以有多个 oracle中用||
f count() 统计的是非NULL的行数
3 多表查询
a 连接查询
内连接 取左右二边都符合条件的记录,常用写法如下:
SELECT * FROM CLASS A , STUDENT S WHERE A.CID = S.CNO;
外连接
左外连接 left join 左边的表取全部记录右边的补NULL(相当于内连接+左边没匹配上的记录) 常用写法如下:
SELECT * FROM CLASS A LEFT JOIN STUDENT S ON A.CID = S.CNO;
右外连接 right join 右边的表 取全部记录 左边的补NULL 右外连接一般就转化为左外连接来写。
SELECT * FROM CLASS A RIGHT JOIN STUDENT S ON A.CID = S.CNO;
b 子查询
带in的子查询
带exists的子查询
select * from calss where exists (select * from student where sid>1) 表示后面的查询有记录,则执行前面的select * from calss
带any的子查询
> any() 大于最小值
< any() 小于最大值
带all的子查询
> all() 大于最大值
< all() 小于最小值
子查询出现的位置:
where后作为条件存在
from后作为表存在(多行多列)
子查询的不同条件应用场景
单行单列:SELECT * FROM 表1 WHERE 列1 [=、>、<、>=、<=、!=] (SELECT 列 FROM 表2 WHERE 条件)
多行单列:SELECT * FROM 表1 WHERE 列1 [IN, ALL, ANY] (SELECT 列 FROM 表2 WHERE 条件)
单行多列:SELECT * FROM 表1 WHERE (列1,列2) IN (SELECT 列1, 列2 FROM 表2 WHERE 条件)
多行多列:SELECT * FROM 表1 别名1 , (SELECT ....) 别名2 WHERE 条件
c 合并结果集
要求被合并的表中,列的类型和列数相同
UNION,去除重复行
UNION ALL,不去除重复行
八 事务
一组逻辑操作要么都成功,要么都失败。经典案例:银行转账
事务的特性:ACID
原子性( 一组逻辑操作要么都成功,要么都失败);一致性();隔离性(事物的并发,一个事物的操作不受其它事务的影响);持久性(事务结束,结果会保存到硬盘中);
mysql事务操作:
start transaction; 开启事务
commit; 提交事务
rollback 回滚事务
并发事物会导致的安全问题:
a 脏读 表示一个事务读到了另外一个事务未提交的数据
b 不可重复读 表示在同一个事务中,二次读取时读取内容不一致,读到了另外一个事务提交的update操作之后的数据。
c 幻读 表示在同一个事务中,二次读取时读取内容不一致,读到了另外一个事务提交的insert操作之后的数据。
4种隔离级别
a read uncommitted 会出现脏读 不可重复读 幻读 问题
b read committed 可以避免脏读 会出现不可重复读 幻读问题 oracle默认采用的隔离级别
c repeatable read 可以避免脏读和不和重复读 会出现幻读问题 mysql默认采用的隔离级别
d seriaziable 可以避免脏读 不可重复读 幻读 问题
mysql中设置隔离级别和查询隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别
SELECT @@tx_isolation;
九 数据库的备份(数据库 --> sql)和恢复(sql --> 数据库)
1. 备份 (备份数据库内容,并不是备份数据库!)
> mysqldump –u用户名 –p密码 数据库名>生成的脚本文件路径
> 例如:mysqldump -uroot -p123 mydb1>C:\mydb1.sql (与mysql.exe和mysqld.exe一样, 都在bin目录下)
> 注意,不要打分号,不要登录mysql,直接在cmd下运行
> 注意,生成的脚本文件中不包含create database语句
2. 恢复
第一种方式
> mysql -u用户名 -p密码 数据库<脚本文件路径
> 例如:
* 先删除mydb1库,再重新创建mydb1库
* mysql -uroot -p123 mydb1<C:\mydb1.sql
> 注意,不要打分号,不要登录mysql,直接在cmd下运行
第二种方式
> 登录mysql
> source SQL脚本路径
> 例如:
* 先删除mydb1库,再重新创建mydb1库
* 切换到mydb1库
* source c:\mydb1.sql
|