1、数据库概述
1.1、数据库管理系统(DBMS)
数据库管理系统,英文单词DatabaseManagementSystem,简称DBMS。数据库管理系统是专门用来管理数据库中数据的,数据库管理系统可以对数据库当中的数据进行增删改查。
常见的数据库管理系统:MySQL、Oracle、DB2、SqlServer…
1.2、数据库(DB)
数据库,英文单词database,简称DB。按照一定的格式存储数据的一些文件的组合。顾名思义:存储数据的仓库,实际上就是一堆文件。这些文件中存储了具有特定格式的数据。
1.3、SQL(结构化查询语言)
SQL,全称(Structured Query Language),SQL用来和数据库打交道,完成和数据库的通信,SQL是一套标准。但是每一个数据库都有自己的特性是别的数据库没有,当使用这个数据库特性功能时,这时SQL语句可能就不是标准了(90%以上的SQL都是通用的)。
1.4、数据库与数据库管理系统的关系
数据库管理系统可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据,一般会在数据库创建多个表,以保存程序中实体用户的数据。
数据库管理系统、数据库和表的关系如图所示:
1.5、关系型数据库设计原则
关系型数据库的典型数据结构就是数据表
,这些数据表的组成都是结构化的。
将数据放到表中,表再放到库中。
一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
表具有一些特性,这些特性定义了数据在表中如何存储,类似Java中”类”的设计。
1.5.1、表、记录、字段
E-R(entity-relationship,实体-联系)模型中有三个概念:实体集
、属性
、联系集
。
一个实体集(class)对应于数据库中的一个表(table),一个实例(instance)则对应于数据表中的一行(row),也称为一条记录(record)。一个属性(attribute)对应于数据表中的一列,也称为一个字段(field)。
:::success
🎨ORM思想(Object Relational Mapping)体现:
数据库中一个表 <—> Java中的一个类
表中的一条数据 <—> Java类的一个实例
表中的一列 <—> 类中的一个字段|属性
:::
1.5.2、表的关联关系🎯
表与表之间的数据记录有关系。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。共有4种关系:一对一关联、一对多关联、多对多关联、自我引用。
1.5.2.1、一对一(one-to-one)
在实际的开发中应用不多,因为一对一可以创建成一张表。
如:设计学生表
,学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急联系人…。拆分成两个表,两个表中的记录是一一对应关系。
基础信息表
(常用信息):学号、姓名、手机号码、班级、系别档案信息表
(不常用信息):学号、身份证号码、家庭住址、籍贯、紧急联系人…
两种建表原则:
- 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。
- 外键是主键:主表的主键和从表的主键,形成主外键关系。
1.5.2.2、一对多关系(one-to-many)
如:部门表和员工表
。员工表:员工编号、姓名、….、所属部门;部门表:部门编号、名称、简介。
一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。
1.5.2.3、多对多关系(many-to-many)
要表示多对多关系,必须创建第三个表,该表通常称为中间表
,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。
多对多关系建表原则:需要创建第三张表,中间表至少两个字段,这两个字段分别作为外键指向各自一方的主键。
如:用户和角色表
。一个用户可以拥有多个角色,而一个角色可以被多个用户拥有。
1.5.2.4、自我引用(self reference)
2、MySQL环境搭建
2.1、数据库卸载与安装
2.1.1、卸载
建议使用geek软件进行卸载原来安装的MYSQL,不会该软件的百度一下就知道。
2.1.2、安装
去官网下载.
双击运行软件,出现如下界面。
我们选择自定义选项,点击next。
只需要选择MySQL Server 8.0.28 - X64即可,然后点击右边选择的MySQL Server 8.0.28 - X64,即可出现下面的Advanced Options
选项,用于选择MYSQL安装位置与数据存放位置。
自定义安装位置与数据存放位置之后,点击Ok,回到上一个界面,点击next。就开始准备安装MYSQL。
正在安装…
安装完成。
准备配置MYSQL服务器。
Type And NetWorking.保持默认选项即可,点击next。
MYSQL8.x与MYSQL5.x相比更换了密码加密方式,保持默认即可,点击next。
为root用户设置密码,开发环境就设置简单点就行,密码就123456,设置完成就点击next。
MYSQL作为windows服务,配置MYSQL服务的名称以及是否开机自启。保持默认即可,点击next。
开始执行配置,点击execute。
执行配置中…,可以通过查看Log来了解配置详细过程以及错误。
好了,配置失败,别急,我们看下Log是哪里失败,然后将失败信息拷贝去百度一下。MySQL error 1042: Unable to connect to any of the specified MySQL hosts.
百度之后说,打开将MYSQL80服务的属性,将登录身份改成本地系统账户。
重新点击execute,执行配置。发现配置完成!🍺🍺🍺
至此,MYSQL服务器就安装完毕!查看是否安装成功,执行mysql --version
查看MYSQL版本号。发现居然报错,提示不认识mysql命令。
这时就得将MYSQL/bin目录的绝对路径添加到系统环境变量Path中,方便在命令行界面中的任意目录下都可以访问该命令。
配置完成之后,重新打开cmd界面,再次运行mysql --version
命令,发现打印出mysql的版本号,表示安装没有问题!
2.2、服务器程序与客户端程序
MySQL安装目录下的bin
目录下有很多可以执行执行文件,有一些是服务器程序,有一些是客户端程序。
2.2.1、服务器程序
在安装MySQL的时候,在Windows Service的配置阶段,我们将MySQL的服务器程序配置为名为MYSQL80的Windows服务,之后就可以在服务管理器(图形界面)或者命令行管理器中(使用net start
或者net stop
命令)来启动或者关闭Windows服务器程序。这个MySQL服务器程序其实指的就是MySQL安装目录下的bin目录下的mysqld
可执行文件。
我们来试试使用mysqld命令来启动服务器程序,以管理员身份打开cmd,运行mysqld --datadir="D:\devsoft\MySQL\DATA\Data" --console
命令,其中的datadir中的内容为自定义安装时数据的目录。
发现居然报错,问题就出在使用命令行启动时,得先关掉服务器程序或者你没有使用管理员身份启动cmd。
此时这个状态就代表MySQL服务器已经成功启动。如果此时把cmd命令行界面关掉或者使用Ctrl+c都会关闭MySQL服务器。发现使用mysqld启动或者关闭MySQL服务器程序比较麻烦,所以还是推荐使用Windows服务的方式来启动或者关闭MySQL服务器程序。
2.2.2、客户端程序
在bin
目录下,有很多客户端程序,比方说mysqladmin、mysqldump、mysqlcheck等等。这里要重点关注的是mysql可执行文件,可以通过这个可执行文件与服务器程序进行交互,也就是发送请求以及接受服务器的处理结果。
启动这个可执行文件时一般需要一些参数,格式如下:
mysql -h主机名 -u用户名 -p密码
其中各个参数的含义:
参数名 | 含义 |
---|---|
-h | 表示启动服务器程序的计算机的域名或者IP地址,如果服务器程序在本机运行的话,可以省略这个参数,也可以填写localhost或者127.0.0.1;还可以写成”—host=主机”的形式 |
-u | 表示用户名,超级管理员的用户名是root;也可以写成”—user=用户名”的形式 |
-p | 表示密码;也可以写成”—password=密码”的形式 |
如按照如下这样执行这个可执行文件(用户名和密码请根据实际情况填写),就可以启动MySQL客户端并且连接服务器。mysql -uroot -p123456
嗯?怎么回事?为什么报错啦?这是什么情况?
🤔我之后就试了下不填密码,居然可以,这是为什么?配置阶段不是给mysql的root用户设置了密码嘛,为什么现在又不需要密码了?这个地方有可能是因为解决上面那个MySQL error 1042: Unable to connect to any of the specified MySQL hosts.
错误之后才导致这样的!这是我猜测的,以后回过头再看一下!
2.3、使用演示
2.3.1、查看所有数据库
show databases;
:::info
“information_schema”是MySQL系统自带的数据库,主要保存MySQL数据库服务器的系统信息,比如数据库的名称、数据表的名称、字段名称、存取权限、数据文件 所在文件的文件夹和系统使用的文件夹,等等
“performance_schema”是MySQL系统自带的数据库,用来监控MySQL的各类性能指标。
“sys”数据库是MySQL系统自带的数据库,主要作用是一种更容易被理解的方式展示MySQL数据库服务器的各类性能指标,帮助系统管理员和开发人员监控MySQL的技术性能。
“mysql”数据库保存了MySQL数据库服务器运行时需要的系统信息,比如数据文件夹、当前使用的字符集、约束检查信息,等等
:::
2.3.2、创建数据库
create database 数据库名;
#创建test数据库,该名称不能与已经存在的数据库名重名
create database test;
2.3.3、切换数据库
use 数据库名;
#使用刚刚创建的test数据库
use test;
如果没有使用use
语句,后面针对数据库的操作也没有加”数据库名”的限定,那么就会报错。使用完use
语句之后,如果接下来的SQL都是针对这个数据库操作的,那就不用重复使用use
,如果要针对另一个数据库操作,那么就要重新使用use
来切换数据库。
2.3.4、查看数据库创建信息
show create database test;
2.3.5、查看某个数据库中的所有表
show tables; #要求前面已经使用use命令切换到某个数据库下
show tables from 数据库名;
2.3.6、创建表
create table user (
id int,
name varchar(15)
);
2.3.7、查看表的创建信息
show create table user;
2.3.8、查看表中的所有数据
select * from user;
2.3.9、往表中添加数据
insert into user(id, name) VALUES (1001, 'tom');
2.3.10、查看编码信息
show variables like 'character_%';
show variables like 'collation_%';
2.3.11、删除表
drop table 表名;
2.3.12、删除数据库
drop database test;
2.4、图形化管理工具
相较于Navicat,SQLyog等数据库图形化管理工具,个人比较喜欢DataGrip
,除了界面很好看,而且书写SQL语句的时候会有提示,这在日常开发中非常方便!JetBrains全家桶一般开发都会用,所以点击此处下载吧!🍨
3、基本的select语句
3.1、SQL概述
SQL(结构化查询语言)是使用关系模型的数据库应用语言,与数据直接打交道
,由IBM
上世纪70年代开发出来。后来由美国国家标准局(ANSI)开始着手制定SQL标准,先后有SQL-86
,SQL-89
,SQL-92
,SQL-99
等标准。SQL有两个重要的标准,分别是SQL92
和SQL99
,它们分别代表了92年和99年颁布的SQL标准,今天我们使用的SQL语言依然遵循这些标准。
不同的数据库生产厂商都支持SQL,但都有特有内容。
3.2、SQL分类🎯
3.2.1、DDL(Data Definition Language)
数据库定义语言,这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。主要的语句关键字包括create``alter``drop``rename``truncate
。
3.2.2、DML(Data Manipulation Language)
数据操作语言,用于添加、删除、更新和查询数据库记录,并检查数据完整性。主要的语句关键字包括insert``delete``update``select
。尤其是**select**
是SQL语言的基础,最为重要。
3.2.3、DCL(Data Control Language)
数据控制语言,用于定义数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant``revoke``commit``rollback``savepoint
等。
:::success
因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)。
还有单独将commit``rollback
拎出来称为TCL(Transaction Control Language,事务控制语言)。
:::
3.3、SQL语言的规则与规范
3.3.1、基本规则
- sql可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
- 每条命令以
;
或\g
或\G
结束 - 关键字不能被缩写也不能分行
关于标点符号
MySQL在windows环境下是大小写不敏感的
- MySQL在linux环境下是大小写敏感的
- 数据库名、表名、表的别名、变量名是严格区分大小写的
- 关键字、函数名、列名、列的别名是忽略大小写的
推荐采用统一的书写规范
数据库、表名不得超过30个字符,变量名限制为29个
- 必须只能包含A-Z,a-z,0-9,_共63个字符
- 数据库名、表名、字段名等对象中间不要包含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
- 必须保证你的字段没有和系统关键字或常用方法冲突。如果坚持使用,请在SQL语句中使用``(着重号)引起来
- 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。加入数据类型在一个表里是整数,那在另一个表里就别变成字符型了
3.4、导入数据
有两种方法可以导入数据。3.4.1、命令行
在命令行客户端登录mysql成功之后,使用source
指令导入数据。mysql> source d:\mysqldb.sql
可以看到数据已经导入进来,增加了atguigudb
数据库,以及在该库下创建了多个数据库表。3.4.2、图形化管理工具
这里以DataGrip为例,其他的软件也差不多。右键点击连接,运行SQL脚本,找到对应的SQL文件运行即可。
3.5、简单的select语句
3.5.1、SELECT …
不含字句。SELECT 1; SELECT 9/2;
3.5.2、SELECT … FROM
SELECT 列1,列2,… FROM 表名;
选择全部的列:
SELECT * FROM employees;
选择特定的列
SELECT employee_id, first_name, last_name, salary FROM employees;
:::success 🎨
一般情况下:除非需要使用表中所有的字段数据,最好不要使用通配符’*’。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势在于当不知道所需要的列的名称时,可以通过它获取它们。 :::3.5.3、列的别名
- 重命名一个列,便于计算
- 紧跟在列名后面,也可以在列名和别名之间加入关键字
AS
(可以省略),别名使用双引号引起来,以便当别名中包含空格或特殊的字符并区分大小写 - 建议别名简短,见名知意
SELECT last_name AS name, commission_pct comm FROM employees;
SELECT last_name "Name", salary * 12 "Annual Salary" FROM employees;
3.5.4、去除重复行
默认情况下,查询会返回全部行,包括重复行。SELECT department_id FROM employees;
在select
语句中使用关键字distinct
可以去除重复行。SELECT DISTINCT department_id FROM employees;
SELECT DISTINCT department_id,salary FROM employees;
针对于上面查询有两点需要注意:
distinct
关键字需要放到所有列名前面,如果写成SELECT salary, DISTINCT department_id FROM employees;
会报错distinct
关键字是对后面所有列名组合起来的结果进行去重。如果你只想看有这些所在的部门都有哪些,只需要写DISTINCT department_id
即可,后面不需要再加其他的列名。3.5.5、空值(NULL)参与运算
所有运算符或列值遇到NULL值,运算的结果都是NULL。SELECT employee_id, salary, commission_pct, 12*salary*(1 + commission_pct) "annual_sal" FROM employees;
💡注意:在MySQL里面,空值不等于空字符串。一个空字符串的长度是0,而一个空值的长度是空。而且,在MySQL里面,空值是占用空间的。3.5.6、着重号
SELECT * FROM ORDER; #因为order是关键字
下面是正确的写法。我们需要保证表中的字段、表名等没有和系统关键字或常用方法冲突。如果真的相同时,请在SQL语句中使用一对````(着重号)引起来。SELECT * FROM `order`;
3.5.7、查询常数
select
查询还可以对常数进行查询。对的,就是在select
查询结果中增加一列固定的常数列。这列的取值是我们指定的,而不是从数据表中动态取出的。
为什么我们需要对常数进行查询呢?
SQL中的select
语法的确提供了这个功能,一般来说我们只从一个表中查询数据,通常不需要增加一个固定的常数列,但如果我们想整合不同的数据源,用常数列作为这个表的标记,就需要查询常数。比如说,想对employees
数据表中的员工姓名进行查询,同时增加一列字段corporation
,这个字段固定值是尚硅谷
,那么可以这么写:SELECT '尚硅谷' as corporation, last_name FROM employees;
3.6、显示表结构
使用describe
或者缩写desc
命令,表示显示表结构。
DESCRIBE employees;
其中,各个字段的含义分别是:
- Field:表示字段名称
- Type:表示字段类型
- Null:表示该列是否可以存储NULL值
- Key:表示该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是
UNIQUE
索引的一部分;MUL表示在列中某个给定值允许出现多次 - Default:表示该列是否有默认值,如果有,那么值是多少
Extra:表示可以获取的与给定列有关的附加信息,例如
AUTO_INCREMENT
等3.7、过滤数据
需求:查出在90号部门工作的所有员工信息。
🎯语法:SELECT 字段1, 字段2 FROM 表名 WHERE 过滤条件;
使用
where
子句将不满足条件的行过滤掉where
子句紧跟在from
子句后面SELECT * FROM employees WHERE department_id = 90;
4、运算符🎯
4.1、算术运算符
算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或者表达式,对数值或表达式进行加(+)、减(-)、乘(*)、除(/)和取模(%)运算。
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
+ | 加法运算符 | 计算两个值或表达式的和 | SELECT A+B |
- | 减法运算符 | 计算两个值或表达式的差 | SELECT A-B |
* | 乘法运算符 | 计算两个值或表达式的乘机 | SELECT A*B |
/或DIV | 除法运算符 | 计算两个值或表达式的商 | SELECT A/B 或者 SELECT A DIV B |
%或MOD | 取模(取余)运算符 | 计算两个值或表达式的余数 | SELECT A%B 或者 SELECT A MOD B |