Mysql
PATH="$PATH":/usr/local/mysql/bin
启动MySQL服务
sudo /usr/local/MySQL/support-files/mysql.server start
停止MySQL服务
sudo /usr/local/mysql/support-files/mysql.server stop
重启MySQL服务
sudo /usr/local/mysql/support-files/mysql.server restart
登录
mysql -u root -p :1 (mysql -uroot -p)
mysql -h127.0.0.1 -uroot -p1
mysql --host=127.0.01 --user=root --password=1
退出
exit
quit
查看数据库
show databases;
单行注释: show databases;-- 查询
show databases;#查询
多行注释:show databases; /**/
DDL:操作数据或者表
DML:数据的增删改
DQL:数据的查询
DCL:权限
查看某个数据库
show create database web09;
创建一个数据库
create database db1;
创建一个数据库,前判断是否存在
create database if not exists db1;
创建一个数据库,指定字符集
create database db3 character set utf8;
create database if not exists db5 character set gbk;
修改数据的字符集
alter database db5 character set utf8;
删除数据库;
drop database db1;
drop database if exists web08;
查询使用数据库
select database();
使用数据库
use db1;
操作表:DDL
查询某个数据库中所有表名称
Show tables;
查询表的结构?
desc proc;
创建表:
create table student(id int,name varchar(32),age int,score double(4,1),birthday date,inster_time timestamp);
删除表
drop table tabelName;
drop table if exists tabelName ;
复制一个表
create table stu_like student;
修改表的名
alter table student rename to stu;
修改表的字符集;
alter table stu character set utf8;
修改列的类型
alter table stu modify 列名 varcha(10);
修改列的名称
alter table stu change 列名 新列名 varchar(20);
删除列
alter table stu drop sex;
添加列
alter table stu add 列名 varcahr(10);
DML:
1.添加数据
insert into stu(id,name,age,score) values(1,'张无忌',20,100);
insert into stu values(2,'赵敏',17,99.0,null,null);-- 简化列名,意思就是全部数据
insert into stu values(3,'张三丰',87,99.0,"1988-08-08",null);
2.删除数据
Delete from stu where id=1;
(没有where , 删除所有数据)
truncate table stu;-- 删除表,后创建一个新表
3.修改数据
update stu set name="张无忌",age=12 (where id=1);
如果没有where,列被全部修改
4.查询数据
select * from 表名;
DQL:
数据条件查询
1.排序
select * from stu order by score;-- 默认ASC
select * from stu order by score DESC;
2.聚合函数 -- (注意:排除null值)
count:计算个数
select count(age) from stu;
select count(IFNULL(birthday,"1990-01-09")) from stu;
select count(*) from stu;
Max: 计算最大值
select max(score) from stu;
Min:最小值
select min(score) from stu;
Sum:和
select sum(age) from stu;
avg:平均值
select avg(age) from stu;
3.分组查询:
Select sex , AVG(age) FROM stu GRoup by sex;
Select sex , AVG(age),count(id) FROM stu GRoup by sex;
mysql> Select sex , AVG(age),count(id) FROM stu where age > 35 GRoup by sex;
Select sex , AVG(age),count(id) FROM stu where age > 35 GRoup by sex having count(id) > 2;
Select sex , AVG(age),count(id) 人数 FROM stu where age > 35 GRoup by sex having 人数 > 2;
/*
1.where 在分组之前进行限定,如果不满足条件,则不参与分组;having在分组之后进行限定,如果不满足结果,则不会被查询出来.
2.where 后不可以跟聚合函数的判断,having 可以;
*/
4.分页查询
select * from stu limit 0,3;-- 0开始,3条;第一页
/*
Limit: 只能在mysql,里面使用!
*/
5.DQL 查询表中的记录
Select
+ 字段名(,)
from
+ 表名列表
where
+ 条件列表
group by
+ 分组字段
having
+ 分组之后的条件
order by
+ 排序
limit
+ 分页
2.基础查询
1. 多个地段的查询
select name,age from student;
2. 去除重复
select distinct address from student;--distinct
3. 计算列
select name,math,english,math + english from student;--使用+
select name,math,english,math + ifnull(english,0) from student; ifnull(english,默认值)
4. 起别名
select name,math,english,math + ifnull(english,0) as 总分 from student;
select name,math,english,math + ifnull(english,0) 总分 from student;
select name 姓名,math 数学,english 英语,math + ifnull(english,0) 总分 from student;
3.条件查询
1.where 子句后跟条件
2.运算符
> < <= >= = <> !=
select * from student where age > 20;
between...and..
select * from student where between 20 and 30;
In
select * from student where age in (22,18);
Like
* 占位符
_:单个任意字符
select * from student where name like '_化%';
select * from student where name like '___';
%:多个任务字符
select * from student where name like '马%';
select * from student where name like '%马%';
Is null
select * from student where English is null;
And 或者 &&
or 或者 ||
not 或者 !
select * from student where English is not null;
约束;
1.主键约束 primary key --:1.非空且唯一;2.一张表只能有一个主键
创建表时,添加主键约约束
create table student(id int primary key,name varchar(20));
删除主键
alter table student drop primary key;
添加主键
alter table student modify id int primary key;
1.1 自动增长
某列是数值,使用auto_increment 可以来完成值的自动增长;
创建时,添加自增长
create table student(id int primary key auto_increment,name varchar(20));
删除子增长
alter table student modify id int;
添加子增长
alter table student modify id int primary key auto_increment;
2.非空约束 not null
创建表时,添加约束
create table person(id int, name varchar(20) not null);
删除字段的非空约束
alter table person modify name varchar(20);
创建表后,添加约束
alter table person modify name varchar(20) not null;
3.唯一约束 unique
创建表时,添加约束
create table person(id int, name varchar(20) unique);
null值比较特殊,null值认为是不重复.
删除唯一约束
alter table person drop index phone_number;
添加唯一约束
alter table person modify phone_number varchar(20) phone_number;
4.外键约束 foreign key
创建表时,添加外键
create table class(class_id int,name varchar(20));
create table student(id int primary key auto_increment,name varchar(20),class_id int,constraint stu_class_fk foreign key (class_id) references department(id));
删除外键
alterr table student drop foreign key stu_class_fk;
添加外键
alter table student add constraint stu_class_fk foreign key (class_id) references department(id));
5.级联操作
设置级联,更新级联
alter table student add constraint stu_class_fk foreign key (class_id) references department(id)) on update cascade;
级联删除
1.删除外键
2.级联的删除
alter table student add constraint stu_class_fk foreign key (class_id) references department(id)) on delete cascade;
6.数据库备份
mysqldump -uroot -p1 db1 > /Users/yt_lwf/Desktop/11/a.sql
7.还原数据库
source /Users/yt_lwf/Desktop/11/a.sql;
8.多表查询
* 笛卡尔积
* 多表查询的分类:
1. 内链查询:
1.隐式
select * from emp,dept where emp.dept_id = dept.id;
select * from emp,dept where emp.'dept_id' = dept.'id';
select emp.name,gender,dept.name from emp,dept where emp.dept_id = dept.id;
select t1.name,t1.gender,t2.name from emp t1,dept t2 where t1.dept_id = t2.id;
2.显式
语法: select 字段列表 from 表名1 inner join 表名2 on 条件;
select * from emp inner join dept on emp.dept_id = dept.id;
select * from emp join dept on emp.dept_id = dept.id; -- 省略 inner
2. 外链查询:
1.左外连接
语法: select 字段列表 from 表1 left [outer] join 表2 on 条件;
select t1.*,t2.name from emp t1 left join dept t2 on t1.dept_id = t2.id;
查询左表(emp)的全部数据 和 dept 的交集数据
2.右外连接
语法: select 字段列表 from 表1 right [outer] join 表2 on 条件;
select t1.*,t2.name from emp t1 left join dept t2 on t1.dept_id = t2.id;
查询右表(dept)的全部数据 和 emp 的交集数据
3. 子查询: 查询中,嵌套查询
select * from emp where salary=(select max(salary) from emp);
1.子查询是单行单列
* 可以作为条件,使用运算符去判断 (运算符, > < = ....);
select * from emp where salary<(select avg(salary) from emp);
2.子查询是多行单列
* 可以作为条件,使用运算符去判断
select * from emp where dept_id in (select id from dept where name in ("财务部","市场部"));
3.子查询是多行多列
*可以作为一张的虚拟表
select * from dept t1,(select * from emp where join_date > '2011-11-11') t2 where t1.id = t2.dept_id;
9.事务
1.事务的操作
1.开始事务 start transaction
2.回滚 rollback
3.commit commit
start transaction;-- 开启事务
update account set balance = balance - 500 where name = "三张";-- 张三转出500
update account set balance = balance + 500 where name = "李四";-- 李四转入500
commit;-- 发现执行没有问题,提交事务
rollback;-- 发现出了问题了,回滚事务
mysql数据库的commit
2.DML (增删改) 默认提交一次.
3.查看默认提交方式;
select @@autocommit;
1:代表自动提交
0:手动提交
4.修改提交方式
set @@autocommit;
***:oracle 数据库默认是手动提交的.
2.事务的四大特征
1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败!
2.持久性:当事务提交或者回滚后,会持久化的保存数据!
3.隔离性:多个事务之间,相互独立!
4.一致性:事务操作前后,数据的总量不变!
3.事务隔离级别
**多个事务之间隔离的,相互独立.但是多个事务同事操作同一批数据时,则会引发一些问题,设置不同的隔离级别可以解决!
**问题:
1.脏读:一个事务读取到,另一个事务中没有提交的数据
2.不可重读度(虚读):在同一个事务中,两次读取的数据不同
3.幻读:一个事务操作(DML),数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改!
**隔离级别:
1.read uncommitted:读未提交
*产生的问题: 脏读,不可重读度(虚读),幻读
2.read commited:读已提交 (orcel 默认)
*产生的问题: 不可重读度(虚读),幻读
3.repeatable:可重复读 (mysql 默认)
*产生的问题: 幻读
4.serializable:串行化
*产生的问题: 无
**级别高,效率底
1.查询隔离级别
select @@tx_isolation;
2.设置隔离级别
set global transaction isolation level 级别的字符串;
DCL:
1.管理用户
1.加用户
create user '用户名'@'主机名' identified by '密码'
create user 'lwf'@'localhost' identified by '1';
create user 'lwf'@'%' identified by '1';-- %通配符
2.查用户
use mysql;-- 切换到mysql 数据库
select * from user;-- 查询用户
3.删用户
drop user '用户名'@'主机名'
4.修改用户密码
update user set password = password('新密码') where user = '用户名';
set password for '用户名'@'主机名' = password('新密码');
*** root 忘记密码的处理
1.停止mysql服务.
2.启动mysql服务.(无验证方式)
*windows mysql --skip-grant-tables;
*mac sudo mysqld_safe --skip-grant-tables --skip-networking &
3.不要关闭窗口,再打开一个新的窗口
4.mysql
5.可以看到已经进入数据库了
6.use mysql;
7.update user set password = password("新密码") where user="root";
8.停止mysql的服务
* Mac 可以使用 FLUSH PRIVILEGES;
** 出现:mysqld_safe A mysqld process already exists
** 解决1.:/usr/local/mysql/bin/mysqladmin -u root -p shutdown
** 解决2.:sudo mysqld stop
** 解决3.:sudo /usr/local/mysql/bin/mysqld stop
** 解决4.:sudo mysql.server stop
9.重新登录就可以了
2.授权
1.查询权限
show grants for 'lwf'@'localhost';
2.授予权限
grant 权限列表 on 数据库名.表明 to 'lwf'@'localhost';
grant select,Delete on db1.stu to 'lwf'@'localhost';
** 所有权限
所有权限的通配符:all
所有库的所有表的通配符:*.*
3.撤销权限
revoke 权限列表 on 数据库名.表明 from 'lwf'@'localhost';
JDBC:
//1.下载对应数据库的jar包
//2.复制jar包到项目的libs文件夹
//3.右键libs文件夹 add as libary
//4.注册驱动
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","1");
// 若mysql 是本地服务且是3306 端口的情况下:DriverManager.getConnection("jdbc:mysql:///db1","root","1");
String sql = "UPDATE stu set name = 'www' WHERE id = 3";
Statement stmt = conn.createStatement();
int count = stmt.executeUpdate(sql);
System.out.println(count);
stmt.close();
conn.close();
executeUpdate(sql);-- DDL DML
executeQuery();-- DQL
连接池:
1.C3P0: 数据库连接池
2.Druid: 数据库连接池, 由阿里巴巴提供的