SQL 笔记

SQL 笔记

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 <student>
ADD CONSTRAINT <pk_id>
PRIMARY KEY (<id>);

外键

外键是用来关联 2 个表结构的,表直接的约束分为以下 3 种:

  1. 一对一
  2. 一对多 - 外键建立在‘多’的表中(即从表)
  3. 多对多 - 需要建立中间表
  • 创建外键

    ALTER TABLE <student>
    ADD CONSTRAINT <fk_class_id>
    FOREIGN KEY (<class_id>)
    REFERENCES classes (<id>);
    
  • 删除外键

    ALTER TABLE <students>
    DROP FOREIGN KEY <fk_class_id>;
    

索引

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

ALTER TABLE <students>
ADD INDEX <idx_name_score> (<name>, <score>);
  • 唯一索引

    ALTER TABLE <students>
    ADD UNIQUE INDEX <uni_name> (<name>);
    

约束

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

ALTER TABLE <students>
ADD CONSTRAINT <uni_name>
UNIQUE (<name>);

SQL 查询

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

  1. 基本查询 - SELECT * FROM <students>

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

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

  4. 排序 - SELECT * FROM <students> ORDER BY id DESC
    NOTE: OREDER BY 要在 WHERE 条件后

  5. 分页查询 - SELECT * FROM <students> LIMIT <10> OFFSET <0>
    pageSize - LIMIT
    pageIndex - OFFSET=pageSize * (pageIndex - 1), pageIndex1 开始,而 OFFSET0 开始。

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

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

  8. 连接查询

    • 内连接(INNER JOIN)
    • 外连接(OUTER JOIN)
      • 左连接(LEFT OUTER JOIN)
      • 右连接(RIGHT OUTER JOIN)
      • 全连接(FULL OUTER JOIN)
    INNER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN
    两张表都存在的记录 左表存在的记录 右表存在的记录 左右表都存在的记录

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 <database_name> 创建数据库
DROP DATABASE <database_name> 删除数据库
USE <database_name> 切换当前数据库
SHOW TABLES 列出所有表
DESC <table_name> 查看表结构
SHOW CREATE TABLE <table_name> 查看创建表的 SQL 语句
DROP TABLE <table_name> 删除表
ALTER TABLE <table_name> ADD COLUMN <column_name> VARCHAR(10) NOT NULL 新增列
ALTER TABLE <table_name> CHANGE COLUMN <column_name> VARCHAR(20) NOT NULL 修改列属性
ALTER TABLE <table_name> DROP COLUMN <column_name> 删除列
EXIT 退出 MYSQL 连接

实用 SQL 语句

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

事务操作

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

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

隔离级别

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354