数据库知识总结

一、数据库服务器设置

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:\sql\employee.sql  

# 恢复数据库
    use employee;
    source H:\sql\employee.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方法是难点,解决方案: 装饰设计模式、动态代理

常用SQL总结的更多相关文章

  1. Mysql 常用 SQL 语句集锦

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  2. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  3. 常用SQL[ORACLE]

        1.常用系统函数 2.常用sql语句 3.一些定义和关键字 4.需要注意点   1.常用系统函数 ↑ --decode decode(column,if_value,value,elseif_ ...

  4. Oracle常用SQL查询(2)

    三.查看数据库的SQL 1 .查看表空间的名称及大小 select  t.tablespace_name,  round ( sum (bytes / ( 1024 * 1024 )), 0 ) ts ...

  5. Oracle常用SQL查询

    一.ORACLE的启动和关闭 1.在单机环境下要想启动或关闭oracle系统必须首先切换到oracle用户,如下: su - oracle a.启动Oracle系统 oracle>svrmgrl ...

  6. Mysql 常用 SQL 语句集锦 转载(https://gold.xitu.io/post/584e7b298d6d81005456eb53)

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  7. 50个常用SQL语句

    50个常用SQL语句 Student(S#,Sname,Sage,Ssex) 学生表  S#学号,主键 Course(C#,Cname,T#) 课程表          C#课程号,主键 SC(S#, ...

  8. 测试常用SQL注入语句大全

    转载自Cracer,标题:<渗透常用SQL注入语句大全>,链接http://www.xxxx.com/?p=2226 1.判断有无注入点 整形参数判断 1.直接加' 2.and 1=1 3 ...

  9. oracle sqlplus及常用sql语句

    常用sql语句 有需求才有动力 http://blog.csdn.net/yitian20000/article/details/6256716 常用sql语句 创建表空间:create tables ...

  10. DBA常用SQL之DDL生成语句

    获取对象定义的包为:dbms_metadata,其中的get_ddl函数是获取对象的函数 GET_DDL函数返回创建对象的原数据的DDL语句,参数说明 .object_type ---需要返回原数据的 ...

随机推荐

  1. mysql 关联查询的执行顺序

    STRAIGHT JOIN : 能强制按照顺序关联表(应该是)

  2. python2.x与3.x差别

    数字常量: 八进制 十六进制 二进制 2:0177 0o177   0x9ff 0b101010 3:0o177 0x9ff 0b101010 多种字符串: 2:一般字符串,Unicode字符串 3: ...

  3. 总结-java

    Java核心技术总结 1.借用jar包编译java文件 javac -cp servlet-api.jar -d . HelloServlet.java

  4. yii2.0场景的使用

  5. createjs学习二之flash转canvas学习1

    设置发布 或者 导出参数设置 c_lib_main c_images_main/ 导出之后的文件 打开导出的html文件可以看到如下,,可以正常显示的,,只是stop了还不能动 给舞台上某一元素添加点 ...

  6. oracle 函数调用

    --带out的函数 create or replace function fun_try(v_name varchar,v_outname out varchar)return varchar2 is ...

  7. php 入门1

    一.php在引入文件和js引入文件的区别 1.php在引入文件是用代码控制,而js是通过标签的属性src引入: 2.php引入可以在引入下写代码,而js是不可以的 3.静态效果的js可以引入的时间,引 ...

  8. Android OnTouchListener 导致 OnClickListener 接收不到消息 无反应

    原因是onTouch返回了true把消息给消耗掉了,所以OnClickListener接收不到消息. 解决办法:onTouch返回false

  9. Asp.Net Razor中的Consistent Layout

    有意义的参考:http://www.asp.net/web-pages/tutorials/working-with-pages/3-creating-a-consistent-look Asp.ne ...

  10. C#中调用user32.dll库的keybd_Event函数,操作键盘

    keybd_event()的函数原型是: void keybd_event( byte bVk,          //虚拟键码 byte bScan,       //该键的硬件扫描码 dword ...