Mysql


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: 数据库连接池, 由阿里巴巴提供的

















































你可能感兴趣的:(Mysql)