文章目录
- Day01-数据类型和运算符
- 学习目标
- 1. 数据库介绍
- 1.1 数据库的发展历史
- 1.2 数据库分类
- 1.2.1 关系型(SQL)数据库
- 1.2.2 非关系型(NoSQL)数据库
- 1.2.3 数据库排名
- 2. MySQL服务器的安装
- 2.1 MySQL介绍
- 2.2 下载
- 2.3 安装
- 2.4 启动服务器
- 2.5 卸载
- 3. MySQL客户端
- 3.1 使用命令行客户端连接
- 3.2 使用图形化工具连接
- 4. 数据类型
- 4.1 整型
- 4.2 浮(定)点型
- 4.3 字符串类型
- 4.4 枚举(enum)
- 4.5 集合(set)
- 4.6 时间类型
- 4.7 布尔型
- 5. 运算符
- 5.1 算数运算符
- 5.2 比较运算符
- 5.3 逻辑运算符
- 5.4 位运算
- 6. MySQL的语法规范
Day01-数据类型和运算符
学习目标
- 能够说出数据库的概念
- 能够说出什么是关系型数据库
- 能够安装卸载和配置MySQL数据库
- 能够使用IDEA客户端连接到MySQL服务器
- 能够说出MySQL里常见的数类型
- 能够使用MySQL里的运算符进行查询
1. 数据库介绍
数据库是“按照数据结构来组织、存储和管理数据的仓库”,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
简单来说,就是一个用来存储数据的仓库。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。
数据库用来存储体量庞大的数据,为了更高效的存储和查询这些数据,这些数据必须要按照一定的规则来存放。数据库管理系统就是为管理数据库而设计的软件系统,一般具有存储、截取、安全保障、备份等基础功能。市场上比较流行的数据库管理系统产品主要是Oracle、IBM、Microsoft和Sybase、Mysql等公司的产品。
1.1 数据库的发展历史
在关系型数据库出现之前,主要是网状数据库(Network Databases)和层次数据库(Hierarchical Databases)。最早出现的是网状DBMS,是美国通用电气公司Bachman等人在1961年开发成功的IDS(Integrated DataStore),网状数据库模型对于层次和非层次结构的事物都能比较自然的模拟,当时网状DBMS要比层次DBMS用得更普遍。在数据库发展史上,网状数据库占有重要地位。
层次型数据库紧随网络型数据库出现。最著名最典型的层次数据库系统是IBM公司在1968年开发的IMS(Information Management System),一种适合其主机的层次数据库。这是IBM公司研制的最早的大型数据库系统程序。
1970 年,IBM研究员E.F.Codd博士在刊物Communication of the ACM上发表了一篇名为“A Relational Modelof Data for Large Shared Data Banks”的论文,提出了关系模型的概念,奠定了关系模型的理论基础。
1970年关系模型建立之后,IBM公司在San Jose实验室增加了更多的研究人员研究这个项目,这个项目就是著名的System R,目标是论证一个全功能关系DBMS的可行性。(该项目结束于1979年,完成了第一个实现SQL的DBMS)。
1973年加州大学伯克利分校的Michael Stonebraker 和EugeneWong利用System R已发布的信息开始开发自己的关系数据库系统Ingres(ORACLE数据库的雏形)。
由于当时IBM实验室的体制(IBM的研究人员大多是学术出身,他们最感兴趣的是理论和学术成果,而非推向市场的产品),以及当时IBM对IMS的承诺,IBM并不是第一个发布商用关系型数据库的公司。第一个商用关系型数据库是由霍尼韦尔公司在1976年发布Multics Relational Dat a Store(非SQL标准语句)。
1978年 Ellison (埃里森) 在为中央情报局做一个数据项目时,仔细阅读了 codd 发表的“R系统:数据库关系理论”,这个论文主要介绍了关系数据库理论和查询语言SQL。Ellison 看完后,敏锐意识到在这个研究基础上可以开发商用软件系统。而当时大多数人认为关系数据库不会有商业价值。而就在几个月后,Oracle 1.0 诞生了,Oracle 这个名字也来源于他们曾给中央情报局做过的项目名。
直到1985年IBM才发布了关系数据库 DB2,那时 oracle 已经占有了很大的市场,Ellison 已经成了千万富翁。1989年,微软发布了 SQL Server 1.0 版。三大商用关系型数据库的发布年份,也正好对应了市场占有率的排名。
1.2 数据库分类
早期较为时兴的数据库种类有三种,分别是层次式数据库、网络式数据库和关系型数据库。而在如今的互联网中,最常见的数据库种类主要有2种,即关系型数据库和非关系型数据库。
1.2.1 关系型(SQL)数据库
SQL 全拼为 Structured Query Language, 即 “结构化查询语言”。SQL语言诞生于1974年,是IBM提出的,但是关系型数据库在1970年已经出现,在没有出现SQL语言之前当时的查询语言依赖于复杂的数学逻辑和符号,查询语言成为关系型数据库发展的一个主要瓶颈,SQL的出现使没有接受过数学和计算机编程正规训练的用户也能简便的使用。
SQL 是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
数据库 | SQL 类型 | 公司 |
---|---|---|
Oracle | PL/SQL | 甲骨文 |
MySQL | My/SQL | 甲骨文 |
SQL-Server | T-SQL | 微软 |
Access | SQL | 微软 |
SQLite | 内嵌型小型数据库 | 移动前端用的比较多 |
1.2.2 非关系型(NoSQL)数据库
关系型数据数据库有它的优点,但是也存在一些缺点,例如:当字段不固定时,关系型数据库处理起来很麻烦;对高并发读写的支持比较差;对简单查询需要快速返回结果的处理。随着互联网技术Web2.0的兴起,这些缺点越来越突出,因此出现了针对大规模数据量场景,以性能卓越和应用便捷为目的的的数据库产品——NOSQL数据库。
非关系型数据库主要是根据“非关系实体模型”的数据库,也称之为NoSQL数据库,NOSQL的原意是“Not only SQL”,而不是“NoSQL”的含意,因而,NoSQL的出现并不是要完全否认关系型数据库,只是做为传统关系型数据库的一个合理补充。NOSQL数据库在特殊的情景下能够充分发挥出无法想象的高效率和卓越性能。
最常见非关系型数据库有 Redis 和 MangoDB.
本次学习的重点以 甲骨文公司的 MySQL 数据库为例来研究关系型数据库的使用。
1.2.3 数据库排名
以下是2019年DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:(查看数据库最新排名:https://db-engines.com/en/ranking)
2. MySQL服务器的安装
在使用数据库之前,需要先安装数据库管理软件。MySQL数据库管理软件支持多个平台的安装,我们的课程中以Windows系统下的MySQL安装设置为例,如果想要了解(类)Unix和(类)Linux平台下,MySQL的安装方式,请自行上网查询。
2.1 MySQL介绍
MySQL是一种开放源代码的关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。而2009年,SUN又被Oracle收购。目前 MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,使得很多互联网公司选择了MySQL作为网站数据库。
MySQL主要分为两大版本:
- 企业版(Enterprise Edition):功能齐全,但是收费,而且费用不便宜……
- 社区版(Community Edition):功能相对比较简单,开源免费。
我们学习过程中使用MySQL社区版,目前社区版最新的版本号是8.0.27(截止至2021年12月)。
注意:MySQL8其实是MySQL5.8的别名,由于在MySQL5.8中,增加和修改了很多功能,版本号直接修改为了8.0. 所以,MySQL5.7和8.0只相差了一个大版本,而不是3个。
2.2 下载
MySQL官方下载地址: https://dev.mysql.com/downloads/windows/installer/ 选择自己想要安装的MySQL版本,推荐下载 8.0.27 版本的安装器。
注意:下载选项里只有32位的安装器,如果是64位的系统也不会影响。我们在这儿下载的只是安装器,在运行安装器的时候,会根据系统的版本自动选择安装32位还是64位的MySQL.
2.3 安装
-
双击运行 mysql-installer-community-8.0.27.1.msi 文件。 .msi 和 .exe 一样,都是Windows里的可执行文件。
-
选择
Custom
,点击Next
,选择要安装的MySQL程序。在这一步中,虽然选择了只安装 MySQL Server,但是同时也会自动安装 MySQL的客户端。 -
不断的点击
Next
或者Execute
按钮,执行下一步操作,直到输入密码页面。注意:要牢记密码,登录MySQL服务器时需要使用!
-
点击
Next
或者Execute
直到MySQL安装完成并启动。
2.4 启动服务器
右键我的电脑
–>管理
–> 服务和应用程序
–>服务
,找到MySQL80这个服务,查看服务的状态。通常情况下,MySQL安装完成以后会自动启动MySQL服务器,如果此时服务器状态不是正在运行
,可以右键这个服务,选择启动
,将MySQL服务器开启。
2.5 卸载
-
停止MySQL服务:右键
我的电脑
–>管理
–>服务和应用程序
–>服务
,找到MySQL80这个服务,然后右键选择停止。 -
在控制面板中找到MySQL8.0相关软件,右键进行卸载。
-
找到MySQL的相关文件夹,默认会有
C:\Program Files\MySQL
和C:\ProgramData\MySQL
,删除这两个文件夹。 -
上面三步完成以后,MySQL就已经从本机上卸载了。但是此时如果 右键
我的电脑
–>管理
–>服务和应用程序
–>服务
,依然能够看到MySQL80这个服务存在。此时需要在DOS界面使用sc delete MySQL80
即可将服务删除。 -
删除环境变量里的MySQL配置。
3. MySQL客户端
连接MySQL服务器通常有两种方式:
- 使用命令行连接
- 使用图形化页面工具连接
推荐大家使用命令行工具连接,而不是使用图形化页面工具。
3.1 使用命令行客户端连接
- 在启动MySQL客户端之前,还需要将 MySQL 客户端添加到环境变量中。
-
在DOS命令行中执行命令,连接到MySQL服务器。
mysql -h 主机IP地址 -P 端口号 -u 用户名 -p回车 Enter Password:密码
其中,如果服务器的主机是localhost的话,
-h 主机名
可以省略;如果在配置时没有修改默认端口,使用的是3306,-P 端口号
也可以省略。
3.2 使用图形化工具连接
常用的图形化工具有:
-
MySQL Workbench: 这个也是MySQL自带的工具,可以使用图形化页面来连接和操作数据库。注意:需要在安装MySQL时,选择安装WorkBench才能使用。
-
Navicat MySQL是最常见的一款用来操作MySQL数据的图形化页面工具(收费)
-
SQLYog 也是一款功能强大的图形化页面工具。
-
IDEA自带的数据库处理功能。
4. 数据类型
SQL也是一种计算机语言,它也有自己支持的数据类型。
4.1 整型
-
一个无符号数一定是非负数
create table t3( age tinyint unsigned );
-
显示宽度 (zerofill)
整型显示宽度, 位数不足时用 0 填充
create table t4( id int(10) zerofill primary key auto_increment, name char(32) ); insert into t4 values(12345, '5个'); insert into t4 values(1234567890, '10个'); insert into t4 values(123456789012, '12个'); select * from t4;
4.2 浮(定)点型
定点数的位数更加长
- float(M,D)
- double(M,D)
- decimal(M,D)
- M 是支持多少个长度, D 是小数点后面的位数
create table t5 (
a float(10, 2),
b double(10, 2),
c decimal(10, 2)
);
4.3 字符串类型
CHAR
与 VARCHAR
类型的区别:
-
允许的最大值范围不同。
注意:
<span style="color:red">无论是char(n)还是varchar(n),n表示的都是字符数,而不是字节数。</span>
- char(n)类型里,无论数据库使用的是哪种编码方式,n的最大取值都只能取到255.
- varchar(n)类型里,如果使用的是Latin1编码,最大值允许到65535(但是实际取值只能到65532,还要保留三个字节用来记录长度);如果使用的是UTF8编码,最大值允许到21845(但是实际取值只能到21844,还要保留一个字符用来记录长度)。
-
数据库内存存储的长度不同。
- char(n)类型里,无论输入的内容是什么,存储的长度都是 n个字符。例如,数据类型char(10),写入字符串’张三’,在数据库里存入的数据长度是10个字符。
- varchar(n)类型里,存储的长度是不固定可变的。
-
对于空格的处理不同。
- char类型在存储字符串时,会将右侧末尾的空格去掉。
- varchar类型在存储字符串时,会将右侧末尾的空格保留。
create table student (id int primary key auto_increment ,name char(20),city varchar(20)); -- 创建数据表 insert into student values(0,' zhangsan ',' shanghai '); -- 插入数据 select concat(id,name,'good') from student where id=1; /* 从查询的结果中可以看到,name左侧的空格保留了,但是右侧的空格被去掉了 +------------------------+ | concat(id,name,'good') | +------------------------+ | 1 zhangsangood | +------------------------+ */ select name,length(name) from student where id=1; /* 从查询的结果中可以看到,长度只包括左边的空格,不包括右边的空格 +------------+--------------+ | name | length(name) | +------------+--------------+ | zhangsan | 10 | +------------+--------------+ */ select concat(id,city,'good') from student where id=1; /* 从查询的结果中可以看到,city右侧的空格也保留了 +------------------------+ | concat(id,city,'good') | +------------------------+ | 1 shanghai good | +------------------------+ */ select city,length(city) from student where id=1; /* 从查询的长度中也可以看到,city两端的空格都被保留了 +-----------------+--------------+ | city | length(city) | +-----------------+--------------+ | shanghai | 15 | +-----------------+--------------+ */
其他类型字符串使用注意事项:
- binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串,不支持模糊查询之类的。
- 一般在保存少量字符串的时候,我们会选择char和varchar;而在保存较大文本时,通常会选择使用text或blob系列。blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时,会在数据表中留下很大的“空洞”,为了提高性能,建议定期时候用optimize table功能对这类表进行碎片整理。可以使用合成的(Synthetic)索引来提高大文本字段的查询性能,如果需要对大文本字段进行模糊查询,MySql提供了前缀索引。但是仍然要在不必要的时候避免检索大型的blob或text值。
4.4 枚举(enum)
多选一的时候使用的一种数据类型
在前端使用单选框的时候, 枚举类型可以发挥作用
枚举类型的优点:
- 限制了可选值
- 节省空间
- 运行效率高
create table t6(
name varchar(32),
sex enum('男','女','保密') default '保密'
);
-- 枚举类型的计数默认从1开始
insert into t6 set name='王宝强',sex=1;
4.5 集合(set)
SET最多可以有64个不同的成员。类似于复选框, 有多少可以选多少。
create table t7 (
name varchar(32),
hobby set('吃','睡','玩','喝','抽')
);
insert into t7 values('张三','睡,抽,玩,吃,喝');
insert into t7 values('李四','睡,抽');
4.6 时间类型
-
datetime
create table datetime_test ( create_at datetime ); insert into datetime_test values('2019-4-2 16:54:00'); insert into datetime_test values('2019/4/2 16:54:00'); insert into datetime_test values(now()); -- 年份最大支持4个长度 insert into datetime_test values('10000/4/2 16:54:00'); -- 错误 insert into datetime_test values('9999/4/2 16:54:00');
-
time
create table time_test ( create_at time ); insert into time_test values('12:12:12'); insert into time_test values('100:12:12'); insert into time_test values('-100:12:12'); insert into time_test values('10 10:12:12'); -- 时间的范围是: [-838:59:59 - 838:59:59] insert into time_test values('839:12:12'); -- 错误的
-
timestamp 时间戳类型
- 时间戳类型在显示方面和datetime是一样的, 在存储上不一样
- 范围从 1970-1-1 0:0:0 到 2038-1-19 11:14:07
- 时间戳使用 4 个字节表示
- 该值大小与存储的位长有关: 2 ** (4 * 8 - 1)
create table timestamp_test ( create_time timestamp ); insert into timestamp_test values(now()); insert into timestamp_test values('2038-1-19 11:14:07'); -- 时间戳最大值 insert into timestamp_test values('2038-1-19 11:14:08'); -- 错误
-
year
create table `year`( create_at year);-- 从1900年开始 - 1900+255 insert into `year` values(now());insert into `year` values('2155'); -- 年份最大值 insert into `year` values('2156'); -- 错误
4.7 布尔型
mysql中的bool类型其实就是数字类型。使用0表示false,非0就表示true.
create table `bool`(cond boolean);
insert into `bool` set cond=True; -- 成功
insert into `bool` set cond=False; -- 成功
insert into `bool` set cond=1; -- 成功
insert into `bool` set cond=10; -- 成功
insert into `bool` set cond=-1; -- 成功
insert into `bool` set cond=0; -- 成功
insert into `bool` set cond=0.1; -- 成功
insert into `bool` set cond='True'; -- 失败
5. 运算符
MySQL中同样也支持运算符。
5.1 算数运算符
select 123 + 543, 321 * 5, -456 / 2, 10 % 3, 2 / 0, 3 % 0;
/* 输出:
+-----------+---------+-----------+--------+-------+-------+
| 123 + 543 | 321 * 5 | -456 / 2 | 10 % 3 | 2 / 0 | 3 % 0 |
+-----------+---------+-----------+--------+-------+-------+
| 666 | 1605 | -228.0000 | 1 | NULL | NULL |
+-----------+---------+-----------+--------+-------+-------+
1 row in set, 2 warnings (0.00 sec)
*/
5.2 比较运算符
-
常规比较
select 1=2, 2<3, 3<=4, 4>5, 5>=3, 8!=9, 8<>9, 'abc' = 'Abc', 'z' > 'a'; /* 输出: +-----+-----+------+-----+------+------+------+---------------+-----------+ | 1=2 | 2<3 | 3<=4 | 4>5 | 5>=3 | 8!=9 | 8<>9 | 'abc' = 'Abc' | 'z' > 'a' | +-----+-----+------+-----+------+------+------+---------------+-----------+ | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | +-----+-----+------+-----+------+------+------+---------------+-----------+ 1 row in set (0.00 sec) */
-
范围比较
select 123 between 100 and 200, 'b' in ('a', 'b', 'c'); /* 输出 +-------------------------+------------------------+ | 123 between 100 and 200 | 'b' in ('a', 'b', 'c') | +-------------------------+------------------------+ | 1 | 1 | +-------------------------+------------------------+ 1 row in set (0.04 sec) */
-
Null 比较:判断是否是Null时,不能使用
=
,而要使用is
,或者<=>
select 12 is null, 23 = null, null = null, null <=> null, null is null, 32 is not null; /* 输出 +------------+-----------+-------------+---------------+--------------+----------------+ | 12 is null | 23 = null | null = null | null <=> null | null is null | 32 is not null | +------------+-----------+-------------+---------------+--------------+----------------+ | 0 | NULL | NULL | 1 | 1 | 1 | +------------+-----------+-------------+---------------+--------------+----------------+ 1 row in set (0.00 sec) */
-
模糊比较: like
select 'HelloWorld' like 'hello%'; /* 输出 +----------------------------+ | 'HelloWorld' like 'hello%' | +----------------------------+ | 1 | +----------------------------+ 1 row in set (0.00 sec) */
-
正则比较:regexp
select "good" regexp "go{2}d"; /*输出 +------------------------+ | "good" regexp "go{2}d" | +------------------------+ | 1 | +------------------------+ 1 row in set (0.01 sec) */
5.3 逻辑运算符
select 1 < 2 && 5 < 4, 4 > 1 || 5 < 7, !3 > 2,4 > 5 xor 4 < 3;
/* 输出
+----------------+----------------+--------+-----------------+
| 1 < 2 && 5 < 4 | 4 > 1 || 5 < 7 | !3 > 2 | 4 > 5 xor 4 < 3 |
+----------------+----------------+--------+-----------------+
| 0 | 1 | 0 | 0 |
+----------------+----------------+--------+-----------------+
1 row in set (0.00 sec)
*/
5.4 位运算
MySQL中同样支持位运算。需要注意的是,MySQL在运算时,不会根据运算数据的类型来决定到底是位运算还是逻辑运算。 <span style="color:red">&&是逻辑运算,而&是位运算符,两个运算符不能混用。</span>
select 1 < 2 & 5 < 4,1 < 2 && 5 < 4;
/*输出
+---------------+----------------+
| 1 < 2 & 5 < 4 | 1 < 2 && 5 < 4 |
+---------------+----------------+
| 1 | 0 |
+---------------+----------------+
*/
6. MySQL的语法规范
-
mysql是否区分大小写
MySQL的关键字和函数名等不区分大小写。但是对于数据值是否区分大小写,和校对集规则有关。
- ci(大小写不敏感)
- cs(大小写敏感)
- _bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)
-
字段命名规则:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号
-
建议不要使用mysql的关键字等来作为表名、字段名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来
-
数据库和表名、字段名等对象名中间不要包含空格
-
同一个MySQL服务器中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名。
-
标点符号:
- 必须成对
- 必须英文状态下半角输入方式
- 字符串和日期类型可以使用单引号’’
- 列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略
- 如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。
-
SQL脚本中如何加注释
- 单行注释:#注释内容
- 单行注释:–空格注释内容 其中–后面的空格必须有
- 多行注释:
/* 注释内容 */
规范
-
mysql是否区分大小写
MySQL的关键字和函数名等不区分大小写。但是对于数据值是否区分大小写,和校对集规则有关。
- ci(大小写不敏感)
- cs(大小写敏感)
- _bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)
-
字段命名规则:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号
-
建议不要使用mysql的关键字等来作为表名、字段名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来
-
数据库和表名、字段名等对象名中间不要包含空格
-
同一个MySQL服务器中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名。
-
标点符号:
- 必须成对
- 必须英文状态下半角输入方式
- 字符串和日期类型可以使用单引号’’
- 列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略
- 如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。
-
SQL脚本中如何加注释
- 单行注释:#注释内容
- 单行注释:–空格注释内容 其中–后面的空格必须有
- 多行注释:
/* 注释内容 */