黑马程序员技术交流社区

标题: 5天---- 数据库知识总结 [打印本页]

作者: 时过境迁3    时间: 2018-12-10 11:18
标题: 5天---- 数据库知识总结

                                数据库知识总结
数据库基本概念        数据库分类                关系型                        mysql                        oracle                        db2                非关系型                        redis        mysql 6.0收费       

DBMS :数据库管理系统

数据库结构:
    数据库
        -->表(列)
                -->数据
               
sql分类
    DDL(数据库和表的操作)
    DML(数据的增删改)
    DQL(数据的查询)
    DCL(DBA)
   
数据类型
    ** 面试**VARCHAR(长度):***在长度限制内,输入几个字符显示几个字符
    CHAR(长度): 在长度范围内,输入字符不够限制长度用空格补全!!!
    TEXT
    DATE***设置为空,表里显示即为null;
    DATETIME
    ** 面试**TIMESTAMP:*****(如果当前表没有设置或设置内容为null)则会自动默认当前系统时间
   
    查询的基本格式: select 列名 from 表名 where 条件 group by 列名 having 条件 order by 列名 asc/desc limit 0,5;
   
    分组查询中WHERE和HAVING两个关键字的区别** 面试**
    "WHERE" 是一个约束声明,使用WHERE来约束来之数据库的数据,WHERE是在结果返回之前起作用的,且WHERE中不能使用聚合函数。
    "HAVING"是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在HAVING中可以使用聚合函数。
   
   
    聚合函数通常配合分组进行操作:
    min,max,sum,count,avg
    '<>'表示不等于;'!='
    and/or
    select * from student where age>=18 and age<=28
    select * from student where age<=18 or age>=28
   
    between and   区间范围包括等于两头的值;
    in:()只等于括号内的值;
    is nall,is not null;
    like:
    '%'表示零或多个;
    '_'只表示一个字符;
   
   
约束  
    主键  PRIMAYR KEY AUTO_INCREMENT
    外键  FORIGEN KEY
    非空  not null
    唯一  nuique
   
    alter table 从表 add foreign key 外键列 fefrences 主表(主表主键

多表的关系:
    1对1
    1对多:多创建外键指向一主键
    多对多:中间表2列作为(外键/联合主键)分别指向其他2个主表的主键
MYSQLMYSQL        安装卸载        net start mysql        net stop mysql       

netstat -ano | findStr "3306"
taskkill /F /PID mysql的进程id

sqlyog工具使用
--------------------------------------------
DDL
    数据库
        CREATE DATABASE 数据库名 CHARACTER SET utf8
        DROP DATABASE 数据库名
        SHOW DATABASES
        SHOW CREATE DATABASE 数据库名
        SELECT DATABASE()
        USE 数据库名
    表
        CREATE TABLE 表名(列名 数据类型 约束,列名 数据类型 约束)
        DROP TABLE 表名
        SHOW CREATE TABLE 表名
        SHOW TABLES
        DESC 表名
        ALTER TABLE 表名 ADD 列名 数据类型 约束
        ALTER TABLE 表名 DROP 列名
        ALTER TABLE 表名 MODIFY 列名 数据类型 约束
        ALTER TABLE 表名 CHANGE 列名 新列名 数据类型 约束
        ALTER TABLE 表名 CHARACTER SET utf8
        RENAME TABLE 表名 TO 新表名
        TRUNCATE TABLE 表名
       ** 面试 **DELETE FROM 表名和 TRUNCATE table 表名区别:
       DELETE不会清空表中主键自动增长得值;
       TRUNCATE会删除表重新建立,auto_increment被重置为0;
        
        
        
DML
    INSERT INTO 表名(列名...) VALUES(值...)
    DELETE FROM 表名 WHERE 条件
    UPDATE 表名 SET 列名 = 值 WHERE 条件
DQL
    单表
        SELECT 列名 FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件 ORDER BY 列名 ASC/DESC LIMIT 索引,多少条 --
    多表
        内连接
            隐式
            SELECT 列名 FROM 表名1,表名2 WHERE 关联条件 AND 条件
            显式
            SELECT 列名 FROM 表名1 JOIN 表名2 ON 关联条件 WHERE 条件
        外链接
            SELECT 列名 FROM 表名1 LEFT JOIN 表名2 ON 关联条件 WHERE 条件
            SELECT 列名 FROM 表名1 RIGHT JOIN 表名2 ON 关联条件 WHERE 条件
        子查询
            查询嵌套查询
                条件:     单行单列,多行单列
                虚拟表     多行多列

事务:mysql语句中:
   
    START TRANSACTION;                JDBC中开启事务:connection.setAutocimmit;
     COMMIT;                          提交事务: connection.cimmit;回滚事务:connection.rollback
     rollback;                                                                                                  
                              
   

    事务四大特性:**面试**
        原子
        持久
        一致
        隔离
        
    **面试**隔离级别:read_uncommited   (脏读,不可重复读,虚读,幻读)效率最高,安全性低
            read_commiited            (不可重复读,虚读,幻读)    ORACLE:默认隔离界别
            repreatable_read          (虚读,幻读)   MYSQL:默认隔离界别                     
            seriliser                                               
jdbcjdbc


概念
    一套接口(java提供的规范) -->     要求厂商自己实现操作各自数据库的 驱动
    面向接口编程

1.注册驱动
2.获取连接
3.创建sql和执行sql的对象
4.执行sql获取结果
5.处理结果
6.释放资源

ps:
    1.ResultSet的遍历
        while(rs.next()){
            rs.getObejct(1);
            rs.getObejct("列名")
        }
    2.sql注入
        使用  PrepareStatement    配合占位符  ?
        pst.executeQuery()  --> 没有参数
        pst.executeUpdate() --> 没有参数
    3.事务
        conn.setAutoCommit(false);
        conn.commit()
        conn.rollback();
连接池连接池        C3P0                接入步骤:                        1.导jar                                1.c3p0  2个                                2.mysql驱动                        2.导入配置文件(src目录下)                                c3p0-config.xml                        3.使用                                DataSource dataSource = new ComboPooledDataSource();                                Connection con = dataSource.getConnection();               


DRUID(德鲁伊)
    接入步骤
            1.导jar
                1.druid
                2.mysql驱动
            2.导入配置文件(src)
                druid.properties
            3.使用
                Properties pro = new Properties();
                pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
                DataSource dataSource = DruidDataSourceFactory.createDataSoure(pro)
                Connection con = dataSource.getConnection();
               
               
JdbcUtils实现思路
    1.获取数据源(连接池)    DataSource
    2.获取连接对象            Connection
    3.释放资源              重载


    思路:
        1,2:
            DataSource在类加载的时候就应该初始化,为了保证对象能够及时创建,在 static{} 静态代码块中创建的对象
                Properties pro = new Properties();
                pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"))
                dataSource = DruidDataSourceFactory.createDataSoure(pro)
            
            提供返回数据源的方法 getDataSource()   ---> return dataSource
            提供返回连接       getConnection()   ---> return dataSource.getConnection()
            
        3:
            在关闭之前做非空判断!!!
JdbcTemplateJdbcTemplate        SPRING        (基于jdbc来简化数据库的操作)       

!!!如果有占位符需要传入参数

DataSource dataSource = new ComboPooledDataSource();
JdbcTemplate template = new JdbcTemplate(dataSource);
   
增删改
    template.update("sql",[具体参数]);
   
查询
    单条结果
        Map<String,Object> map = template.queryForMap("sql",[具体参数]);
        Bean bean = template.queryForObject("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);
    多条结果
        List<Map<String,Object>> list = template.queryForList("sql",[具体参数]);
        List<Bean> list = template.query("sql",new BeanPropertyRowMapper<Bean>(Bean.class),[具体参数]);






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2