MySQL 从零开始
本文讲述从安装MySQL开始,一直到初级SQL实践
准备工作
SQL的全称是Structured Query Language,是数据库查询语言。使用在关系型数据库(DBMS)用于管理。笔者使用的MySQL是一种开源的数据库管理系统。此外,如果只是安装了MySQL则只能通过命令行进行管理。所以本文中使用了MySQL Workbench这款数据库设计和建模工具,给MySQL数据库管理系统提供可视化管理界面。
安装软件
安装MySQL
MySQL可以通过官方下载网页进行下载,安装方式和一般应用安装相似。
安装过程中会进行密码的设置,然后MySQL的管理在"系统偏好设置/MySQL"中而不是一般的"启动台"中
安装MySQL Workbench
在官方网站下载页下载后,安装即可。
安装完成后可以在启动台看到该应用"MySQL Workbench",而且进入程序之后会发现有本地的MySQL 连接。
至此,相关的安装软件工作就完成了。
学习SQL基本用法
MySQL Workbench是非常好的SQL学习工具,因为虽然它提供可视化的管理方式,让用户不需要直接接触SQL命令以及关键字,但是每一个图形界面上的操作都会被翻译成执行的SQL命令,这样对照起来很适合初学者学习。
在这里我们尝试简单地通过图形界面使用SQL。
连接上本地的SQL数据库之后可以看到如下的界面,左边部分选择了选项卡Schemas表示纲要,可以看到关于数据库的概要信息。右边是命令输入界面,在这里我们可以输入命令
首先创建数据库,通过图中的按钮,设置数据库名称,然后即可创建数据库。
然后右键Tables可以创建表(也就是关系)
设置不同的属性(列)即可创建一张空的数据表(关系)
当单机apply时,将会产生对将要执行操作的预览
在表上选择select rows将会查看表中的所有数据
通过图形界面可以直接对标中的元组(行)进行修改
这样我们就完成了MySQL Workbench的基本学习,能够通过图形界面创建数据库并且给数据库建立表并且对表中的行进行修改。
SQL
初级SQL
通过之前的方法,创建一个数据库,并且添加两张数据表
表 department
表 instructor
SQL查询基本结构
单关系查询
SELECT ID
FROM db_book.instructor;
从db_book.instructor中选择属性ID,返回一张只有属性ID的表
多关系查询
SELECT *
FROM db_book.instructor, db_book.department
where db_book.instructor.dept_name = db_book.department.dept_name;
上面表达式来源为instructor和department两个数据库,从里面筛选出dept_name属性值相等的元组,然后拼接在一起,显示所有的属性(SELECT *)
对比
如果不给出WHERE,也就是说不对拼接后的元组做任何限制,则最终的表将会是两个表的元组的笛卡尔积
每一个第一个表中的元组都和第二个表中的每一个元组依次进行拼接
自然连接
考虑到两个表中共有的属性是dept_name,自然连接将会按照两个表相同的属性拼接。
这样得到的结果和显式地指定相同的属性值相等是一样的
附加的基本运算
更名运算
通过as可以将属性名进行更改
字符串运算
一个例子,通过%o%可以筛选出名字属性中有o的元组
通过like操作符可以实现模式匹配,我们可以通过%和_两个特殊的字符来描述模式
- %匹配任意字符串
- _匹配任意一个字符
合理地,反斜杠可以进行转义
select子句属性说明
select选择属性,*表示所有属性
排序元组的显示次序
通过order by字符可以要求按照某一个属性进行排序
除了数字,字符也可以进行排序,排序的方式类似于字母序
where子句谓词
WHERE db_book.instructor.salary between 40000 and 70000;
通过上述的between比较运算符可以选择数据在一定范围内的元组
几何运算 - 并交差
并
(SELECT *
FROM db_book.instructor
WHERE db_book.instructor.salary between 40000 and 50000)
union
(SELECT *
FROM db_book.instructor
WHERE db_book.instructor.salary between 80000 and 90000)
MySQL中没有交和差关键字,只有并
聚集函数
基本聚集
基本聚集之后只有一个元组
SELECT avg(salary)
FROM db_book.instructor
分组聚集
分组聚集每个元组都会有一个结果
SELECT dept_name, avg(salary)
FROM db_book.instructor
group by db_book.instructor.dept_name;
having子句
对分组进行限定,而不是对元组进行限定
SELECT dept_name, avg(salary)
FROM db_book.instructor
group by db_book.instructor.dept_name
having avg(salary) > 30000
嵌套子查询
集合成员资格
下面请求选取出所在院系预算大于80000的教师信息
SELECT *
FROM db_book.instructor
WHERE db_book.instructor.dept_name in (select db_book.department.dept_name
from db_book.department
where db_book.department.budget > 80000)
集合的比较
下面请求选择出薪水至少比某一位来自Music学院的老师工资高的教师信息。如果使用all就可以达到和some相反的效果
SELECT *
FROM db_book.instructor
WHERE db_book.instructor.salary > some (select db_book.instructor.salary
from db_book.instructor
where db_book.instructor.dept_name = 'Music')
重复元组存在性测试
通过unique可以返回一个布尔类的表,里面每个值表示该元组是否是unique的。这样可以筛选出出现次数不大于1次的元组
(but这个结构似乎在)
数据库修改
删除
使用delete
语句即可
插入
SELECT * FROM db_book.instructor;
更新
update db_book.instructor
set db_book.instructor.salary = db_book.instructor.salary * 2;
这样所有教师的薪水都翻倍了
[注] 笔者采用的环境是MacOS,如果使用Windows,有更加好的SQL Server
参考资料
数据库系统概念