数据库基础知识
先谈发音
MySQL
如何发音?在国内
MySQL
发音有很多种,
Oracle
官方文档说他们念作
My sequal['si:kwə
l]
。
数据库基本概念
1
● 数据
数据(
Data
)是指对客观事物进行描述并可以鉴别的符号,这些符号是可识别的、抽象的。它不仅指狭义上的数字,而是有多种表现形式:字母、文字、文本、图形、音频、视频等。
2
● 数据库
数据库是数据管理的有效技术,是由一批数据构成的有序集合,这些数据被存放在结构化的数据表里。数据表之间相互关联,反映客观事物间的本质联系。
3
● 数据库管理系统
数据库管理系统(
Database Management System
,
DBMS)
是用来定义和管理数据的软件。
● 数据库应用程序
数据库应用程序(
Database Application System
,
DBAS
)是在数据库管理系统基础上,使用数据库管理系统的语法,开发的直接面对最终用户的应用程序。
5
● 数据库管理员
数据库管理员(
Database Administrator
,
DBA
)是指对数据库管理系统进行操作的人员,其主要负责数据库的运营和维护。
数据库分类
关系型数据库
关系型数据库最典型的
数据结构是表
,由
二维表
及其
之间的联系
所组成的一个数据组
织。可以采用结构化查询语言(
SQL
)对数据库进行操作。
优点:
① 易于维护:都是使用表结构,格式一致;
② 使用方便:SQL
语言通用,可用于复杂查询;
③ 复杂操作
支持SQL
,可用于一个表以及多个表之间非常复杂的查询。
缺点:
① 读写性能比较差,尤其是海量数据的高效率读写;
② 固定的表结构,灵活度稍欠;
③ 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
非关系型数据库
非关系型数据库也称之为
NoSQL
数据库,是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
① 格
式灵活:存储数据的格式可以是
key,value
形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
② 速度快:nosql
可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
③ 高扩展性;
④ 成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
① 不提供sql支持,学习和使用成本较高;
② 无事务处理;
③ 数据结构相对复杂,复杂查询方面稍欠。
MySQL
基础知识
MySQL简介
MySQL
是一个关系型数据库管理系统, 由瑞典
MySQL AB
公司开发, 目前属于 Oracle
公司。
MySQL
是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表 中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL
特点
MySQL
是开源的。
MySQL
支持大型系统的数据库。可以处理拥有上千万条记录的大型数据库。 MySQL
使用标准的
SQL
数据语言形式。
MySQL
可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C
、
C++
、
Python
、
Java
、
Perl
、
PHP
等。
MySQL
存储数据量较大,
32
位系统表文件最大可支持
4GB
,
64位系统支持最大的表文件为 8TB
。
MySQL
是可以定制的,采用了
GPL
协议,你可以修改源码来开发自己的 MySQL
系统。
MySQL
分类
① MySQL分为社区版
社区版是完全开源免费的,社区版也支持多种数据类型和标准的SQL查询语言,能够对数据进行各种查询、增加、删除、修改等操作,所以一般情况下社区版就可以满足开发需求了。 ② 企业版
② 企业版是收费的。即使在开发中需要用到一些付费的附加功能,价格相对于昂贵的 Oracle、
DB2
等也是有很大优势的。对数据库可靠性要求比较高的企业可以选择企业版。
下载
MySQL
MySQL
官网地址:
mysql.com

MySQL的安装与卸载
MySQL安装


MSQL
卸载
连接MySQL

通过
MySQL
自带客户端工具
可通过
MySQL
自带的客户端工具链接
MySQL
。
通过客户端工具可对
MySQL
进行操作。
通过
MySQL
客户端工具的快捷方式连接
MySQL
Navicat工具的使用

SQL
语言
SQL
语言简介
结构化查询语言
(Structured Query Language)
简称
SQL(
发音: sequal['si:kwə
l])
,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL
能做什么?
● SQL 面向数据库执行查询
● SQL 可在数据库中插入新的记录
● SQL 可更新数据库中的数据
● SQL 可从数据库删除记录
● SQL 可创建新数据库
● SQL 可在数据库中创建新表
● SQL 可在数据库中创建存储过程
● SQL 可在数据库中创建视图
● SQL 可以设置表、存储过程和视图的权限
SQL
标准
SQL
是
1986
年
10
月由美国国家标准局(
ANSI
)通过的数据库语言美国标准,接着,国际标准化组织(ISO
)颁布了
SQL
正式国际标准。1989
年
4
月,
ISO
提出了具有完整性特征的
SQL89
标准,1992 年
11
月又公布了
SQL92
标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。在 1999
年推出
99
版标准。 最新版本为 SQL2016
版。比较有代表性的几个版本:
SQL86
、 SQL92、
SQL99
。
SQL
语言分类
① 数据查询语言(DQL:
Data Query Language
)其语句,也称为“数据检索语句
”
,用以从表中获得数据,确定数据怎样在应用程序给出。关键字 SELECT
是
DQL
(也是所有
SQL
)用得最多的动词。
● SELECT
● FROM
● WHERE
● ORDER BY
● HAVING
② 数据操作语言(DML:
Data Manipulation Language
)其语句包括动词 INSERT
,
UPDATE
和
DELETE
。它们分别用于添加,修改和删除表中的行。
● INSERT:添加数据
● UPDATE:更新数据
● DELETE:删除数据
③ 数据定义语言(DDL:
Data Definition Language
)定义数据库对象语言,其语句包括动词 CREATE
和
DROP
等。
● CREATE:创建数据库对象
● ALTER:修改数据库对象
● DROP:删除数据库对象
④ 数据控制语言(DCL:
Data Control Language
)它的语句通过GRANT 或
REVOKE
获得许可,确定用户对数据库对象的访问。
● GRANT:授予用户某种权限
● REVOKE:回收授予的某种权限
⑤ 事务控制语言(TCL :
Transaction Control Language
)它的语句能确保被 DML
语句影响的表的所有行及时得以更新。
● COMMIT:提交事务
● ROLLBACK:回滚事务
● SAVEPOINT:设置回滚点
注意:
数据操纵语言DML
(
insert
、
update
、
delete
)针对表中的数据 ;而数据定义语言DDL
(
create
、
alter
、
drop
)针对数据库对象,比如数据库database
、表
table
、索引
index
、视图
view、
存储过程procedure
、触发器
trigger
;
SQL
语言语法
① SQL语句不区分大小写,关键字建议大写。
② SQL语句可以单行或多行书写,以分号结尾。
创建与删除数据库
创建数据库
① 使用DDL语句创建数据库

示例:
创建一个test 的数据库,并查看该数据库,以及该数据库的编码。
创建数据库:
查看数据库:

查看数据库编码:

② 使用Navicat创建数据库
示例:
创建一个test2 的数据库。


删除数据库
① 使用DDL语言删除数据库

示例:
删除
test
数据库
② 使用Navicat删除数据库
示例:
删除
test2
数据库
选择数据库
在创建表时,需要先选择数据库。

示例:
创建一个名称为 bjsxt 的数据库,编码为 utf8。

选择该数据库。

MySQL中的数据类型

整数类型
MySQL数据类型 | 含义(有符号) |
tinyint(m) | 1个字节 范围(-128~127) |
smallint(m) | 2个字节 范围(-32768~32767) |
mediumint(m) | 3个字节 范围(-8388608~8388607) |
int(m) | 4个字节 范围(-2147483648~2147483647) |
bigint(m) | 8个字节 范围(+-9.22*10的18次方) |
数值类型中的长度 m 是指显示长度,并不表示存储长度,只有字段指定 zerofill 时有用
例如: int(3) ,如果实际值是 2 ,如果列指定了 zerofill ,查询结果就是 002 ,左边用 0 来 填充
浮点类型
MySQL数据类型 | 含义 |
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
字符类型
MySQL数据类型 | 含义 |
char(n) | 固定长度,最多255个字符 |
tinytext | 可变长度,最多255个字符 |
varchar(n) | 可变长度,最多65535个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
char
和
varchar
:
① char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定长。
② varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
③ text不设置长度, 当不知道属性的最大长度时,适合用
text
。
按照查询速度: char
最快,
varchar
次之,
text
最慢。
字符串型使用建议:
① 经常变化的字段用
varchar
② 知道固定长度的用
char
③ 尽量用
varchar
④ 超过
255
字符的只能用
varchar
或者
text
⑤ 能用
varchar
的地方不用
text
日期类型
MySQL数据类型 | 含义 |
date | 日期 YYYY-MM-DD |
time | 时间 HH:MM:SS |
datetime | 日期时间 YYYY-MM-DD HH:MM:SS |
timestamp | 时间戳YYYYMMDD HHMMSS |
二进制数据(BLOB)
① BLOB和TEXT存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写。
② BLOB存储的数据只能整体读出。
③ TEXT可以指定字符集,BLOB不用指定字符集。
创建表与删除表
创建表
① 使用DDL语句创建表

示例:
创建一个 employees 表包含雇员 ID ,雇员名字,雇员薪水。

查看已创建的表。

② 使用Navicat创建表
示例:
创建
employees2
表。

删除表

① 使用DDL语句删除表

示例:
删除
employees
表。
② 使用Navicat删除表
示例:
删除employees2表

修改表
修改表名

① 使用DDL语句修改表

示例一:
创建一个
employees
表包含雇员
ID
,雇员名字,雇员薪水。
示例二:
将
employees
表名修改为
emp
。
② 使用Navicat修改列名
选择表按F2

修改列名
使用
① DDL语句修改列名

示例:
将 emp 表中的 employee_name 修改为 name。

② 使用Navicat修改列名

修改列类型

① 使用DDL语句修改列类型

示例:
将 emp 表中的 name 的长度指定为 40。

② 使用Navicat修改列类型

添加新列

① 使用DDL语句添加新列

示例:
在
emp
表中添加佣金列,列名为
commission_pct
。
② 使用Navicat添加新列

删除指定列

① 使用DDL语句删除指定的列

示例:
删除
emp
表中的
commission_pct
。
② 使用Navicat删除指定的列

MySQL中的约束

约束概述
数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。
① 主键约束(Primary Key) PK
主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键。主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息。例如,学生信息表中的学号是唯一的。
②
外键约束(Foreign Key) FK
外键约束经常和主键约束一起使用,用来确保数据的一致性。
③
唯一性约束(Unique)
唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。与主键约束不同的是,唯一约束在一个表中可以有多个,并且设置唯一约束的列是允许有空值的。
④
非空约束(Not Null)
非空约束用来约束表中的字段不能为空。
⑤
检查约束(Check)
检查约束也叫用户自定义约束,是用来检查数据表中,字段值是否有效的一个手段,但目前 MySQL
数据库不支持检查约束。
添加主键约束
(Primary Key)
① 单一主键
使用一个列作为主键列,当该列的值有重复时,则违反唯一约束。
② 联合主键
使用多个列作为主键列,当多个列的值都相同时,则违反唯一约束。
修改表添加主键约束
1.使用DDL语句添加主键约束
示例:
将 emp 表中的 employee_id 修改为主键。

主键自增长
MySQL 中的自动增长类型要求:
① 一个表中只能有一个列为自动增长。
② 自动增长的列的类型必须是整数类型。
③ 自动增长只能添加到具备主键约束与唯一性约束的列上。
④ 删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然后在删除约束。

示例:
将
emp
表中的
employee_id
主键修改为自增。
2.使用Navicat添加主键约束

删除主键
① 使用DDL语句删除主键

注意:
删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后在删除 主键。
示例:
删除
emp
表中的
employee_id
主键约束。
去掉自动增长:
删除主键:

2.使用Navicat删除主键

添加外键约束(Foreign Key)

修改表添加外键约束
① 使用DDL语句添加外键约束

示例一:
创建 departments 表包含 department_id 、department_name ,location_id。

示例二:
修改departments表,向department_id列添加主键约束与自动递增。

示例三:
修改 emp 表,添加 dept_id 列。

示例四:
向
emp
表中的
dept_id
列添加外键约束。
2.使用Navicat添加外键约束

删除外键约束
1.使用DDL语句删除外键约束。
示例:
删除 dept_id 的外键约束。

2.使用Navicat删除外键约束

添加唯一性约束(Unique)
修改表添加唯一性约束
1.使用DDL语句添加唯一性约束。
示例:
向 emp 表中的 name 添加唯一约束。

2.使用Navicat添加唯一性约束

删除唯一性约束
1.使用DDL语句删除唯一性约束。

示例:
删除
name
的唯一约束。
2.使用Navicat删除唯一性约束。

非空约束(Not Null)
修改表添加非空约束
1.使用DDL语句添加非空约束。
示例:
向 emp 表中的 salary 添加非空约束。

2.使用Navicat添加非空约束。

删除非空约束
1. 使用DDL语句删除非空约束。

示例:
删除
emp
表中
salary
的非空约束。
2
2. 使用
Navicat
删除非空约束。

创建表时添加约束
查询表中的约束信息:
示例:
创建 depts 表包含 department_id 该列为主键且自动增长,department_name 列不 允许重复,location_id 列不允含有空值。

MySQL中DML操作

添加数据(INSERT)
1.选择插入

示例:
向 departments 表中添加一条数据,部门名称为 market ,工作地点 ID 为 1。

2.完全插入

注意:
如果主键是自动增长,需要使用 default 或者 null 或者 0 占位。
示例一:
向 departments
表中添加一条数据,部门名称为
development ,
工作地点 ID
为
2
。使用
default
占位。
示例二:
向 departments 表中添加一条数据,部门名称为human ,工作地点 ID 为 3 。使用 null 占 位。

默认值处理(DEEFAULT)
在 MySQL 中可以使用 DEFAULT 为列设定一个默认值。如果在插入数据时并未指定该列的值,那么 MySQL 会将默认值添加到该列中。
创建表时指定列的默认值
示例:
创建 emp3 表,该表包含 emp_id 主键且自动增长,包含 name ,包含 address 该列默认 值为”未知”。

修改表添加新列并指定默认值

示例:
修改
emp3
表,添加
job_id
该列默认值为
0。
插入数据时的默认值处理
如果在插入数据时并未指定该列的值,那么
MySQL
会将默认值添加到该列中。如果是 完全项插入需要使用 default
来占位。
示例:
向
emp3
表中添加数据,要求
address
列与
job_id
列使用默认值作为该列的值。
更新数据(UPDATE)

注意:
更新语句中一定要给定更新条件,否则表中的所有数据都会被更新。
示例:
更新
emp3
表中的
id
为
1
的数据,添加
address
为
BeiJing
。
删除数据(DELETE)
DELETE
删除数据
注意:
在
DELETE
语句中,如果没有给定删除条件则会删除表中的所有数据。
示例:
删除
emp3
表中
emp_id
为
1
的雇员信息。
TRUNCATE
清空表
示例:
删除
emp3
表中的所有数据。
清空表时DELETE与 TRUNCATE 区别
● truncate 是整体删除(速度较快), delete 是逐条删除(速度较慢);
● truncate 不写服务器 log,delete 写服务器 log,也就是 truncate 效率比 delete 高的原因;
● truncate 是会重置自增值,相当于自增列会被置为初始值,又重新从
1
开始记录,而不是接着原
来的值。而
delete
删除以后, 自增值仍然会继续累加。
MySQL
查询数据
SELECT
基本查询
SELECT
语句的功能
SELECT
语句从数据库中返回信息。使用一个
SELECT
语句,可以做下面的事:
列选择:能够使用
SELECT
语句的列选择功能选择表中的列,这些列是想要用查询返回的,当查询时,能够返回列中的数据。
行选择:能够使用
SELECT
语句的行选择功能选择表中的行,这些行是想要用查询返回的。能够使用不同的标准限制看见的行。
连接:能够使用
SELECT
语句的连接功能来集合数据,这些数据被存储在不同的表中,在它们之间可以创建连接,查询出我们所关心的数据。
SELECT
基本语法
基本
SELECT
语句
在最简单的形式中,
SELECT
语句必须包含下面的内容:
● 一个 SELECT
子句,指定被显示的列
● 一个 FROM
子句,指定表,该表包含
SELECT
子句中的字段列表
在语法中:
语句 | 含义 |
SELECT | 是一个或多个字段的列表 |
* | 选择所有的列 |
DISTINCT | 禁止重复 |
column | expression | 选择指定的字段或表达式 |
alias | 给所选择的列不同的标题 |
FROM table | 指定包含列的表 |
添加测试数据
将
data.sql
文件通过
Navicat
导入到
MySQL
中
itbz
数据库中。
查询中的列选择
选择所有列
用跟在 SELECT 关键字后面的星号 (*),你能够显示表中数据的所有列。
示例:
查询
departments
表中的所有数据。
选择指定列

能够用 SELECT 语句来显示表的指定列,指定列名之间用逗号分隔。
示例:
查询
departments
表中所有部门名称。
查询中的算术表达式
需要修改数据显示方式,如执行计算,或者作假定推测,这些都可能用到算术表达式。一个算术表达式可以包含列名、固定的数字值和算术运算符。
使用算术运算符
示例:
查询雇员的年薪,并显示他们的雇员ID,名字。
运算符的优先级
如果算术表达式包含有一个以上的运算,乘法和除法先计算。如果在一个表达式中的运算符优先级相同,计算从左到右进行。可以用圆括号强制其中的表达式先计算。
示例一:计算 employees 表中的员工全年薪水加 100 以后的薪水是多少,并显示他们的员工ID与名字。

示例二:计算 employees 表中的员工薪水加 100 以后的全年薪水是多少,并显示他们的员工ID与名字。
MySQL
中定义空值
如果一行中的某个列缺少数据值,该值被置为 null, 或者说包含一个空。
空是一个难以获得的、未分配的、未知的,或不适用的值。空和 0 或者空格不相同。 0 是一个数字,而空格是一个字符。
算术表达式中的空值
示例:
计算年薪包含佣金。
MySQL中的别名
使用列别名
示例:
查询
employees
表将雇员
last_name
列定义别名为
name
。
使用表别名

示例:
查询
employees
表为表定义别名为
emp
,将雇员
last_name
列定义别名为 name
。
MySQL中去除重复

除去相同的行

示例:
查询
employees
表,显示唯一的部门
ID
。
查询中的行选择

用 WHERE 子句限制从查询返回的行。一个 WHERE 子句包含一个必须满足的条件,WHERE 子句紧跟着 FROM 子句。如果条件是true,返回满足条件的行。
在语法中:
WHERE 限制查询满足条件的行
condition
由列名、表达式、常数和比较操作组成
示例:
查询 departments 表中部门 ID 为 90 的部门名称与工作地点 ID。
MySQL中的比较条件

符号 != 也能够表示 不等于条件。
示例一:
查询
employees
表中员工薪水大于等于
3000
的员工的姓名与薪水。
示例二:
查询 employees 表中员工薪水不等于 5000 的员工的姓名与薪水。
其他比较条件

使用BETWEEN条件

可以用 BETWEEN 范围条件显示基于一个值范围的行。指定的范围包含一个下限和一个上限。
示例:
查询
employees
表,薪水在
3000-8000
之间的雇员
ID
、名字与薪水。
使用IN条件

示例:
查询
employees
表,找出薪水是
5000,6000,8000
的雇员
ID
、名字与薪水。
使用LIKE条件

示例:
查询
employees
中雇员名字第二个字母是
e
的雇员名字。
使用
NULL
条件
NULL 条件,包括 IS NULL 条件和 IS NOT NULL 条件。
IS NULL 条件用于空值测试。空值的意思是难以获得的、未指定的、未知的或者不适用的。因此,你不能用 = ,因为 null 不能等于或不等于任何值。
示例一:
找出
emloyees
表中那些没有佣金的雇员雇员
ID
、名字与佣金。
示例二:
找出 employees 表中那些有佣金的雇员ID、名字与佣金。

逻辑条件
逻辑条件组合两个比较条件的结果来产生一个基于这些条件的单个的结果,或者逆转一个单个条件的结果。当所有条件的结果为真时,返回行。
SQL
的三个逻辑运算符是:
● AND
● OR
● NOT
可以在
WHERE
子句中用
AND
和
OR
运算符使用多个条件。
示例一:
查询
employees
表中雇员薪水是
8000
的并且名字中含有
e
的雇员名字与薪水。
示例二:
查询 employees 表中雇员薪水是 8000 的或者名字中含有e 的雇员名字与薪水。
示例三:
查询 employees 表中雇员名字中不包含 u 的雇员的名字。
优先规则
在图片的例子中,有两个条件:
● 第一个条件是 job_id 是 AD_PRES 并且薪水高于 15,000。
● 第二个条件是
job_id
是
SA_REP
。
在图片中的例子有两个条件:
● 第一个条件是 job_id 是 AD_PRES 或者 SA_REP 。
● 第二个条件是薪水高于$15,000
使用
ORDER BY
排序
在一个不明确的查询结果中排序返回的行。ORDER BY 子句用于排序。如果使用了 ORDER BY 子句,它必须位于 SQL 语句的最后。
SELECT
语句的执行顺序如下:
●
FROM 子句
● WHERE 子句
● SELECT 子句
●
ORDER BY 子句
示例一:
查询
employees
表中的所有雇员,显示他们的
ID
、名字与薪水,并按薪水升序排序。
示例二:
查询
employees
表中的所有雇员,显示他们的
ID
与名字,并按雇员名字降序排序。
使用别名排序
示例:
显示雇员
ID
,名字。计算雇员的年薪,年薪列别名为
annsal
,并对该列进行升序排序
多列排序

示例:
以升叙排序显示
DEPARTMENT_ID
列,同时以降序排序显示SALARY 列。