SQL基础

来源:https://github.com/v-DavidTang/StudyNotes/blob/master/SQL/sql_study_notes.md
廖雪峰:https://www.liaoxuefeng.com/wiki/1177760294764384

SQL简介

SQL = Structured Query Language,访问和处理关系数据库的计算机标准语言
总的来说,SQL语言定义了这么几种操作数据库的能力:

  • DDL:Data Definition Language
    DDL允许用户定义数据,也就是创建表、删除表、修改表结构这些操作。通常,DDL由数据库管理员执行。
  • DML:Data Manipulation Language
    DML为用户提供添加、删除、更新数据的能力,这些是应用程序对数据库的日常操作。
  • DQL:Data Query Language
    DQL允许用户查询数据,这也是通常最频繁的数据库日常操作。

数据库类别

  • 关系型数据库(SQL)
  • 非关系型数据库(NoSQL)
    MongoDB, Cassandra, Dynamo

关系模型

主键

主键是关系表中记录的唯一标识。选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。

ALTER TABLE 
ADD CONSTRAINT 
PRIMARY KEY ();

外键

外键是用来关联 2 个表结构的,表直接的约束分为以下 3 种:
1.一对一
2.一对多 - 外键建立在‘多’的表中(即从表)
3.多对多 - 需要建立中间表

  • 创建外键
ALTER TABLE 
ADD CONSTRAINT 
FOREIGN KEY ()
REFERENCES classes ();
  • 删除外键
ALTER TABLE 
DROP FOREIGN KEY ;

索引

索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。

ALTER TABLE 
ADD INDEX  (, );
  • 唯一索引
ALTER TABLE 
ADD UNIQUE INDEX  ();

约束

根据业务要求,像身份号、手机号、邮箱地址等,它们具有业务含义不易作为主键,但是又具有唯一性:即不能出现两条记录存储了同一个身份证号。这个时候,就可以给该列添加一个唯一约束。

ALTER TABLE 
ADD CONSTRAINT 
UNIQUE ();

SQL 查询

不带 FROM 子句的 SELECT 语句有一个有用的用途,就是用来判断当前到数据库的连接是否有效。许多检测工具会执行一条 SELECT 1; 来测试数据库连接。
1.基本查询 - SELECT * FROM

2.条件查询 - SELECT * FROM WHERE id = 1

3.投影查询 - SELECT id, name FROM

4.排序 - SELECT * FROM ORDER BY id DESC
注意: OREDER BY 要在 WHERE 条件后

5.分页查询 - SELECT * FROM LIMIT <10> OFFSET <0>
注:pageIndex 从 1 开始,而 OFFSET从 0 开始;
LIMIT总是设定为pageSize
OFFSET计算公式为pageSize * (pageIndex - 1)

6.聚合查询 聚合函数 -COUNT(), SUM(), AVG(), MAX(), MIN() 通过 GROUP BY 进行分组 SELECT , , COUNT(*) num FROM GROUP BY , ;

7.多表查询 - SELECT * FROM , ; 获得的集合为 A 表行数 * B 表行数

8.连接查询

  • 内连接(INNER JOIN)
  • 外连接(OUTER JOIN):左连接(LEFT OUTER JOIN),右连接(RIGHT OUTER JOIN),全连接(FULL OUTER JOIN)
    image.png

SQL 修改

关系数据库的基本操作就是增删改查,即 CRUD:Create、Retrieve、Update、Delete
对于增、删、改,对应的SQL语句分别是:

  • INSERT:插入新记录 - INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
  • UPDATE:更新已有记录 - UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
  • DELETE:删除已有记录 - DELETE FROM <表名> WHERE ...;

常用SQL语句

数据库 + 表操作 SQL 语句

SQL 语句 含义
SHOW DATABASES 列出所有数据库
CREATE DATABASE 创建数据库
DROP DATABASE 删除数据库
USE 切换当前数据库
SHOW TABLES 列出所有表
DESC 查看表结构
SHOW CREATE TABLE 查看创建表的 SQL 语句
DROP TABLE 删除表
ALTER TABLE ADD COLUMN VARCHAR(10) NOT NULL 新增列
ALTER TABLE CHANGE COLUMN VARCHAR(20) NOT NULL 修改列属性
ALTER TABLE DROP COLUMN 删除列
EXIT 退出 MYSQL连接

实用 SQL 语句

  • 插入或替换 REPLACE INTO (, , <...>) VALUES(<1>, <1>, <...>)id=1 记录不存在,插入新纪录; 若id=1记录存在,当前id=1 记录被删除,然后再插入新纪录。
  • 插入或更新 INSERT INTO (, , , <...>) VALUES(<1>, <1>, <'xiao_min'>, <...>) ON DUPLICATE KEY UPDATE =<'xiao_min'>, <...>; 若 id=1 记录不存在,插入新纪录; 若id=1 记录存在,当前id=1记录被更新,更新字段有 UPDATE 指定。
  • 插入或忽略 INSERT IGNORE INTO (, , <...>) VALUES(<1>, <1>, <...>); 若 id=1记录不存在,INSERT 语句将插入新记录,否则,不执行任何操作。
  • 快照 CREATE TABLE SELECT * FROM WHERE =<1>; 通过查询集合创建新表

事务操作

多条语句作为一个整体进行操作的功能,被称为数据库事务。数据库事务可以确保该事务范围内的所有操作都可以全部成功或者全部失败。如果事务失败,那么效果就和没有执行这些 SQL 一样,不会对数据库数据有任何改动。

  • BEGIN: 开启一个事务
  • COMMIT: 提交一个事务
  • ROLLBACK: 回滚事务

隔离级别

  • 脏读 DIRTY READ: 查询同一记录,2 次结果不一样,读到还未 commit 的数据结果;
  • 不可重复读 NON REPEATABLE READ: 查询同一记录,2 次结果不一样,读到的结果在另一事务 commit/rollback 之间;
  • 幻读 PHANTOM READ:查询同一记录,2 次结果是一样,但是会出现 事务 A 新增的列,事务 B 读不到(SELECT),但是却可以更新(UPDATE),更新后才可以读到。
隔离水平 脏读 不可重复读 幻读
READ UNCOMMITTED YES YES YES
READ COMMITTED - YES YES
Repeatable Read - - YES
Serializable - - -

Serializable 虽然隔离级别最高,但是效率会大大下降。

你可能感兴趣的:(SQL基础)