zoukankan      html  css  js  c++  java
  • 常用SQL总结


    数据库知识总结


    一、数据库服务器设置

    1,查看数据库服务器编码
        show variables like 'character%';

    2,设置数据库服务器编码
        set character_set_server = utf8; //默认的内部操作字符集
        set character_set_client = gbk; //客户端来源数据使用的字符集
        set character_set_results = gbk; //查询结果字符集
        set character_set_connection = utf8; //连接层字符集
        set character_set_database = utf8; //当前选中数据库的默认字符集
        set character_set_system = utf8; //系统元数据(字段名等)字符集

        注意:
            character_set_client 指的是客户端来源数据所用的编码
            dos窗口输入中文使用的是gbk,所以应当指定set character_set_client = gbk;
        指定其他码表会造成乱码(解码错误),从而出现向数据库插记录时,字段长度超出限制
        的错误。
            同时,由于插入数据用的是gbk,将数据查询结果显示出来的时候,也要使用gbk
        故 set character_set_results = gbk; 否则会乱码,依旧是解码错误。

        · 不能直接在dos窗口中设置,因为这样的设置是临时的,下次进去就失效了
        应该在my.ini 中修改 default-character-set=gbk (第57行),再重启服务器。

    3,查看数据库服务器校对规则
        show variables like 'collation%';

    4,设置数据库服务器校对规则
        set collation_connection = utf8_general_ci; //指定连接层校对规则
        set collation_database = utf8_general_ci; //指定数据库校对规则
        set collation_server = utf8_general_ci; //指定服务端校对规则


    ---------------------------------------------------------------------------

    二、针对数据库database的SQL操作 (CRUD, create delete update read)

    1,创建(create)

    # 创建数据库 employee (使用默认的字符集和校对规则)
        create database employee;

    # 创建一个使用utf-8字符集的数据库 employee
        create database employee character set utf8;

    # 创建一个使用utf-8字符集,并且校对规则为 utf8_general_ci 的数据库 employee
        create database employee character set utf8 collate utf8_general_ci;


    2,删除(drop)
        
    # 删除数据库 employee
        drop database if exists employee;


    3,修改(alter)

    # 修改数据库 employee的字符集为 gbk
        alter database employee character set gbk;

    # 修改数据库 employee的校对规则为 utf8_bin;
        alter database employee collate utf8_bin;


    4,查询(show)

    # 查看当前服务器中所有的数据库
        show databases;

    # 查看数据库 employee的定义信息
        show create database employee;


    5,数据库备份(备份的是数据,而不是数据库)

    # 数据库备份(将数据导出,需要退出mysql命令)
        mysqldump -uroot -proot employee > H:sqlemployee.sql  

    # 恢复数据库
        use employee;
        source H:sqlemployee.sql  //执行该文件中的每条语句


    -------------------------------------------------------------------

    mysql常用的数据类型

    数值类型                                说明
        BIT(M)  bit            位类型,M指定位数,不指定默认1,范围1-64
        TINYINT  byte        带符号的范围-128 -> 127, 不带符号的范围 0 -> 255
        SMALLINT  short
        INT  int
        BIGINT  long
        FLOAT  float
        DOUBLE  double
        BOOL  boolean        使用0 和 1 表示真假
    文本,二进制类型
        CHAR(size)            固定长度字符串,不足就填空格
        VARCHAR(size)        变长字符串,最常用
        BLOB                  二进制数据
        LONGBLOB            二进制数据
        TEXT                 大文本
    日期类型
        DATE                 日期类型(yyyy-MM-dd等)
        DATETIME             
        TIMEStamp            时间戳(自动记录insert,update操作时间)

    -------------------------------------------------------------------

    三、针对数据库表 table的 SQL操作

    1,创建(create)

    # 创建一张名称为 emp_1的表
        create table emp_1
        (
            id int,
            name varchar(20),
            gender varchar(6),
            birthday date,
            entry_date date,
            job varchar(20),
            salary float,
            resume text
        );

    # 创建一张名为 emp_2的表,并指定数据库引擎为 MYISAM,
        create table emp_2
        (
            id int,
            name varchar(20),
            gender varchar(6),
            birthday date,
            entry_date date,
            job varchar(20),
            salary float,
            resume text
        ) ENGINE=MYISAM ;

    # 创建一张名为 emp_3的表,并指定数据库字符集为 gbk,
        create table emp_3
        (
            id int,
            name varchar(20),
            gender varchar(6),
            birthday date,
            entry_date date,
            job varchar(20),
            salary float,
            resume text
        ) charset=gbk ;

    2,删除(drop)

    # 删除 emp_1表
        drop table if exists emp_1;


    3,修改(alter)

    # 增加 email列
        alter table emp_1 add email varchar(30);

    # 修改 email列为 varchar(40)
        alter table emp_1 modify email varchar(40);

    # 删除 gender列
        alter table emp_1 drop gender;

    # 修改表名为 employee_1
        rename table emp_1 to employee_1;

    # 修改表的字符集为 gbk
        alter table emp_1 character set gbk;

    # 将列名由birthday改为 birth (类型也可以同时修改)
        alter table emp_1 change birthday birth varchar(20);


    4,查询(show)

    # 查看该数据库下的所有表
        show tables;

    # 查看 emp_1表的定义信息 (创建语句)
        show create table emp_1;

    # 查看 emp_1表的结构 (列名,类型,主键,约束等信息)
        desc emp_1;


    ---------------------------------------------------------------------

    四、针对数据库记录的SQL操作

    以下表为例
        +------+--------+---------+---------+------+
        |    id   |  name  |  chinese | english   | math  |
        +------+--------+---------+---------+------+
        |    1    | 张小明  |      89    |      78    |   90   |
        |    2    | 李进     |      67    |      53    |   95   |
        |    3    | 王五     |      87    |      78    |   77   |
        |    4    | 李一     |      88    |      98    |   92   |
        |    5    | 李四     |      82    |      84    |   67   |
        |    6    | 张三     |      55    |      85    |   45   |
        |    7    | 黄蓉     |      75    |      65    |   30   |
        +------+--------+---------+---------+-------+



    1,增加(insert)

    # 向 student表中插入一条记录
         insert into student(id,name,chinese,english,math) values(7,'黄蓉',75,65,30);


    2,删除(delete)

    # 删除student 表中全部记录
        delete from student;

    # 删除student 表中语文分数大于80的学生记录(使用where子句)
        delete from student where chinese > 80;

    # 删除student 表中语文成绩是 55分,75分,和67分的学生记录
        delete from student where chinese in(55,75,67);


        

    3,修改(update)

    # 将student 表中名叫张三的人改成张小三
        update student set name = '张小三' where name = '张三';
        
    # 将student表中所有人的数学分数修改为 90分    
        update student set math = 90;

    # 将student 表中名叫张三的学生数学成绩修改为 100分
        update student set math = 100 where name = '张三';

    # 将student 表中 id为 1 的学生,语文和英语都改成 80分
        update student set chinese = 80, english = 80 where id = 1;

    # 将student 表中名为张三的学生,语文成绩在原来的基础上加 10 分
        update student set chinese = chinese + 10 where name = '张三';



    4,查看(select)
        
    # 查看student 表中的所有记录(所有列名都显示)
        select * from student;

    # 查看student 表中的所有学生的姓名和语文成绩
        select name, chinese from student;

    # 查询student表中所有出现的数学成绩 (过滤表中重复信息)
        select distinct math from student;

    # 统计每个学生的总分
        select name, chinese+math+english as count from student;

    # 在student 表中使用别名来表示总分
        select *, chinese+math+english sum from student;

    # 查询姓名为张三的学生成绩
        select * from student where name = '张三';

    # 查询英语成绩大于90 分的学生信息
        select * from student where english > 90;

    # 查询总分大于250 分的学生
        select *, chinese+math+english from student where chinese+math+english > 250;
        
    # 查询英语成绩在90 - 100分之间的学生
        select * from student where english between 90 and 100;

    # 查询语文成绩为88 和 87 的学生信息
        select * from student where chinese in(88,87);

    # 查询所有姓李的学生
        select * from student where name like '李%';

    # 查询所有姓张的,而且姓名是三个字的学生
        select * from student where name like '张__';

    # 查询所有英语大于90,语文大于85的学生
        select * from student where chinese > 85 and english >90;

    # 按语文成绩从高到低排序
        select * from student order by chinese desc;

    # 按总成绩从低到高排序
        select *, chinese+math+english as sum from student order by chinese+math+english;

    # 统计一个班有多少名学生
        select count(*) from student;

    # 统计英语成绩大于80的人有多少个
        select count(*) from student where english > 80;

    # 统计总分大于250分的人数
        select count(*) from student where chinese+math+english > 250;

    # 统计一个班的数学总成绩
        select sum(math) from student;

    # 统计一个班各科总成绩
        select sum(chinese), sum(math), sum(english) from student;

    # 统计一个班级语文、英语、数学的成绩总和
        select sum(chinese+math+english) from student;

    # 统计一个班级语文成绩平均分
        select sum(chinese)/count(chinese) from student;

    # 查询语文分数最高
        select max(chinese) from student;

    # 查询英语分数最低
        select min(english) from student;

    # 查询语文平均分
        select avg(chinese) from student;


    ------------------------------------------------------------------------------

    限定查询

    1,where
        单个条件时,可以使用 not进行反选
        多个条件时,可以使用 and 和 or 来作为查询条件
            可以使用in(x,y,z)来限定值是某个,而不是某一区间

        select * from student     where name = '张三';
        select * from student     where math > 70 and english > 80;
        select * from student     where chinese > 70 or math > 80;
        select * from student     where not english < 60;
        select * from student     where chinese in(87,88,89);

    2,between ... and ...
        在某一区间内查找, 包括左右端点

        select * from student where english between 80 and 98;
        select * from student where english > 80 and english < 98;

    3, is null 或者 is not null
        判断为null

        select * from student where english is null;
        select * from student where english is not null;

    4, in操作符
        指定查询范围

        select * from student     where chinese in(87,88,89);

    5,like操作符
        用于模糊查询
        "_":匹配任意的一个字符;
        "%":匹配任意多个字符,可以是0个、1个或多个;

        各种数据类型都可以使用LIKE子句进行模糊匹配
        在使用like 子句的时候如果不设置任何的查询关键字,则表示查询全部:

        show variables like 'character%';
        select * from student where name like '%%'; //查询全部学生
        select * from student where english like '9%';

    --------------------------------------------------------------------

    排序

    1,order by [asc|desc ]
        asc 升序排列,默认是asc
        desc 降序排列

        select * from student order by chinese;


    -------------------------------------------------------------------

    表的约束
        在创建表时,同时为字段增加约束,可以对将来插入的数据做一些限定

    1,唯一约束  unique
        该字段是唯一的,不允许重复

    2,非空约束  not null

    3,主键约束  primary key
        主键必须有唯一约束,非空约束

        ·每张表都应该有个主键,方便我们通过主主键找到记录(通常是id字段)
        ·主键可以定义为自动增长, 注意主键类型必须是int
        ·如果表中有字段值重复或者为空的情况,无法添加主键

            create table aaa
            (
                id int primary key auto_increment,
                name varchar(20)
            );


            //没有设置主键时,通过修改表结构来增加主键
            alter table table_name add primary key(id);


            //删除主键
            alter table table_name drop primary key;


            //创建联合主键
            create table bbb
            (
                firstname varchar(20),
                lastname varchar(20),
                primary key(firstname, lastname)
            );


    4, 外键约束
        一张表的某一列的数据需要参照另外一张表的某一列
        ·如员工表的部门编号是按照部门表的编号来制定的

    # 部门表
    create table dept
    (
        deptno int primary key,
        dname varchar(30)
    );

    insert into dept (deptno, dname) values (1, '人事部');
    insert into dept (deptno, dname) values (2, '市场部');

    # 员工表
    create table emp
    (
        id int primary key auto_increment,
        ename varchar(30),
        deptno int,
        constraint deptno_FK foreign key(deptno) references dept(deptno)
    );

    insert into emp (ename, deptno) values ('张三',1);
    insert into emp (ename, deptno) values ('李四',1);
    insert into emp (ename, deptno) values ('王五',2);

    insert into emp (ename, deptno) values ('赵六',3);
    --> ERROR 1452 (23000): Cannot add or update a child row: a foreign key
    constraint fails (`test_sql`.`emp`, CONSTRAINT `deptno_FK` FOREIGN KEY
    (`deptno`) REFERENCES `dept` (`deptno`))


    //为aaa表添加外键,引用bbb表中的id字段

    create table aaa
    (
        id int primary key auto_increment,
        name varchar(20)
    );

    create table bbb
    (
        id int primary key auto_increment,
        name varchar(20),
        aaa_id int
        # constraint aaa_id_FK foreign key(aaa_id) references aaa(id)
    );

    # 为 bbb表添加引用 aaa表 id字段的外键
    alter table bbb add constraint aaa_id_FK foreign key(aaa_id) references aaa(id);

    # 删除外键
    //先删除外键名,再删外键字段(mysql官方提供)
    alter table bbb drop foreign key aaa_id_FK;
    alter table bbb drop aaa_id;


    ------------------------------------------------------------------------

    如何根据java对象去设计表

    1,每个javabean 对应一张表

    2,表之间的关联关系


    一对一
        分清主从关系,外键放在从的一方


    一对多
        外键放在多的一方


    多对多
        建立中间表以描述关系
        中间表需要两列,作为联合主键,同时又是外键分别参照两张表的主键


    -------------------------------------------------------------------
    oracle常用函数

    1,字符串函数

        upper(str)   将输入的字符串变为大写返回
        lower(str)   小写
        initcap(str) 首字母大写
        length(str)  字符串长度
        substr(列名,开始点,结束点)  字符串截取
        replace(列名,原始值,替换值) 字符串替换


    2,数学函数

        round()    四舍五入
        trunc()    截取小数
        mod()      取模


    3,日期函数

        months_between(日期1,日期2)    求出两个日期之间的月数:
        add_months(日期,月数)            求出若干月之后的日期
        last_day(日期)                    求出指定日期的最后一天
        next_day(日期,星期X)            求出下一个指定星期的日期


    4, 转换函数

        to_char()         将日期或数字变为字符串显示
        to_date()         将字符串变为日期型数据
        to_number()     将字符串变数字型数据


    5, 通用函数

        nvl()         处理null的数据
        decode()     多值处理函数



    ----------------------------------------------------------------------

    JDBC (Java Database Connectivity)


    1,实现JDBC程序

        (1) 创建数据库,表及记录
        (2) 导入数据库驱动  mysql-connector-java-5.1.7-bin.jar
        (3) 编写java程序


    ---------------------------------------------------------------------

    事务

    1,什么是事务
        所谓事务,就是针对数据库的一组操作(多条sql)
        位于同一个事务的操作具备同步的特点,也就是要么都成功,要么都失败


    2,事务的作用
        在实际中,我们的很多操作都是需要由多条sql来共同完成的,例如,A账户给B账户转账
    就会对应两条sql
        update account set money=money-100 where name=‘a’;
        update account set money=money+100 where name=‘b’;

        假设第一条sql成功了,而第二条sql失败了,这样就会导致a账户损失了100元,而b账户
    并未得到100元
        如果将两条sql放在一个sql中,当第二条语句失败时,第一条sql语句也同样不会生效,
    这样a账户就不会有任何的损失


    3. 事务的实现原理
        默认情况下,我们向数据库发送的sql语句是会被自动提交的,开启事务就是相当于关闭
    自动提交功能,改为手动提交,我们只需要将提交事务的操作放在最后一个操作,这样一来,
    如果在提交事务之前出现异常,由于没有执行提交操作,事务中未提交的操作就会被回滚掉


    4,事务相关SQL (在dos命令行窗口执行)

    开启事务  start transaction;
    事务提交  commit;
    事务回滚  rollback;

    注意:
        如果开了一个事务, 又敲了一次 start transaction,前一个事务会自动提交


    5、在程序中使用 jdbc 开启事务

    在使用 jdbc 操作数据库时,需要使用 Connection 对象对事务进行管理
    // 开启事务
    Connection.setAutoCommit(false);    //设置自动提交为false
    // 回滚事务
    Connection.rollback();    
    //提交事务
    Connection.commit();    

    在 jdbc 程序中我们还可以设置回滚点, 让事务回顾到指定的回滚点,而不是自动回滚所有未提交的操作
    需要将程序中的异常捕获,在catch语句块中回滚事务,在finally中提交事务
    注意 , 将 Commit 操作放在 finally 中是为了保证提交未回滚的事务操作


    6. 事务的特性

    事务有四大特性,一般来讲,判断一个数据库是否支持事务,就看数据库是否支持这四个特性

    原子性(Atomicity)
        原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    一致性(Consistency)
        事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

    隔离性(Isolation)
        事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被
    其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

    持久性(Durability)
        持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使
    数据库发生故障也不应该对其有任何影响。


    7. 事务的隔离级别

    1)多线程开启事务
        由于数据库是多线程并发访问的,所以很容易出现多个线程同时开启事务的情况
        多线程开事务容易引起 赃读、不可重复读、幻读 的情况发生

    赃读:dirty read
        脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交
    到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
        
    不可重复读:non-repeatable read
        是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问
    该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一
    个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是
    不一样的,因此称为是不可重复读。

    幻读:phantom read    又名虚读
        是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了
    修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种
    修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有
    没有修改的数据行,就好象发生了幻觉一样。

    幻读只是在理论上会发生的一种情况,而现实操作中并不是一定会发生

    2)设置事务的隔离级别
        为了避免多线程开事务引发的问题,我们需要将事务进行隔离
        事务有四种隔离级别,不同的隔离级别可以防止不同的错误发生

        serializable:可串行化,能避免脏读、不可重复读、幻读情况的发生
        repeatable read:可重读,能避免脏读、不可重复读情况的发生
        read committed:读取提交的内容,可避免脏读情况发生
        read uncommitted:读取未提交的内容最低级别,避免不了任何情况


    在数据库服务器中进行设置:

        设置事务隔离级别
        set   transaction isolation level
        查询当前事务隔离级别
        select @@tx_isolation    

        查询看到的都是快照
        位于事务中的多次查询,如果隔离级别设置为repeatable read,那么多次查询读的
    就是一个快照(快照不更新)


    ----------------------------------------------------------------------------

    数据库连接池

    1,什么是连接池
        连接池就是数据库连接对象的一个缓冲池
        使用数据库连接池可以极大地提高系统的性能

    2. 实现数据库连接池
        jdbc针对数据库连接池也定义的接口java.sql.DataSource,所有的数据库连接池实现
    都要实现该接口
        该接口中定义了两个重载的方法
        Connection getConnection()
        Connection getConnection(String username, String password)

    数据库连接池实现思路
     1) 定义一个类实现java.sql.DataSource接口
     2) 定义一个集合用于保存Connection对象,由于频繁地增删操作,用LinkedList比较好
     3) 实现getConnection方法,在方法中取出LinkedList集合中的一个连接对象返回
    注意:
        返回的Connection对象不是从集合中获得,而是删除
        用户用完Connection,会调用close方法释放资源,此时要保证连接换回连接池,而不是关闭连接
        重写close方法是难点,解决方案: 装饰设计模式、动态代理




  • 相关阅读:
    MyBatis 中#{}和${}区别
    MyBatis缓存机制
    SpringBoot整合RabbitMQ
    Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer的区别
    Docker安装MySql
    Python3网络爬虫(七):使用Beautiful Soup爬取小说
    python3 爬虫内涵段子
    python3 爬虫百度贴吧
    Python3网络爬虫(五):Python3安装Scrapy
    Requests: 模块
  • 原文地址:https://www.cnblogs.com/yufann/p/Note1.html
Copyright © 2011-2022 走看看