SQL 基础知识扫盲
此篇总结是对之前发出的 SQL 是什么 进行补充。
进入正题之前,我想聊聊其它的知识点,一点点思考。
学习某个技能点或者是新知识点时,可以尝试建立一项知识梳理体系,如下:
- 输入:可以照葫芦画瓢,亲自动手实践。
- 分析:有自己独立的分析和思考。
- 输出:产出的内容与预期进行对比。
- 札记:记录收获过程(手写或者以电子文档形式记录)。
这张流程图制作比较粗糙,权当梳理基本知识参考。
上面也谈到了,学习新知识点。善于总结,可以使用流程图或者思维导图构建知识体系。
SQL & 数据库基础知识扫盲
一般而言,在日常工作交流中,大家所描述的 SQL 是标准 SQL(Standardized SQL),非特指某一数据库厂商(DBMS)专有语言。
SQL 是什么?
SQL 必知必会这样描述到:
SQL(发音为字母 S-Q-L 或 sequel)是 Structure Query Language(结构化查询语言)的缩写。SQL 是一种专业用于与数据库沟通交互的语言。
与其他语言(比如英语或者 Java、C、PHP 这类编程语言)不一样,SQL 中只有很少的词,这是有意而为。设计 SQL 的目的是便于完成一项任务,提供一种从数据库中读写数据的简单有效方法。
用一句话总结:SQL 是 Structure Query Language(结构化查询语言)。
维基百科这样描述到:
全称是 Structure Query Language(结构化查询语言)是一种特定目的编程语言,一般简称为 SQL。
用于管理关系数据库管理系统(RDBMS)。它是使用关系模型的数据库应用语言,由 IBM 在 20 世纪 70 年代开发出来,作为 IBM 数据库 System R 的原型关系语言,实现数据库中信息检索。
20 世纪 80 年代初,美国国家标准学会(ANSI)开始着手定制 SQL 标准。最早的 ANSI 始于 1986 年,被称为 SQL-86,在 1987 年成为国际标准化组织(ISO)标准。尽管 SQL 并非完全按照科德的关系模型设计,但其依然成为最为广泛运用的数据库语言。此后,这一标准经过了一系列的增订,加入了大量新特性。虽然有这一标准的存在,但大部分的 SQL 代码在不同的数据库系统中并不具有完全的跨平台性。
用我自己的经验总结概括:其实是将数据有规律地存放在特定容器中的一种结构化查询语言。
SQL 有哪些优点呢?
- SQL 不是某一特定数据库厂商专有语言。绝大多数流行的 DBMS 支持 SQL,所以学习标准 SQL 可以让你和大多数数据库打交道。
- SQL 简单易学。它的语句是有很强描述性的英语单词组成,而这些单词数目不多。
- SQL 看上去(入门)很简单,实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
SQL 扩展说明:许多 DBMS 厂商通过增加语句或指令,对 SQL 进行扩展,目的是提供执行特定操作的额外功能或简化方法。虽然这种扩展使用很便捷,但一般情况是针对个别 DBMS,很少有两个厂商同时支持这种扩展。列举两个例子,比如 Oracle 分页可以使用 rownum 实现,而 MySQL 分页使用 limit 关键字。
数据库是什么?
数据库
数据库(database):保存有组织数据的容器,通常是一个文件或一组文件。
tips:通常说数据库指关系型数据库(RDBMS)。
注意混淆平时工作交流,大家通常用数据库这个术语来代表使用的数据软件,这种表述不完全正确,因此产生了许多混淆。确切地说,数据库软件指数据库管理系统(DBMS) 。数据库是通过 DBMS 创建和操作的容器,它具体是什么,形式如何,各种数据库有所差异。这种差异表现在:各大数据库厂商基于标准 SQL 进行各自的扩展。
简易说明
在 MySQL 中创建数据库语法:create database db_name。而在 Oracle 数据库中创建数据库语法 create user db_name,你没看错,Oracle 中基于用户进行描述与管理。如果你在 Oracle 中使用 create database db_name,会提示数据库已装载。
表
表(table):某种特定类型数据库结构化清单。
表名
表名(table name):表名是唯一的(不可重复),实际上是数据库名和表名等的组合,数据库名理解为用户会容易接受一点。有的数据库使用数据库拥有者的名字作为唯一名的一部分,例如 Oracle、达梦数据库。在同一个数据中不能使用相同的表名,但在不同的数据库中可以使用相同的表名。
模式
模式:关于数据库和表的布局及特性的信息。
列
列(column):表中的一个字段。所有表由一个列或多列组成。
数据分解:合理将数据分解为多个列尤为重要。例如:城市、州、邮政编码总是彼此独立的列。通过分解这些数据,才有可能利用特定的列对数据进行分类和过滤(比如找出特定州或城市的所有顾客)。如果城市和州组合到一个列中,则按州分类或过滤会很困难。
当然,你可以根据自己的需求将数据分解到何种程度。例如,一般可以将街道名和门牌号一起存储到地址里,没有特殊需求是可以这样处理。如果那一天,需求发生变化,根据门牌号进行排序或过滤,最好将门牌号和街道名分开。
数据类型
数据类型:允许哪一种数据类型。每一张表中列具有相应数据类型,限制(或允许)该列中存储哪一种类型的数据。
行
行(row):表中列一条或多条记录。
主键
主键(primary key):一列(或几列),其值可以唯一标识表中每一行。
定义主键:或许并不总是需要主键,达到便于管理目的,大多数数据设计者会保证他们创建的每张表具有一个主键。
外键
外键(foreign key):用来保证参照完整性,通常在两张或多张表中存在。如果有两张表:主表(parent table)和子表(child table),在子表中拥有主表外键约束;你想同时删除两张表;MySQL 提示需要先删除约束,才能彻底删除。也有例外,比如设置了级联(cascade)。
理论知识看得再多,不如亲自实践一遍,效果来得更快。
挺身入局,实践出真知
选择
- 选择:选择一种流行且社区活跃 DBMS 厂商发行版数据库软件进行入门。
- 安装:云服务器或者本机亦或是虚拟机模拟环境。
- 初学:建议使用各大厂商自带 GUI 字符命令界面进行交互。
推荐
个人推荐学习 MySQL(MariaDB),逐步学习,深入浅出。为什么推荐入门首选学习 MySQL,上面提到了流行、社区活跃,换句话说,MySQL 资源丰富,官方文档全面,更新频繁。
关于 CRUD:增删查改
一般而言,CRUD 是指对数据库表行记录进行新增(insert)、删除(delete)、查询(select)以及修改(update)操作。
各大 DBMS 厂商数据库官方文档地址整合:
https://blog.cnwangk.top/2022/03/17/MySQL 等主流数据库厂商(DBMS)- 官方文档地址
DBMS 初体验
- MySQL(MariaDB)
- Oracle
- postgreSQL
MySQL:初体验
- 部署 MySQL;
- 检验(启动与关闭服务);
- 修改密码与权限(为第 5 步做准备);
- 字符命令界面进行交互;
- 工具:MySQL workbench、DBeaver(通用数据库管理器)或者 SQLyog;
- 基本操作(CRUD:insert、delete、update、select);
- 参考官方文档 & 官方完整 Demo 示例。
当你看到这篇教程时,MySQL 最新稳定版可能已经更新到 8.0.34,创新版 MySQL 8.1.0。
部署 MySQL8.0.x
Windows install MySQL8.0.x (Archive zip) 简易安装教程
- 解压免安装版 MySQL:
unzip mysql-8.0.x-winx64.zip - 切换到 MySQL 解压目录:
cd mysql-8.0.x-winx64 - 新增 MySQL 配置文件: my.ini
- 初始化 MySQL:
bin\mysqld --initialize-insecure或者bin\mysqld --initialize-insecure --console - 注册 MySQL 服务:
bin\mysqld --install MySQL80(将 MySQL 服务注册到 service,可以使用 net 命令进行管理) - 启动 MySQL 服务:net start MySQL80 或者 sc start MySQL80
- 登录 MySQL 字符管理界面:
mysql -uroot -p
注意:版本选择:带有 GA(General Availability)标识为稳定版,目前最新稳定是 MySQL 8.0.32 发布于 2023-01-17。x 代表使用 MySQL8.0 具体版本。打开 CMD 或者 Powershell 时以管理员身份运行,如果没有,安装服务时则会提示权限拒绝,如下所示。
D:\mysql-8.0.32-winx64\bin>mysqld --install MySQL80
Install/Remove of the Service Denied!
Windows 环境新建 my.ini 做如下设置,指定基本安装目录与数据存放目录:
1 | [mysqld] |
登录到命令行字符界面
Windows 平台打开 CMD、Powershell 或者 Windows terminal(win + x 打开 Windows 终端(管理员))
参数作用:
- -u:指定用户为 root。
- -p :回车后输入密码,如果直接输入密码回车即可登录。
- -P :指定端口号(port),默认为 3306。
Windows 平台修改 my.ini 指定 MySQL server 端口,Linux 平台修改 my.cnf 指定端口。
1 | mysql -uroot -p -P 3306 |
Linux 发行版打开终端(terminal)
1 | mysql -uroot -p -P 3306 |
输入:
1 | mysql> select 1\G |
分析:
登录到 MySQL 字符操作界面,输入 select 1\G、select 1;或者 select 1\g,会得到输出内容:1。这种情况 MySQL 不用访问表或索引,直接得到结果,通过 explain 使用执行计划(后续可以了解)可以看出 type=NULL,此时效率最高。
输出:
1 | *************************** 1. row *************************** |
提示:同样在 postgreSQL 中也是支持 select 1;或者 select 1\g,输出结果:1。
做笔记:SQL CRUD
在创建数据库(用户)、表,最好统一大小写、驼峰命名、下划线,不要混搭使用。个人给出的建议是:要么纯大写,要么纯小写,要么使用下划线进行分割。使用拼音命名库名、表名、字段名的时候(最好不要简写),如果简写,也请写好注释。比如地标性的命名北京(beijing)、上海(shanghai)、广州(guangzhou)、深圳(shenzhen),使用全拼音这是可以的,即便查询字典大概也是这样命名的,最好与你的合作团队达成统一意见。
当然,你看到我所演示 SQL 语句,关键字部分统一使用大写,库名、表名、字段名使用小写。
注释使用
1 | /** MySQL基础知识扫盲 **/ |
创建数据库
创建管理用户 study(习惯叫数据库),注意:执行更新操作时,时刻牢记数据无价,指定条件。最大程度避免给自己带来不必要的工作麻烦。
1 | CREATE DATABASE study; |
切换用户
1 | USE study; |
建表语句
创建表,在 study 用户下分别创建表:girl、books。
1 | CREATE TABLE study.girl( |
第一张表 girl:使用 CRUD 语句 & 开启显式开启事务(MySQL & MariaDB 默认开启自动 autocommit 提交)。
显式开启事务
1 | BEGIN; |
查询:标准写法,指定字段名
1 | SELECT sg.id,sg.girl_name,sg.girl_age,sg.cup_size,sg.stu_num FROM study.girl sg; |
查询:偷懒写法
1 | SELECT * FROM study.girl sg; |
插入一条数据:标准写法,指定字段名
1 | INSERT INTO study.girl(id,girl_name,girl_age,cup_size,stu_num) VALUES(1001,'梦梦','16','B','tolovemm16'); |
插入一条数据:偷懒写法
1 | INSERT INTO study.girl VALUES(1001,'梦梦','16','B','tolovemm16'); |
删除数据:指定条件
1 | DELETE FROM study.girl sg WHERE sg.id=1001; |
修改数据:指定条件
1 | UPDATE study.girl(id,girl_name,girl_age,cup_size,stu_num) sg SET sg.stu_num='toloveC16' WHERE sg.id=1001; |
回滚操作
1 | ROLLBACK; |
提交事务
1 | COMMIT; |
第二张表 books:
1 | -- 插入 |
MySQL 官方完整 Demo 示例
最后附上官方示例数据库,sakila-db 数据库一个非常完整的示例。包含:视图、函数、触发器以及存储过程,当然也存在使用外键。
sakila-db 数据库包含三个文件,便于大家获取与使用:
- sakila-schema.sql:数据库表结构;
- sakila-data.sql:数据库示例模拟数据;
- sakila.mwb:数据库物理模型,在 MySQL workbench 中可以打开查看。
用于用于简单测试学习,可以使用 world-db:
world-db 数据库,包含三张表:city、country、countrylanguage。
MySQL 官方文档(5.6、5.7、8.0)整合:
链接: https://pan.baidu.com/s/18TPW7Lan2WoJhHxWJUM3cw?pwd=bx44
提取码: bx44
Oracle:初体验
初步使用,建议掌握 Oracle 自带的字符命令操作工具 SQL plus。
其次掌握第三方管理工具 PLSQL developer,管理 Oracle 很好用,免费 30 天试用,付费软件。
个人认为,有必要了解 Oracle 自带 SQL 客户端管理工具 SQL developer,免费使用。
- SQL plus
- PLSQL developer
- SQL developer
以下将演示在 Oracle 数据库中如何构建用户、表、对数据查询、新增、修改、删除操作。
1、创建用户
创建数据库 test,在 Oracle 中指创建用户用于管理
常规(Oracle12c 是一个拐点,有 CDB 和 PDB 之分)建表用法:
1 | create user test identified by 123456; |
新版 Oracle19c(带 c,默认为 CDB 模式),新建用户
1 | create user c##test identified by 123456; |
2、授权
授予用户 test 权限 resource,connect
1 | grant resource,connect to test; |
3、建表
创建表 girl,指定了用户为 test
1 | create table test.girl( |
4、索引
添加主键索引
1 | alter table test.girl add primary key(ID); |
5、查询、新增、修改、删除
查询表 girl
1 | select * from test.girl; |
新增数据
1 | insert into test.girl values('1001','梦梦','女'); |
修改数据
1 | update test.girl t set t.ID='1002'; |
删除数据
删除表中全部数据,但不删除表结构。使用 drop 则删除表结构以及数据。
1 | delete from test.girl; |
PostgreSQL:初体验
主要熟悉 PostgreSQL 自带的 SQL shell 字符命令工具和 pgAdmin 客户端管理工具的使用。
- SQL shell
- pgAdmin
可以在我个人公众号历史文章中找到关于 PostgreSQL 入门教程。
Demo 示例
SQL 必知必会 demo 示例
官网地址:https://forta.com/books/0135182794/
涵盖 DBMS 示例:DB2、SQLserver、MySQL、Oracle、PostgreSQL、SQLite
SQL 表结构示例下载
个人整理一些资料进行整合打包。
链接: https://pan.baidu.com/s/1MHVa-oo22XKJoLmf7NrU4A
提取码: cx3p
参考资料:
- SQL 必知必会第 5 版。
最后,以上总结仅供参考哟!
——END——
