导图社区 Mysql数据库
Mysql数据库思维导图:包含数据库的概念,数据库名词解释,关系型数据库和非关系型数据库,软件测试人员为什么要使用数据库,二、常见数据库产品等等
编辑于2022-05-10 16:14:23Mysql数据库
第一节
一、数据库介绍
1.数据库的概念
1.1定义
数据库是存放数据的仓库,英文名database,DB,是长期储存在计算机内部,有结构的,大量的、共享的数据的集合。
1.2关键字解释
长期存储:持久储存,具有长时效性。
有结构:类型和关系,存放的不仅仅是数据,还有它的类型,当然还有数据和数据之间的关系。
大量的:大多数数据库都是文件系统的,都是以磁盘文件的形式储存在计算机硬盘内部。
共享的:多个应用/软件之间可以通过数据库进行数据的共享。
2.数据库名词解释
2.1数据库(database):存储数据的仓库。
数据:何为数据?首先数据是通过观察、实验、计算得出的数值:比如说一个 人是男是女是高是矮是胖是瘦,男女高矮胖瘦就是数据,通过观察得出的,大气压、圆周率 等数学/物理方面的一些常数,就是通过实验和计算得出来的数据,它是对事物的逻辑归纳, 事物的属性特征,大家最容易想到的就是数字,描述物理的数量,例如一个苹果两个梨子, 数量 1 和 2 它就是数据,但是数据不仅仅只有数字,数字只是其中一种,苹果、梨子文字也 是数据,也可以是声音(MP3)、图像(jpg)、文件(doc)、视频(MP4)等等。
2.2 数据库管理系统(Database Management System,DBMS)
mysql 是以系统服务存在, 是一种系统软件,自带一个 dos 的运行界面,人怎么去完成一个操作,如果没有一个操作 的界面,怎么去实现数据的存储,DBMS 就是做这个事情的,人和数据库之间的一个媒介、 交流平台,是位于用户与操作系统之间的一层数据管理软件。
2.3数据库管理员(database Anministra,简称DBA):
负责数据库创建、使用、管理、维护的人员
2.4 数据库系统(database system,简称DBS)
以上所有的一整套系统统称数据库系统。
3.关系型数据库和非关系型数据库
3.1关系型数据库的定义
关系型数据库就是采用了关系模型来组织数据的存储,以行和列的形式来储存数据并记录数据与数据之间的关系,即是以表格的形式来储存数据,可以通过建立表格和表格之间的关系来维护数据与数据之间的关系。 示例:一个学校的系统的数据库,学生表(student)、班级表(class)、专业表(major)、学院表(college)。
3.2非关系型数据库的定义
非关系型数据库就是采用键值对的模型来存储数据库,只完成数据的记录,不会记录 数据与数据之间的关系,在非关系型数据库种基于其特定的数据结构来解决一些大数据应用 的难题,一般用 No(not only)SQL 来指代。
3.3关系型数据库和非关系型数据库之间的区别
由于关系型数据库储存了数据和数据之间的关系,因此在查询的时候,数据量很大的时候,就会变得很缓慢。非关系型数据库由于期特性,常用来解决一些大数据的问题,并不代表关系型数据库就不能运用到大数据的项目,只能说两者运用的场景不同罢了。
4.软件测试人员为什么要使用数据库
我们为什么要去懂数据库呢?
第一个是熟悉业务
第二个是分析定位问题
二、常见数据库产品
1.常见的关系型数据库产品
Mysql:MariaDB(mysql 的替代品)、Percona Server(基于 mysql 的产品),常见,免 费开源数据库产品。
Oracle:付费的,使用成本较高,但是却是市面上功能最强大,安全最有保障的数据库, 例如学校用 orcale 的多。
其他的:Postgre SQL、SQL Server(微软)、Access(微软)、Sybase、达梦数据库(国 产)。
2.常见的非关系型数据库
面向检索的列式存储:HaBase、BigTable(google)
面向高并发的缓存存储键值对:Redis、MemcacheDB
面向海量数据访问的文档存储 document-oriented:MongoDB、CouchDB
三、MySQL的介绍
1.什么是MySQL
MySQL 数据库是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数 据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL 是开放源代码的,因此任何 人都可以在 General Public License 的许可下下载并根据个性化的需要对其进行修改。 MySQL 因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的 情况下,MySQL 是管理内容最好的选择。
3.MySQL的发展
My SQL 最早起始于 1979,开始是 Michael.Monty. Widenius 为瑞典的 TcX 公司创建的 UNIREG 数据库工具 1996 年 5 月 My SQL 1.0 1996 年 10 月 My SQL 3.11.1 以用于 Linux 和 Solaris 系统的二进制分发形式发布 2003 年 3 月 My SQL 4.0 2004 年 6 月 My SQL 4.1 2005 年 10 月 My SQL 5.0 2008 年 1 月 16 日 Sun 出价 10 亿美元收购 了 My SQL 2011 年 My SQL 5.5.21
4.MySQL的版本介绍
My SQL 是免费的关系型数据库,官网:https://www.mysql.com/。 企业种的主流 My SQL 版本:5.0、5.5、5.6、5.7、8.0.26 等,具体选择哪一个版本,根 据公司的实际情况以及项目的实际情况而定,并不是版本越高越好,我们教学用的是 5.0.18 版本。
四、MySQL的环境准备
1、MySQL的下载
网址:https://downloads.mysql.com/archives/community/ 具体的下载方式参照 mysql 下载安装文档
2、MySQL在windows下的安装
使用安装包进行安装,具体方式参照文档。
3、MySQL的服务启用/停用
之前有说过,mysql 是以服务的形式运行在系统中。 Windows 环境下:在计算机管理窗口进行操作:此电脑-右键-管理。 Cmd:win+R 打开命令提示符,net stop/start mysql
4、卸载MySQL
关闭 mysql 服务 (可以通过cmd,也可以在我的电脑-右键-管理) 在控制面版里面卸载 mysql (常规卸载) 删除目录:mysql 的安装目录一般默认是 C:\Program Files(x86)\MYSQL 删除 mysql 的数据文件目录(默认隐藏):C:\ProgramData\MYSQL 删除注册表:win+R,输入 regedit,删除 mysql 的注册表 具体的操作参照 mysql 下载安装文档。
5、MySQL的管理工具
MySQL的管理工具介绍:当数据库安装完成之后,mysql 是以服务的形式运行在 windows/Linux 系统中,用户是通过 DBMS 工具来对 MYSQL 进行操作的,当我们安装完成 MYSQL 之后其实是默认安装了 mysql Commcand line Cline,此工具是一个命令行事的工具, 通常我们会单独安装可视化的 DBMS 工具:Navicat for MySQL。
五、MySQL的逻辑结构
1、MySQL的逻辑结构介绍
MySQL可以存储数据,但是存储在MySQL数据库的数据需要按照特定的方式进行储存。 一个数据库软件,可以建立多个数据库的连接,一个数据库里面可以建立多张表,一张表里面,可以建立多个字段(列),数据是存储在字段(列)。
2、逻辑结构的示例
学生-学校:学生和学校之间的关系,并不是直接对应的,学生-班级-专业-学院-学校。
3、记录/元组
4、MySQL的数据类型
4.1定义:在计算机/程序里面,数据类型是数据的一个属性,就好比学生表中,学号这个字段,它只能是数字,所以我们在数据库里面对它的类型给予限制,对数据进行修改或者插入数据的时候,对数据的类型进行限制,防止错误的数据进来。
4.2 数值类型:mysql中有多种数据类型可以存放数值,不同的类型存放的数值范围或者形式是不一样的。
4.3 字符串类型:储存字符序列的类型。
4.4 日期时间类型:在 MySQL 数据库中,我们完全可以使用字符串来储存时间,但是如 果我们要基于时间字段进行查询操作(查询某个时间段内的数据)就不便于查询实现。
5、MySQL字符集
5.1 什么是字符集
字符集其实就是一套文字符号及编码,对应的文字及编码,可以将人类识别的内容和计算机能够识别的信息进行转换。
5.2 常用的字符集及其说明
六、SQL
1.SQL的概述
1.1 SQL的定义:是英文 Structured Query Language 的缩写,字面上的意思就是结构化查询语句。
1.2 SQl的作用:用于存取、查询、更新数据以及管理关系型数据库系统。
1.3 SQL 的发展: SQl 是在 1981 年由 IBM 公司推出,一经推出基于其简洁的语法在数据库中得到了广泛 的应用,成为主流数据库的通用规范,SQL 由 ANS 组织确定规范,在不同的数据库产品中遵 守 SQ 的通用规范,但是也对 SQL 有一些不同的改进,形成了一些数据的专有指令,例如, Limit(MySQl)、top(SQLServer)、rownum(Oracle),即是大同小异。
1.4 SQL的分类及名词解释 DDL(Data Definition Language):数据定义语言,主要用于完成对数据库对象(数据库、 数据表、视图、索引等)的创建、删除、修改。 DML(Data Manipulation Language):数据操作/操纵语言,用于完成对数据表中的数据 添加(将数据存储到数据表)、删除(将数据从数据表中移除)、修改(对数据表中的数据 进行修改)操作。 DQL(Data Query Language):数据查询语言,用于将数据表中的书库查询出来。 DCL(Data Control Language):数据控制语言,用于完成事务管理等控制操作。
2.SQL的基本语法
语法规则:对大小写不敏感、只要有空格的地方都可以换行、每条 SQL 表达式结束之后都以;(英文)结束、关键字之间以空格进行分隔。
七、DDL数据库操作命令
1.查询数据库名称
显示当前连接下所有的数据库 命令:show databases; 效果:显示当前连接下所有数据库的名称。
2.选择/切换数据库
命令/语法:use <DatabaseName> ; 示例:选择MySQl自带的数据库。 语句:use mysql; 效果:显示切换/使用成功。
3.创建数据库
命令/语法:create database <dbName>; (dbname为创建的数据库名称,可以自定义) 示例:创建数据库test1。 语句:create database test1; 效果:创建成功,并且用show databases; 可以成功查看到该数据库。
创建数据库(容错性操作)示例:create database if not EXISTS test1; 效果:执行成功。
在创建数据库的时候,指定字符集:
语法:create database (if not exists) <dbName> character set (字符集); 示例:创建test1数据库指定编码格式gbk。 语句:create database test1 character set gbk; 效果:数据库test1创建成功,并且编码格式是gbk。
4.修改数据库(字符集)
命令/语法:alter database <dbName> character set (字符集); 示例:将之前的test1数据库的编码格式从gbk修改为utf8。 语句:ALTER database test1 CHARACTER set utf8; 效果:修改成功。
5.删除数据库
注意:删除数据库时会删除当前数据库中所有的数据表以及表中的数据,慎用! 删除数据库 命令/语法:drop database <dbName>; 示例:删除之前我们创建的数据库test1。 语句:drop database test1; 效果:test1删除成功,show databases;查看不到该数据库。
6.显示指定数据库创建语句
命令/语法:show create database <dbName>; 示例:为了演示,先创建一个数据库test3(CREATE database test3 character set utf8; )然后,我们查看它的创建命令。 语句:show create database test3; 效果:显示test3的创建命令。
第二节
八、DDL数据表操作命令
1.创建数据表
数据库的表实际上就是一个二维表格,表格中每一列称之为字段。 示例:在test3中我们来创建一张表,这个表叫做studnet1
语法:create table <tableName> (); 语句:CREATE table student1( stu_num char(8) NOT NULL unique, stu_name varchar(20) NOT null, stu_sex char(2) not null, stu_age int not null, stu_tel char(11) NOT NULL, stu_QQ varchar(20) UNIQUE ); 效果:student1表创建成功。
2.查询数据表
查询当前数据库下所有的数据表的名字 语法:show tables; 效果:成功查询到当前数据库里面所有表的名字。
查询指定的表的结构
语法/命令:desc <tableName>; 示例:查询student1的表结构 语句:desc/describe student1; 效果:成功显示student1表的结构。
查询指定数据表的创建语句
语法:show create table <tableName>; 示例:显示student1的表的创建语句 语句:show create table student1; 效果:成功显示student1表的创建语句
3.删除表
语法:drop table <tableName>; 示例:将student1表删除 语句:drop table student1; 效果:删除成功,show tables;查看不到该数据表。
4.修改表
修改表的名字
语法:alter table <tableName> rename to <newTableName>; 示例:将student1的表名称重命名为studnet2。 效果:用show tables查看,表名修改成功,从student1---student2。
修改表的字符集:
数据表也是有字符集的,它的字符集默认和数据库保持一致 命令/语法:alter table <tableName> character set utf8; 示例:将 student2 表的字符集修改为 gbk,然后再修改回来 语句:alter table student2 character set gbk;(alter table student2 character set utf8;) 示例:修改student2的字符集 效果:修改成功,用show create table student1;查看结果。
添加字段(列):
语法:alter table <tableName> add <columnName> <type>; 示例:向studnet2表中添加一列,stu_test varchar(100) 语句:alter table student2 add stu_test varchar(100);
修改字段(列)的名称和字符类型
语法/命令:alter table <tableName > change <oldCloumnName> <newCloumnName> <type>; 示例:将student2表中的stu_test修改为stu_test1 语句:alter table student2 change stu_test stu_test1 varchar(80); 效果:修改字段名字+字段类型成功。
只修改字段的类型
语法:alter table <tableName> modify <columnName> <newtype>; 示例:我们将student2表中的stu_test1字段的类型修改为varchar(70); 语句:alter table student2 modify stu_test1 varchar(70); 效果:我们用desc student2;去查看student2表的结构的时候,看见我们的字段类型修改成功, 从varchar(80)--varchar(70)。
删除字段(列)
语法:alter table <tableName> drop <cloumnName>; 示例:删除student2表中的stu_test1字段。 语句:alter table student2 drop stu_test1; 效果:studnet2表中的stu_test1字段删除成功。
5.字段约束
5.1 字段约束介绍 介绍:在创建数据表的时候,指定对数据表的列的数据限制性的要求(对表的列中的 数据进行限制)。 为什么要给表中添加约束? 添加约束的作用主要有三个:保证数据的有效性、保证数据的完整性、保证数据的正确性。 常见的约束有哪些? 非空约束(not null):限制此列(字段)的值必须得提供,不能为空。 唯一约束(unique):限制此列(字段)的值不能重复。 主键约束(primary key):非空且唯一,能够标识数据表中的一条数据,每一条数据的唯一性。 外键约束(foreign key):建立表与表之间的联系。(放到后面讲解)
5.2示例:非空/唯一约束。创建一张新的表books来测试我们的非空和唯一约束。
语句:create table books( book_bh char(3) UNIQUE, book_name varchar(20) NOT NULL, book_author VARCHAR(10) );
5.3 主键约束
示例:新建一个表,沿用books表的结构创建一个新的表books2,然后我们把book_bh 设置为表的主键(因为书的编号是非空且唯一的)。
语句1:create table books1( book_bh char(3) primary key, book_name varchar(20) NOT NULL, book_author VARCHAR(10) );
语句2: create table books1( book_bh char(3) , book_name varchar(20) NOT NULL, book_author VARCHAR(10), Primary key(book_bh) );
5.4 删除主键
语法:alter table books1 drop primary key; 示例:删除books1中的主键。 效果:主键删除成功,用desc books1表时,主键标识消失。
5.5添加主键
示例:将books1表中删除的主键添加回来。 语句:Alter table books1 modify book_bh char(3) primary key; 效果:主键又添加回来了。
5.6 主键自动增长
定义:定义:在我们创建一张数据表时,如果数据表中有列可以作为主键(例如学生表的学 号、图书表的编号)我们可以直接设置这个列为主键;当哟写数据表中没有合适的列作为主正 键时,我们可以额外定义一个与记录本身无关的列(ID)作为主键,此列数据没有具体的含 义,主要用于标识一条记录,在mysql 中我们可以将此列定义为 int 类型同时设置为自动 增长,当我们向数据表中新增一条记录时,无需提供 ID 列的值,它会自动生成。 示例:创建一张types表
语句:CREATE TABLE types ( type_id INT PRIMARY KEY auto_increment, type_name VARCHAR (20), type_remark VARCHAR (100) );
注意:我们前面说了,主键是非空且唯一的,我们这里演示的时候,没有填写主键, 但不代表为空,而是自动填充。 效果:主键自动增长,且不会重复生成。
子主题
5.7 联合主键
定义:把数据表中多列(字段)组合在一起设置为表的主键。 示例:把成绩表grade_form把其中的学号stu_num和课程编码course_id拿出来作为一个组合主键,确保数据的唯一性
语句: create table grade_form( stu_num char(8), course_id int, score int, primary key(stu_num,course_id) );
效果:创建成功,用desc grade_form;可以查看到主键标识。联合主键限制,验证之后,是生效的。
九、DML数据操纵命令
1.插入单条数据
命令/语法:insert into <tableName> (columnName1,columnName2,...) values(value1,value2...); 示例:为了演示吗,我们重新新建一张表student3,延用之间student2的建表语句(我们将学号设置为主键)。 建表语句(创建演示数据):
create table student3( stu_num char(8) primary key, stu_name varchar(20) not null, stu_sex char(2) not null, stu_age int not null, stu_tel char(11) not null unique, stu_qq varchar(11) unique );
插入数据1: insert into student3(stu_num,stu_name,stu_sex,stu_age,stu_tel,stu_qq) values (20220001,'张三','男',18,18765432167,1066226154);
子主题
2.一次性插入多条数据
一次性插入多条数据语法/命令:Insert into <tableName> (columnName1,columnName2,...) values(value1,value2...),(value11,value12...)...; 示例:向 student3 表中插入多条数据。 语句:insert into student3(stu_num,stu_name,stu_sex,stu_age,stu_tel,stu_qq) values (20220003,'王五','女',19,18760432167,1066227154), (20220004,'赵六','女',17,18762432167,1066224154), (20220005,'孙七','男',16,1876832167,1066226854) ;
3.删除数据
语法:delete from <tableName> where (条件); 示例:删除student3表中,名字为孙七的人的数据。 语句:delete from student3 where stu_name = ‘孙七’; 效果:名字为孙七的人的所有数据都删除了,用select * 查看不到了,删除成功。
4.修改单个字段的数据
修 改 单 个字段数据的 命 令 : update <tableName> set cloumnName = ‘newvalue’ where <conditions>; 示例:把student3表中姓名为王五的人的性别由女变为男。 语句:UPDATE student3 set stu_sex = '男' where stu_name = '王五'; 效果:student3表中王五的性别由女修改为了男。
5.修改多个字段数据
修改多列命令:update <tableName> set cloumnName1 = ‘newvalue1’, cloumnName2 ,...= ‘newvalue2’ ...where <conditions>; 示例:把student3表中孙七的性别修改为女,年龄修改为20。 语句:update student3 set stu_sex = ‘女’,stu_age = 20 where stu_name = ‘孙七’; 效果:student3表中孙七的性别由男修改为了女,年龄从14修改为了20。
十、DQL
1.查询基本命令/语法
查询基本命令语法格式: Select * from <tableName>; 查询数据表中一列或者是多列的数据。 Select columnName1[columnName1,column2,...] from <tableName>; 示例:查询studnet3表中所有人的姓名、性别和年龄。 语句:select stu_name,stu_sex,stu_age from student3; 效果:成功展示student3表中所有学生的姓名、性别、年龄。
2.Where 子句
Where子句的介绍:在修改、删除以及查询语句后面可以添加where子句,用于操作满足条件的数据。 例如: Delete from <tableName> where <condition>; Update <tableName> set <columnName> = ‘newvalue’ where <conditions>; Select * from <tableName> where <conditions>; 常用的条件有:等于(=)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、 小于等于(<=)。 示例:查询student3表中所有年龄大于18的数据。
3.多条件查询
多条件查询:在where 子句中,可以将多个条件通过逻辑运算符(and、or、in、not)进行连接,从而查询出满足多个条件的数据。 示例1:查询student3表中年龄大于18的男生的名字。 语句:SELECT stu_name from student3 where stu_age > 18 and stu_sex = '男'; 效果:查询结果正确,符合我们的条件。
4.LIKE子句
LIKE子句:在where 子句后面,我们可以用LIKE子句进行模糊查询。 模糊查询的命令/语法:select * from <tableName> where <columnName> LIKE ‘reg’; 注意:在 reg(正则)表达式中,可以用下划线表示任意一个字符,%表示任意多个字符, '_10%'。 示例:在student3表中将周杰伦找出来(前提添加了周杰伦的数据进去)。 语句:select * from student3 where stu_name like '_杰'; 效果:查找的结果符合我们预期的要求。
5.对查询结果的处理
5.1 对查询结果的处理:
对从数据表中查询的记录进行一定的运算之后显示出来。 示例:显示 student3 表中手机号和 QQ 号相加的和 (差-、乘*) 语句:select stu_tel+stu_qq from student3; 结果:显示结果,经过验证之后,确认正确。
5.2 对运算后的列重新命名
示例:将 student3 表中手机号和 QQ 号相加的和重命名为testsum 并显示出来 语句:select stu_name,stu_tel+stu_qq as testsum from student3; 效果:修改别名成功。
5.3 消除重复行
命令:distinct(去除重复) 示例:查询student3表中stu_sex=’女’的列,然后进行去重处理。 语句:SELECT DISTINCT stu_sex from student3 where stu_sex = '女'; 效果:查询成功,去除重复项。
6.排序
含义:order by<columnName> asc(升序)/desc(降序)将查询的列(字段)按照指定 的列的值升序/降序排列,放在条件后面(不加 asc/desc 默认为升序)。 注意:此处的desc和查看表的结构的desc不是同一个意思! 示例:将student3表中女同学的数据按照年龄进行升序排列。 语句:Select * from student3 WHERE stu_sex = '女' order by stu_age(asc); 效果:查出的数据按照年龄升序排列,符合预期。
7.聚合函数
7.1名词解释
含义:sql 定义了一些可以对查询的记录的列进行计算的函数。
7.2count():统计函数
统计满足条件的指定字段的个数。
示例:显示student3表中女同学的人数。 语句:SELECT count(stu_sex) FROM student3 WHERE stu_sex = '女';
7.3max()/min()
计算最大/最小值,查询满足条件列的最大/最小值。
示例:查找student3表中男同学年龄的最小值。 语句:select min(stu_age) from student3 where stu_sex = '男'; 效果:查询成功,结果符合预期
7.4 SUM()
求和,计算满足条件列的所有值的和
示例:计算student3表中所有学生年龄的总和。 语句:SELECT sum(stu_age) from student3;
7.5avg()
求平均值,计算满足条件列的所有值的平均值。
示例:计算student3表中所有学生年龄的平均值。 语句:SELECT avg(stu_age) from student3; 效果:查询成功,显示平均值。
7.6round()
保留多少位小数round(cloumnName,位数);
示例:将student3表中所有学生的年龄平均值保留1位小数 语句:SELECT round(avg(stu_age),1) from student3; 效果:成功显示。
7.7日期函数
当我们向日期类型的列添加数据时,可以通过字符串类型赋值(字符串的格式必须 为:yyyy-MM-dd hh:mm:ss),如果想获取当前系统的时间添加到日期类型的列中,可以使 用 now()或者是 sysdate()。 首先要完成这个操作,我们先向student3表中添加一列,stu_time,设置它的字段类型datetime。 效果:添加成功
示例1:我们向student3表中按照时间格式我们来插入一条数据。 语句:insert into student3 VALUES (20220011,'赵九','男',78,15654321876,987876554,'2022-04-27 11:27:08') ; 效果:时间类型数据添加成功。
示例2:我们向student3表中插入数据(使用now()函数)。 语句:insert into student3 VALUES (20220012,'赵一','男',28,15654320876,987076554,now()) ; 效果:数据插入成功,stu_time这一列的数据显示是插入时你的系统时间。
通过 now()和 sysdate()或者当前系统时间。 语句:Select now();/select sysdate(); 效果:成功查询出系统当前时间。
7.7字符串函数concat
含义:通过 sql 指令对字符串进行处理,concat:对字符串进行拼接。 示例:我们将student3表中的姓名、性别、年龄通过符号进行拼接,然后显示出来。 语句:select concat(stu_name,'(',stu_sex,'):',stu_age) as new from student3; 效果:显示成功。
7.8 upper()/lower():将指定的字段转化为大/小写。
创建数据:为了演示我们这个函数,我们往student3表中创建一些数据 insert into student3 VALUES (20220014,'TOM','男',80,15654371876,987879554,now()), (20220015,'Jack Chen','男',60,15654321846,907876554,now()), (20220016,'angeral baby','女',40,15654321806,984076554,now()), (20220017,'LIly','女',18,15654321776,987176554,now())
示例:将student3表中的英文名字全部转化为小写并显示。 注意:此函数对中文/数字是没有效果的。 语句:SELECT lower(stu_name) from student3; 效果:显示成功。
7.9 substring():对字段的值进行截取并显示。
示例:将student3表中所有人的电话号码的前三位进行截取并显示。 语句:SELECT substring(stu_tel,1,3) from student3;
8.分组查询
8.1定义:将数据表中的记录按照指定的类进行分组
8.2 语 法: select (cloumnName/聚 合函 数) from <tableName> (where 条 件 ) group by <cloumnName> (having 条件) ;
8.3示例1:分别统计student3 表中的男女人数。 语句:SELECT stu_sex,count(stu_sex) from student3 GROUP BY stu_sex; 效果:对男女进行分组并统计各自人数。
8.4 示例2:将student3表的数据按照年龄进行分组并统计数量显示出来。 语句:select stu_age,count(stu_age) from student3 group by stu_age; 效果:将年龄进行分组统计并展示。
8.5示例3:将student3中的数据按照年龄进行分组统计,然后过滤掉40以上的数据。 语句:SELECT stu_age,count(stu_age) from student3 where stu_age <=40 GROUP BY stu_age; 效果:显示成功,结果符合预期。
8.6 补充:where 和 having 有什么区别 Where:where 子句是在分组(group by)前进行的条件过滤,所以 where 子句中不能 使用聚合函数。 Having:having 子句是在分组(group)后进行的条件过滤,所以 having 子句中可以使 用聚合函数。 注意:where 和having 是可以使用在同一个SQL语句中的。
9.分页查询 示例:将student3表中的17条数据,按照每页5条进行分页并显示 语句: select * from student3 limit 0,5; select * from student3 limit 5,5; SELECT * from student3 limit 10,5; SELECT * from student3 LIMIT 15,5; 注意:limit a,b ,a表示当前起始行数的前一行,b表示pagesize。 效果:分页显示成功(当最后一页的数据条数不足每页的pagesize时,有多少,填入多少)。
十一、数据表的关联关系
1.关联关系介绍
mysql 是一个关系型数据库,不仅可以储存数据,还可以维护数据与数据之间的关系 示例:
分析:我们直观上从两张表来看,我们没法确认,张三他是属于哪个班级。所以如何将两张表关联起来呢? 解决方式:我们可以通过在学生信息表里面建立一个外键(id)和班级表里面的class_num进行关联,那么班级表就是主表,学生信息表就是从表。 常见的数据之间的关联关系:一对一、一对多、多对一、多对多。
2.一对一关联
例子:人-身份证、学号-电话、学生-学籍、等是一一对应的 示例:
3.一对多与多对一的关联
例子:例子:班级-学生:一个班级可以包含多个学生,但是一个学生只属于一个班级 图书-分类:一种图书属于一个类别,一个分类里面可以包含多种图书 商品-商品类别:一个商品属于一个分类,但是一个分类里面有很多商品,例如橙子属 于水果,但是水果不只有橙子 方案:再多的一端(从表)添加外键,与另外一端(主表)的主键进行关联
4.多对多的关联关系
例子:学生-课程:一个学生可以选择多门课程,一门可也可以由多个学生选择 学生-社团:一个学生可以报多个社团,一个社团也可以招募多个学生 解决方式:多对多的关系过于复杂,不好进行管理,我们通过建立第三表张(关系表),来维护一对多的关系。
5.外键约束
5.1 定义:将从表中的一列添加为主表的主键进行关联之后,这个外键约束的列添加的数据 必须再关联的主键字段中存在。
5.2 示例:创建一张班级表class( class(class_id,class_name,class_remark) ) , 再 创 建 学 生 表 (student4(stu_num,stu_name,stu_sex,stu_age,cid)),将外键 cid 关联到主键 class_id。 Student5(延用student4的结构,然后我们自定义外键的名称) 语句:create table class( class_id int primary key auto_increment, class_name varchar(20) not null, class_remark varchar(300) ); Create table student4( stu_num char(8) primary key, stu_name varchar(10) not null, stu_sex char(2) not null, cid int, Foreign key (cid) references class(class_id) ); 效果:外键添加成功(自定义外键连接名称)。
5.3 示例:往student5表中插入数据(cid的值不在class_id里面) 语句:insert into student5 values ('20220004','李七','18','4');(4不在class_id里面) 效果:无法添加数据,外键约束得到验证。
6.外键约束-级联
6.1不能直接修改被从表引用的数据主键 class_id 示例:删除修改class表中被引用的class_id。 语句:delete from class where class_id = 1;(删除) UPDATE class set class_id = 9 where class_id =1;(修改) 效果:SQL执行失败,被引用的情况下,不能够删除/修改。
6.2如何去进行一个修改/删除的操作。
示例:将 class 表中 JAVA 培训 2 班的 class_id 改为 8 首先:将 student5 表中的 cid=2 的 cid 值修改为 NULL 语句:update student5 set cid = NULL where cid =2; 然后:将 JAVA 培训 2 班中的 class_id 值改为 8 语句:update class set class_id = 8 where class_id =2; 最后:将 student4 表中 cid 为空的数据 cid 设置为 8 语句:update student5 set cid=8 where cid is NULL;
6.3级联修改
删除外键:alter table student5 drop foreign key FK_STUDENT5_CLASS; 效果:删除成功,外键标识没有了。
设置级联修改和级联删除: 语句:alter table student5 add constraint FK_STUDENT4_CLASS1 foreign key (cid) references class(class_id) ON UPDATE CASCADE ON DELETE CASCADE; 级联修改测试: 示例1:直接修改我们class的class_id 将class_id由8修改为2。 语句:UPDATE class SET class_id =2 where class_id =8; 效果:修改成功,从表里面引用的数据也跟着修改了。(级联修改是有关联的修改)
示例2:删除class表中,class_id =3 的列。 语句:delete from class where class_id=3; 效果:删除成功,从表里面引用数据也自动进行了删除(级联删除也是有关联的)
十二、连接查询
1.创建演示数据:为了和前面的内容区分开来。
建表:class1 和 student 6 语句:create table class1( class_id int primary key auto_increment, class_name varchar(30) not null, Class_remark varchar(200) ); create table student6( stu_num char(8) primary key, stu_name varchar(20) not null, stu_sex char(2) not null, stu_age int not null, cid int, constraint FK_STUDENT5_CLASS1 foreign key(cid) references class1(class_id) ); 分别插入数据 语句:insert into class (class_name,class_remark) values ('JAVA 培训 1 期','结业'), ('JAVA 培训 2 期','结业'), ('JAVA 培训 3 期','培训中'), ('测试培训 1 期','培训中'); Insert into student5(stu_num,stu_name,stu_sex,stu_age,cid) values('20220101',' 张三','男',17,1); Insert into student5(stu_num,stu_name,stu_sex,stu_age,cid) values('20220102',' 李四','女',18,1); Insert into student5(stu_num,stu_name,stu_sex,stu_age,cid) values('20220103',' 王五','男',19,1); Insert into student5(stu_num,stu_name,stu_sex,stu_age,cid) values('20220104',' 赵六','男',20,2); Insert into student5(stu_num,stu_name,stu_sex,stu_age,cid) values('20220105',' 何七','男',21,2); Insert into student5(stu_num,stu_name,stu_sex,stu_age) values('20220106','李八 ','男',17); Insert into student5(stu_num,stu_name,stu_sex,stu_age) values('20220107','赵四 ','男',18);
2.内连接
语法:select ... from <tableName1> inner join <tableName2>;
示例:我们用student6表和class1表进行内连接查询。 语句:select * from student1 inner join class1; 效果:student6表中的每一条数据,都和class1中的所有数据进行匹配。
笛卡尔积:select ... from <tableName1> inner join <tableName2>;table1 中的每个记录关 联 table2 中的每一个记录
示例1:过滤掉student6表和class1表笛卡尔积中无效的数据。 语句:select * from student6 inner join class1 where student6.cid= class1.class_id ; 结果:得到有效的结果。
示例2:使用on条件进行条件过滤达到和示例1相同的效果。 语句:select * from student6 inner join class1 on student6.cid= class1.class_id ; 效果:得到有效的结果。
3.左连接和右连接
左连接:left jion显示左表中的的所有数据,如果在右表中存在与左表记录满足匹配条件的数据, 则进行匹配,若不存在匹配数据则显示 NULL。 示例1:student6和class1表进行左连接。 效果:显示成功。
4.子查询/嵌套查询
子查询:先进行一次查询,第一次查询的结果作为第二次查询的源/条件(第二次 查询是基于第一次查询的结果来进行的) 示例:查询班级名称为 JAVA 培训 1 期的学生信息 语句:SELECT * from student6 where cid = (select class_id from class1 where class_name = 'JAVA 培训 1 期'); 效果:查询结果一步到位。
5.多表查询实例讲解 建表:为了演示我们创建一张新表(staff)。
语句:CREATE table staff( staff_num char(8) PRIMARY KEY, staff_name varchar(20) NOT NULL, staff_sex char(2) not NULL, staff_age INT not null, staff_manager char(8) );
示例1:查询表中李雷雷的领导名字。(通过内连接查询) 语句:SELECT b.staff_name FROM staff a INNER JOIN staff b on a.staff_manager = b.staff_num WHERE a.staff_name = '李雷雷'; 效果:查询成功。
示例2:查询表中韩梅梅的领导名字。(子查询/嵌套查询) 语句:SELECT staff_name from staff WHERE staff_num = (select staff_manager from staff WHERE staff_name= '韩梅梅'); 效果:查询成功。
示例3:查询表中韩梅梅领导的名字。(传统方式) 语句:select n.staff_name from staff m,staff n WHERE m.staff_manager = n.staff_num and m.staff_name = '韩梅梅'; 效果:查询成功。
十三、视图
1.视图的概念及作用
视图的概念:由数据库中的一张表或者多张表根据特定的条件查询出的数据结构构成 的虚拟表,可以理解为用一张表保存一系列查询的结果。 视图的作用: 安全性:如果我们直接将数据表授权给用户操作,那么用户可以 CRUD 数据表中的所有 数据,加入我们想要对数据表中的部分数据进行保护,可以将公开的数据生成视图,用户通 过查询视图可以获取表中的公开数据,从而达到将数据表中的部分数据对用户隐藏。 便捷性:如果我们需要查询的数据来源于多张数据表,可以通过多表连接查询来实现, 我们通过视图将这些连表查询的结果对用户开放,用户可以直接查询视图来获取多表操作, 操作更加便捷。
2.创建视图
语法:create view <viewName> as select_statement; 示例:我们创建一个视图 语句:create view view1 as select * from student6 inner join class1 ON student6.cid =class1. class_id where stu_sex = '男'; 效果:视图创建成功,并且用select * from view1;可以进行查看。
3.查询/修改/删除
3.1查询当前数据库中所有的视图
语法:show table status where comment = 'view'; 效果:查询成功。
3.2查看视图的结构
语法:describe view1; 效果:查询成功。
3.3修改视图的结构
示例1:将view1视图换成显示女同学的信息。 方法1语句:CREATE OR REPLACE VIEW view1 AS SELECT * from student6 a INNER JOIN class1 b on a.cid = b.class_id where a.stu_sex = '女'; 效果:修改成功。
示例1:将view1视图换成显示女同学的信息。 方法1语句:CREATE OR REPLACE VIEW view1 AS SELECT * from student6 a INNER JOIN class1 b on a.cid = b.class_id where a.stu_sex = '女'; 效果:修改成功。
注意/总结: 视图它是一张虚拟的表,它显示的是一个即时查询的结果,它是会受到源(来源)表里面数据改变影响的。 当源表里面数据修改影响到视图创建SQL的查询结果时,视图会产生变化。 思考题:当我修改到源表结构的时候,是否会影响到视图?
3.4 删除视图
语法:drop view <viewName>; 示例:删除view1视图。 语句:drop view view1;
4.视图的特性
查询操作:查询操作
4.1:如果在数据表中添加了新的数据,而且这个数据满足创建视图时的 sql 语句, 通过查询视图也可以查询出该数据,当删除该数据的时候,也会从视图中删除该数据。 示例1:创建视图 view2(create view view2 as select * from student5 where stu_sex = '男';) 我们向 studnet5 表中添加一条男同学信息: INSERT INTO student6 VALUES (20220008,'刘耕宏','男',50,null); 效果:该数据可以显示在视图 view2 中。
示例2:我们删除刚刚添加的数据。
语句:delete from student6 where stu_name like '%耕宏%';
4.2对视图进行新增/删除操作:
如果在视图中添加数据,该条数据会被添加到原表中,删除同理。(其实视图只是一个虚拟表,显示即时查询的结果,向视图中插入数据,实际上是向原表中插入数据)
示例1:向视图view2中插入一条数据。 语句:INSERT INTO view2 values(20220108,'孙楠','男',50,null); 效果:有两个,第一个数据在视图里面存在了,第二个,在源表里面也有该数据。
示例2:我们在视图中将刚刚添加的数据删除。 语句:DELETE FROM view2 where stu_name = '孙楠'; 效果:视图中该数据删除成功,第二,在源表中,该数据也不存在了。
4.3修改视图操作:在视图中修改数据也会影响源表中的数据 示例:将视图中赵四的性别修改为女。 语句:update view2 set stu_sex = '女' where stu_name = '张三'; 效果:视图修改成功,源表中的数据跟着改变。
十四、索引
1.索引的定义
索引:就是将数据表中某一列或者几列的值取出来构造成便于查询的结构进行存储, 生成表的目录,当我们进行数据查询的时候,则先在目录中进行查找得到对应数据的地址, 然后再到数据表中根据地址进行快速的获取数据记录,避免全表扫描。 使用索引的目的:数据库是用来存储数据,在实际的项目中使用的数据可能会很大(大 数据),数据表中的查询速度会随着数据量的增长而变慢,从而导致响应用户请求的速度变 慢,我们如何提高查询效率呢?索引就是用来提高查询效率的。
2.索引的分类
mysql 中的索引,根据创建的列的不同,可以分为: 主键索引:在数据表的主键字段创建的索引,这个字段必须被 primary key 修饰,每 张表只能有一个主键 唯一索引:在数据表中的唯一列创建的索引(unique),此列的值不能重复,可以为 null 普通索引:在普通的字段上创建索引,没有唯一性限制 组合索引:两个及以上字段联合起来创建的索引 说明: 在创建数据表时,将字段声明为主键(添加主键约束),会自动在主键字段创建主键 索引 在创建数据表时,将字段声明为唯一键(添加唯一约束),会自动在唯一字段创建唯 一索引
3.创建索引
创建普通索引: 语法:create index <indexName> on <tableName>(<cloumnName>); 示例:将student6表中的stu_name 设置为索引。 语句:create index index_stu_name on student6(stu_name); 效果:索引创建成功,用show index from student6;能够进行查看。
4.创建组合索引
语法:create index <indexName> on <tableName> (<cloumnName1>,<cloumnName2>,...); 示例:将studnet6表中的stu_sex和stu_age创建为组合索引。 效果:组合索引创建成功,用show index from student6;可以进行查看
5.索引的使用
索引创建完成之后,无需人为调用,当你使用的SQl语句,条件中使用到了索引的字段,它会自动使用索引。 示例:查看student6表中的index_stu_name的使用 语句:EXPLAIN select * FROM student6 where stu_name is not null; 效果:成功看到使用了索引。
6.查看/删除索引
查看索引语法:show index from <tableName>;
示例:查看student6表中的所有索引。 语句:show index from student6;
删除索引语法:drop index <indexName> on <tableName>;
示例:删除student6表中的index_stu_name索引 语句:drop index index_stu_name on student6; 效果:索引index_stu_name删除成功。
十五、存储过程
1.什么是储存过程
定义:将能够完成特定功能的 SQL 命令进行封装(SQL 指令集),编译之后存储在数 据库服务器上,为之取一个名字,用户可以通过名字直接调用这个 SQL 指令集,获取执行结 果。
2.存储过程的优缺点
优点: 存储过程是创建并保存在数据库中的,执行时无需再次编译,对 SQL 的执行过程进行 了性能提升 支持流程控制语句(分支、循环),显示更为复杂的业务。 缺点: 存储过程受限于数据库产品,切换不同数据库产品时需要重新编译。 如果需要高并发访问,使用存储过程,会增加数据库的执行连接时间。
3.创建存储过程
语法: Create procedure <procedureName> (参数类型,参数名称,参数的数据类型) Begin 程序体 End;
4.存储过程相关命令
显示当前数据库中的所有存储过程 show PROCEDURE status; 删除指定的存储过程 drop PROCEDURE testway;
5.存储过程的实例讲解
示例1:创建一个自动建表的储存过程(引用的是我们之前的student表的建表语句)。 语句: Create procedure createstudenttable1() Begin CREATE table if not EXISTS student7( stu_num char(8) primary key, stu_name varchar(20) not null, stu_sex char(2) not null, stu_age int NOT NULL ); End; 使用方法:call createstudenttable1(); 思考题:能否使用查询/修改编写存储过程?
示例2: 先创建一张表testpro 建表语句:create table testpro( sss1 int, sss2 int, sss3 int ); 向表中插入100条数据。 创建存储过程:CREATE PROCEDURE testpro1() BEGIN DECLARE m int; set m=1; WHILE m<=100 do INSERT into testpro(sss1,sss2,sss3) VALUES (m,m,m); set m=m+1; END WHILE; END; 使用:call testpro1(); 效果:成功插入数据。
主题