-
关系数据库
概述
主流关系数据库商用oracle, SQL Server, DB2
开源:MySQL, postgreSQL等
数据模型
-层次模型
-网状模型
-关系模型
数据类型
Bight, varchar(N), json…SQL: 结构化查询语言,用来防伪和操作数据库系统.语言定义了这么几种操作数据库的能力:
DDL:Data Definition Language
DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。
DML:Data Manipulation Language
DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。
DQL:Data Query Language
DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。 -
关系模型
主键:唯一,不可修改,不使用任何业务相关的字段作为主键。因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键,因为可能会被修改。id.
id: 1.自增整数;2.全局唯一GUID.GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。
外键: 将数据与另一张表关联起来的列称为外键。外键不是通过列名实现,是通过定义外键约束实现。
通过一个表的外键关联到另一个表,我们可以定义出一对多关系。有些时候,还需要定义“多对多”关系。例如,一个老师可以对应多个班级,一个班级也可以对应多个老师,因此,班级表和老师表存在多对多关系。索引: (TODO: 原理。先mark: https://blog.csdn.net/kennyrose/article/details/7532032 )
引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。
索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。 -
查询数据
基本查询:SELECT * FROM <表名>
条件查询:SELECT * FROM <表名> WHERE <条件>
投影查询:SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM <表名> WHERE <条件>
排序:SELECT xx FROM <表名> WHERE <条件> ORDER BY <条件> DESC
分页查询:LIMIT <M> OFFSET <N>
可以对结果集进行分页,每次查询返回结果集的一部分``
聚合查询:SELECT COUNT(*) num FROM students;
(将选择出来的列名设置了别名name) 除了COUNT()函数外,SQL还提供了如下聚合函数:SUM, AVG, MAX, MIN
多表查询:SELECT * FROM <表1> <表2>
,使用多表查询可以 获取M x N行记录,要小心使用
连接查询:SELECT ... FROM <表1> ?? JOIN <表2> ON <条件...>
?? JOIN值为:
INNER JOIN是选出两张表都存在的记录
LEFT OUTER JOIN是选出左表存在的记录:
RIGHT OUTER JOIN是选出右表存在的记录:
FULL OUTER JOIN则是选出左右表都存在的记录: -
修改数据
INSERT: 向数据库表中插入新数据,可一次性插入多条值,INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...) (第二组值1,第二组值2...) ...;
UPDATE: 更新数据库表中的记录.UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
DELETE: 删除数据库表中的记录,DELETE FROM <表名> WHERE ...;
-
MySQL
包含MySQL Server 和MySQL Client, MySQL Client是一个命令行客户端,可以通过MySQL Client登录MySQL,然后,输入SQL语句并执行。
打开命令提示符,输入命令mysql -u root -p
,提示输入口令。填入MySQL的root口令,如果正确,就连上了MySQL Server,同时提示符变为mysql>
图形界面:MySQL Workbench。虽然可以直接管理MySQL,但是很多时候需要用SQL访问管理.数据库操作:
在一个运行MySQL的服务器上,实际上可以创建多个数据库(Database)。要列出所有数据库,使用命令:mysql> SHOW DATABASES;
其中,information_schema、mysql、performance_schema和sys
是系统库,不要去改动它们。其他的是用户创建的数据库。常用命令:
创建数据库:mysql> CREATE DATABASE xxx
对数据库操作时,先切换数据库:mysql> USE xxx
删除数据库:mysql> DROP DATABASE xxx
退出数据库:mysql> Exit
列出当前数据库所有表:
mysql> SHOW TABLES
查看一个表结构:mysql> DESC students
查看创建表的SQL语句:mysql> SHOW CREATE TABLE students;
创建表:CREATE TABLE
删除表:mysql> DROP TABLE students
修改表:如果要给students表新增一列birth.
ALTER TABLE students ADD COLUMN birth VARCHAR(10) NOT NULL;
修改birth.ALTER TABLE students CHANGE COLUMN birth birthday VARCHAR(20) NOT NULL;
删除列:ALTER TABLE students DROP COLUMN birthday;
sql语句
插入或替换:Replace
——记录存在就替换,不存在就插入REPLACE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);
插入或更新:
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
——记录存在就更新,不存在就插入INSERT INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99) ON DUPLICATE KEY UPDATE name=‘小明’, gender=‘F’, score=99;
插入或忽略:
INSERT IGNORE INTO ...
——记录存在就忽略,不存在就插入INSERT IGNORE INTO students (id, class_id, name, gender, score) VALUES (1, 1, ‘小明’, ‘F’, 99);
快照:——复制当前表的数据得到新表,结合CREATE TABLE和SELECT
– 对class_id=1的记录进行快照,并存储为新表students_of_class1:
CREATE TABLE students_of_class1 SELECT * FROM students WHERE class_id=1;写入查询结果集:——查询结果集需要写入到表中,结合INSERT和SELECT
创建表: CREATE TABLE statistics ( id BIGINT NOT NULL AUTO_INCREMENT, class_id BIGINT NOT NULL, average DOUBLE NOT NULL, PRIMARY KEY (id) ); 用一条语句写入各班的平均成绩: INSERT INTO statistics (class_id, average) SELECT class_id, AVG(score) FROM students GROUP BY class_id;
-
事务
执行SQL语句某些时候由于业务要求,一系列操作必须全部执行,比如转账,如果其中一条失败,则必须全部撤销。把多条数据作为整体操作的功能,叫做数据库事务。数据库事务具有ACID这4个特性:
A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
D:Duration,持久性,即事务完成后,对数据库数据的修改被持久化存储隐式事务:单条SQL语句,数据库系统自动将其作为一个事务执行,称为隐式事务。
显示事务:手动把多条SQL语句作为一个事务执行,用
BEGIN
开启事务,COMMIT
提交事务,这种事务叫做显式事务。多条SQL语句要想作为一个事务执行,就必须使用显式事务。例如转账:BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;
有些时候,我们希望主动让事务失败,这时,可以用
ROLLBACK
回滚事务,整个事务会失败:BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; ROLLBACK;
对于两个并发执行的事务,如果涉及到操作同一条记录的时候,可能会发生问题。数据库提供了4种隔离级别让我们有针对性的选择事务的隔离级别。
Read Uncommitted: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
在Read Uncommitted隔离级别下,一个事务可能读取到另一个事务更新但未提交的数据,这个数据有可能是脏数据
Read Commited: SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
在Read Committed隔离级别下,事务不可重复读同一条记录,因为很可能读到的结果不一致。
Repeatable Read:SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
幻读是指,在一个事务中,第一次查询某条记录,发现没有,但是,当试图更新这条不存在的记录时,竟然能成功,并且,再次读取同一条记录,它就神奇地出现了。
Serializable:
Serializable是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行,因此,脏读、不可重复读、幻读都不会出现。
但是,由于事务是串行执行,所以效率会大大下降,应用程序的性能会急剧降低,一般都不会使用Serializable隔离级别。
如果没有指定隔离级别,数据库就会使用默认的隔离级别。在MySQL中,如果使用InnoDB,默认的隔离级别是Repeatable Read。
注:此文是看廖雪峰老师的SQL文章做的笔记,如有侵权,可联系我删除。原文:https://www.liaoxuefeng.com/wiki/1177760294764384