A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

就业班_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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马