MySQL
Posted Mr.zhou_Zxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL相关的知识,希望对你有一定的参考价值。
mysql
一 事务
针对数据库多次DML操作的时候,保证数据完整性的一种手段
1 ACID
A:Aotomicity:原子性。不可被分割。也就是说事务中的所有操作要么成功,要么失败。
C:Consistency:一致性。事务执行之后,数据库的状态或者其他业务的规则保持一致。
I:Isolation:隔离性。指在并发操作中,不同的事务之间应该是隔离开来的,各事务之间互不干扰。
D:Durability:持久性。事务一旦提交成功,将不能回滚。
2 事务中产生的问题
事务中3中读的问题:
脏读: 读取到另外一个事务未提交的数据 ****脏读必须要解决*****
不可重复读: 对同一记录的两次读取不一致,另一事务对改记录进行了修改
幻读/虚读: 对同一张表的两次查询不一致,因为另一事务插入了一条记录
3 事务隔离级别
串行化: 避免事务中出现的所有问题,但是效率低
可重复读: 性能比串行化好,可以避免脏读和不可重复读,不可避免幻读,ORACLE的默认隔离级别
读已提交数据: 性能比可重复读好,可以避免脏读,MySQL的默认隔离级别
读未提交数据: 性能最好,但是任何问题都不能避免
4 手动提交事务
开启事务: START TRANSACTION
结束事务: COMMIT 或 ROLLBACK
二 DDL
1 show
show databases; -- 查询所有数据库
show tables; --查询所有表
2 create
-- 创建字符集为utf8的数据库zxy
create database if not exists zxy
character set = utf8;
-- 选用数据库
use zxy;
-- 创建表
create table if not exists zxy.user(
id int,
name varchar(20)
);
3 drop
drop database if exists zxy; -- 删除数据库
drop table if exists zxy.user; --删除数据表
4 alter
alter database zxy character set utf32; --修改字符集
alter table zxy.user rename users; --修改表名
alter table zxy.user modify id TINYINT NOT NULL,change name uname varchar(25); --修改列属性,列名
alter table zxy.user add age timestamp; -- 添加年龄列
alter table zxy.user drop column age; -- 删除列
三 DML
1 insert
insert into zxy.user(id,name) values(2,'zxy'); --向id,name插入值
2 update
update zxy.user set name = 'zxy'
where id = '1';
-- 将id=1的学生对应的name改为zxy
3 delete
delete from zxy.user; --删除全表
truncate table zxy.user;--删除全表记录
delete from zxy.user where id = 1; --删除指定条件的记录
四 DCL
1 分配权限
-- 分配权限
grant all privileges on *.* to 'root'@'%' identified by '111213' with grant option;
-- 刷新权限
flush privileges;
五 DQL
1 where
select * from user where id = 1;
-- 在where后的条件合理的情况下,可以查询到结果
-- 仅提供思路
-- 例如:
name = 'zxy';
id > 100;
sex = 'man' and name = 'zxy';
sex = 'man' or name = 'zxy';
id between 1 and 5
id in (1,2,3,4,5)
id not in (1,2,3,4,5)
2 like
-- %表示多个字符的占位符
select * from zxy.user
where name like 'z%';
-- _表示单个字符的占位符
select * from zxy.user
where name like 'zx_';
3 distinct
-- 去重查询
select distinct name from zxy.user;
4 ifnull
-- 如果为空,设置默认值
select id,name,ifnull(age,'0') from zxy.user;
5 count
-- 计算个数
select count(*) from zxy.user;
6 max
-- 统计出最大的数
select max(age) from zxy.user;
7 min
-- 统计出最小的数
select min(age) from zxy.user;
8 sum
-- 统计出总数
select count(age) from zxy.user;
9 group by
-- 按条件分组查询
select id,name,gender,sum(ifnull(salary,0)) as sum
from zxy.user
group by gender
having id < 100;
10 limit
-- limit n
select * from zxy.user limit 1; -- 只查询第一条
-- limit m,n
select * from zxy.user limit 0,2; --从下标索引0处也就是第一行开始,往后取5行输出
select * from zxy.user limit 1,1; --取到第二条数据
11 order by
-- 查询用户信息,按年龄降序,女士有限原则
select * from zxy.user
order by age desc,gender asc;
六 约束
1 primary key
- 非空
- 唯一
- 能被外键所引用
-- 方式一
create table if not exists zxy.user(
id int primary key,
name varchar(20)
);
-- 方式二
create table if not exists zxy.user(
id int,
name varchar(20)
primary key(id)
);
1.1 alter … add
alter table zxy.user add primary key(id);
1.2 alter … drop
alter table zxy.user drop primary key(id);
1.3 自增长
create table if not exists zxy.user(
id int AUTO_INCREMENT,
name varchar(20),
primary key(id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;
2 foreign key
create table dept (
id int(11) not null,
name varchar(25) default null,
primary key (id)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
-- 建表的同时,简历dept表的id的外键
create table emp (
id int(11) not null,
name varchar(25) defalut null,
deptid int(11) not null,
primary key (id),
CONSTRAINT emp_dept FOREIGN KEY(deptid) references dept(id)
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
2.1 alter … add
alter table zxy.user add constraint emp_dept foreign key(deptid) references dept(id);
2.2 alter … drop
alter table zxy.user drop foreign key emp_dept;
3 unique
create table user.zxy (
id int(11) not null,
name varchar(25) unique
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
4 not null
create table user.zxy (
id int(11) not null,
name varchar(25) unique
) ENGINE=InnoDB DEFAULT CHARSET=UTF8;
七 多表查询
将多个表的查询结果连接在一起
create table zxy.user (
id int,
name varchar(50),
score varchar(50)
);
create table zxy.stu (
id int,
date timestamp
);
1 union
-- 1.union 合并去除
select id,name from zxy.user
union
select id,name from zxy.user;
2 union all
-- 1.union 合并但不去重
select id,name from zxy.user
union all
select id,name from zxy.user;
3 inner join
-- 只有等式两边成立才能将结果查询出来
select
user.id,
user.name,
user.score,
stu.date
from user inner join stu
on user.id = stu.id;
4 left join
-- 只有等式两边成立才能将结果查询出来
select
user.id,
user.name,
user.score,
stu.date
from user left inner join stu
on user.id = stu.id;
5 right join
-- 只有等式两边成立才能将结果查询出来
select
user.id,
user.name,
user.score,
stu.date
from user right inner join stu
on user.id = stu.id;
6 natural join
-- 自然内连接查询
-- ON条件取笛卡尔积有点多余:
-- 1.要求外键名称和你另一张表的主键名称必须完全相同
-- 2.主外键约束
select
user.id,
user.name,
user.score,
stu.date
from user natural inner join stu
八 JDBC
驱动:mysql-connector-java-5.1.7-bin.jar
package com.zxy.demo.Pojo;
import java.sql.*;
public class MySQL {
public static Connection getConnection() throws ClassNotFoundException, SQLException {
/**
* 参数1:驱动 com.mysql.jdbc.Driver
* 参数2: URL jdbc:mysql://localhost:3306/zxy
* 参数3:用户名 root
* 参数4:密码 root
*/
//1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获取连接对象
String url = "jdbc:mysql://localhost:3306/zxy";
String user = "root";
String password = "root";
Connection connection = DriverManager.getConnection(url, user, password);
return connection;
}
public static void close(Statement statement, Connection connection) throws SQLException {
if (statement != null && connection != null){
statement.close();
connection.close();
}
}
/**
* 测试
* @param args
*/
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//获得connection
Connection connection = MySQL.getConnection();
//SQL语句
String sql = "select * from zxy.user";
//执行对象
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
//遍历查询
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(id + "," + name);
}
//关闭连接
MySQL.close(statement,connection);
}
}
以上是关于MySQL的主要内容,如果未能解决你的问题,请参考以下文章
连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段
使用 json rereiver php mysql 在片段中填充列表视图
关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段
修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段