MySQL数据库—基础
1、数据库基础
简单来说,数据库就是一个存储数据的仓库,它将数据按照特定的规律存储在磁盘上。为了方便用户组织和管理数据,其专门提供了数据库管理系统DBMS。通过数据库管理系统,用户可以有效的组织和管理存储在数据库中的数据。本课程所要讲解的 MySQL,就是一种非常优秀的数据库管理系统。
1.1 生活中的应用
超市购物我们在超市购买商品时,就是在访问一个数据库。
结账时,收银员使用条形码阅读器扫描客户购买的每一件商品。这个条形码阅读器连接着一个访问商品数据库的应用程序,该程序根据条形码从商品数据库中找出商品价格,然后从库存中减去本次销售这种商品的数量,并且在屏幕上显示相应的价格。
如果存货量低于设置的临界值,数据库系统将提示进货以补充存货。如果有客户向超市打电话订购商品,售货员可以通过运行应用程序,查看数据库中此商品是否有足够的存货。
信用卡消费
使用信用卡购买商品时,售货员要检查客户是否有足够的信用额度。该项检查可以通过打电话进行,也可以通过一个与计算机系统相连接的信用卡阅读器自动进行。无论哪种方式,一定在某个数据库中存有该客户使用信用卡购买商品的所有信息。
为了检查客户的信用情况,需要有一个数据库应用程序,使用信用卡号码可以查询出这个月客户已购买商品的总价格,加上这次希望用信用卡购买的商品的价格,判断是否仍在信用额度之内。并且,如果用户确认购买,则此次购买商品的详细内容会被记录到该数据库中。
应用程序还要访问数据库,在同意购买之前,检查信用卡不属被盗或丢失之列。此外,一般还有一些其它的应用程序负责每月向信用卡持卡人发送信用卡使用记录,并在收到付款之后向信用卡持卡人发送信息。
旅行社预订假期行程
当旅客向旅行社咨询假期行程安排时,旅行社将访问多个包含假日和航班详细信息的数据库。
若客户预定行程,数据库系统必须进行所有必要的预定安排。在这种情况下,系统必须确保一个座位不被两个不同的旅行社预定,以及航班的预定座位不超过航班的固定座位。
例如,假设从上海飞往北京的航班上仅剩最后一个座位,却有两个旅行社同时要求预定该座位,系统必须能够分辨和处理这种情况,即允许一个预定继续进行,通知另外一个旅行社已经没有剩余的座位。旅行社通常可能还有另外一个数据库用于开列票据。
图书馆
在图书馆中可能存在一个数据库,用来存储图书馆中所有图书的详细资料和读者的详细信息等。
数据库系统还能提供预定服务,即允许读者预定图书,当该书可以借阅时,用邮件或其它方式通知读者。系统还可以向借书的读者发送提醒信息,告知其在规定的期限内尚未归还所借书。
另外,现在所有的图书馆都配备了计算机索引系统,实现了图书的自动查询。使用该系统,可以让读者通过查询书名、作者或出版年份等信息,查找出希望借阅图书的所在位置,以及是否已经借出等信息。
购买保险
无论何时,如果想投保某个保险,比如寿险、家庭财产险或汽车保险,保险经纪人都要访问多个保险机构的数据库。
数据库系统会根据所提供的客户个人详细信息,如姓名、家庭住址、年龄等情况,来确定保险的金额。保险经纪人可通过查阅多个数据库,找到一个能给客户最大实惠的保险。
网上购物
我们平时使用的购物网站都是通过数据库应用驱动的,例如,淘宝、京东、当当等。
当当中有好多在线书店,它允许客户在不同的种类(例如计算机类或者管理类)中浏览和购买书籍。还可以按作者的姓名来浏览书籍。无论何种情形,该组织的网络服务器中都存在一个数据库,含有所有书籍的详细信息(书名、作者、价格、销售记录、出版社、简介和详细描述等),以及是否有存货、书籍运送情况、库存量和订购等信息。
在数据库中书籍可被交叉引用。例如,一本书可能被列在多个种类下,比如同时列在计算机、程序语言、畅销书和推荐书籍名下。
我们可以在线购买一本或多本书籍。当当网会通过数据库保存先前交易的记录(历史订单),包括购买的书名、送货地址和支付价格等详细信息,为网站的用户提供个性化服务。
大学
如果你正在大学就读,学校会有一个用来存储学生所有信息的数据库系统(学生管理系统),包括注册的课程、获得的各类奖学金、往年已选择的课程和今年正在选择的课程以及考试成绩信息等。可能还有一个数据库用来存储在大学中工作员工的详细信息。
以上这些都是生活中常见数据库的应用,你肯定还会遇见其它更多的数据库系统。虽然我们今天对这些应用司空见惯,但其实数据库系统是相当复杂的技术,到现在已经历经了六十多年的发展。
1.2 数据库发展三个阶段
在目前阶段,存储和管理数据都离不开数据库。例如,学校需要使用数据库来存储学生和教师的信息;公司需要使用数据库来存储公司的资料和员工的信息。当数据存储到数据库后,数据库管理系统就会对这些数据进行组织和管理。
数据库管理系统(DBMS)是数据库的核心软件之一,是位于用户与操作系统之间的数据管理软件,用于建立,使用和维护数据库。
数据管理就是对各种数据进行分类、组织、编码、查询和维护,主要经历了 3 个阶段,即人工管理阶段、文件系统阶段和数据库系统阶段。每一个阶段都是以减小数据冗余、增强数据独立性和方便操作数据为目的进行发展。
数据冗余是指数据之间的重复,也可以说是同一数据存储在不同数据文件中的现象。
- 人工管理阶段
在计算机出现之前,人们主要利用纸张和计算工具(如算盘和计算尺)来进行数据的记录和计算,依靠大脑来管理和利用数据。
到了 20 世纪 50 年代中期, 这时计算机刚刚开始萌芽,还没有类似于磁盘等专门管理数据的存储设备,只有纸带、卡片、磁带等外存。所以计算机只能局限于科学技术方面,主要用于科学计算。
也就是说,在人工管理阶段,数据主要存储在纸带、磁带等介质上,或者直接通过手工来记录。
人工管理阶段的特点如下:
- 数据不能长期保存
- 不便于查询数据
- 数据不能共享,冗余度大
- 数据不具有独立性
- 文件系统阶段
在 20 世纪 50 年代后期到 20 世纪 60 年代中期,计算机中的磁盘和磁鼓等直接存取设备开始普及。这时,可以将数据存储在计算机的磁盘上。这些数据都以文件的形式存储,然后通过文件系统来管理这些文件。
上图中有很多文件夹,每个文件夹里又有很多文件,这就是文件系统。文件系统通过文件的存储路径和文件名来访问文件中的数据,我们可以查看、修改、添加和删除这些文件。
相对于人工管理阶段而言,文件系统使数据管理变得简单,不用再为了一个文件而翻箱倒柜的查找。但是,这些文件中的数据没有进行结构化管理,查询起来还是不方便。
文件系统阶段的特点如下:
- 数据可以长期保存
- 数据由文件系统来管理
- 数据冗余大,共享性差
- 数据独立性差
- 无法应对突发事故(文件误删,磁盘故障等)
- 数据库系统阶段
在 20 世纪 60 年代后期,随着网络技术的发展,计算机软/硬件的进步,出现了数据库技术,该阶段就是所谓的数据库系统阶段。
数据库系统阶段使用专门的数据库来管理数据,用户可以在数据库系统中建立数据库,然后在数据库中建立表,最后将数据存储在这些表中。用户可以直接通过数据库管理系统来查询表中的数据。
相对于文件系统来说,数据库系统实现了数据结构化。在文件系统中,独立文件内部的数据一般是有结构的,但文件之间不存在联系,因此整体来说是没有结构的。 数据库系统虽然也常常分成许多单独的数据文件,但是它更注意同一数据库中各数据文件之间的相互联系。
数据库系统阶段的特点如下:
- 数据由数据库管理系统统一管理和控制
- 数据共享性高,冗余度低
- 数据独立性强
- 数据粒度小
数据粒度是数据库中数据的细化程度。细化程度越高,粒度越小;细化程度越低,粒度越大。
数据管理经历的各个阶段都有自己的背景及特点,数据管理技术也在发展中不断地完善,其 3 个阶段的比较如下表所示。
1.3 数据库概念
数据库(Database)指长期存储在计算机内的、有组织的、可共享的数据集合。通俗的讲,数据库就是存储数据的地方,就像冰箱是存储食物的地方一样。在生活中,每个人都在使用数据库。当我们在电话簿里查找名字时,就是在使用数据库。在某个浏览器上进行搜索时,也是在使用数据库。以及平时我们登录网络,也需要依靠数据库验证自己的名字和密码。即便是在使用 ATM 机时,也要利用数据库进行 PIN 码验证和余额检查。
数据库实际上就是一个文件集合,是一个存储数据的仓库,本质就是一个文件系统,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作。
在日常生活中,人们可以直接用中文、英文等自然语言描述客观事物。在计算机中,则要抽象出对这些事物感兴趣的特征,并组成一个记录来描述。
数据库管理系统(DBMS)是数据库系统的核心软件之一,是位于用户与操作系统之间的数据管理软件,用于建立,使用和维护数据库。它的主要功能包括数据定义、数据操作、数据库的运行管理、数据库的建立和维护等几个方面。
我们常说 XX 数据库,其本质上是 XX 数据库管理系统。目前,较为流行的数据库管理系统有 MySQL、SQL Server、Oracle 和 DB2 , Hive 等。
1.4 数据库分类
- 关系型数据库
关系型数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。简单说,关系型数据库是由多张能互相连接的表组成的数据库。
关系型数据库是现在应用最广泛的数据库。关系型数据库在 1969 年诞生,可谓历史悠久。和 Excel 工作表一样,关系型数据库也采用由行和列组成的二维表来管理数据,所以简单易懂。同时,它还使用 SQL(Structured Query Language,结构化查询语言)对数据进行操作。
传统的关系型数据库采用表格的存储方式,数据以行和列的方式进行存储,要读取和查询都十分方便。下表是一些在关系型数据库中的数据。
优点
- 都是使用表结构,格式一致,易于维护。
- 使用通用的 SQL 语言操作,使用方便,可用于复杂查询。
- 数据存储在磁盘中,安全。
缺点
- 读写性能比较差,不能满足海量数据的高效率读写。
- 不节省空间。因为建立在关系模型上,就要遵循某些规则,比如数据中某字段值即使为空仍要分配空间。
- 固定的表结构,灵活度较低。
常见的关系型数据库有 Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access 和 MySQL 等。
- 非关系型数据库
非关系型数据库又被称为 NoSQL(Not Only SQL ),意为不仅仅是 SQL。通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。
优点
- 非关系型数据库存储数据的格式可以是 key-value 形式、文档形式、图片形式等。使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
- 速度快,效率高。 NoSQL 可以使用硬盘或者随机存储器RAM作为载体,而关系型数据库只能使用硬盘。
- 海量数据的维护和处理非常轻松。
- 非关系型数据库具有扩展简单、高并发、高稳定性、成本低廉的优势。
- 可以实现数据的分布式处理。
缺点
- 非关系型数据库暂时不提供 SQL 支持,学习和使用成本较高。
- 非关系数据库没有事务处理,没有保证数据的完整性和安全性。适合处理海量数据,但是不一定安全。
- 功能没有关系型数据库完善。
常见的非关系型数据库有 Neo4j、MongoDB、Redis、Memcached、MemcacheDB 和 HBase 等。
1.5 数据库的优势
随着互联网技术的高速发展,预计2021 年全世界网民的数量将达到 50 多亿。网民数量的增加带动了网上购物、微博,网络视频等产业的发展。那么,随之而来的就是庞大的网络数据量。
大量的数据正在不断产生,那么如何安全有效地存储、检索,管理它们呢?于是对数据的有效存储、高效访问、方便共享和安全控制等问题成为了信息时代一个非常重要的问题。
使用数据库可以高效且条理分明地存储数据,它使人们能够更加迅速和方便地管理数据,主要体现在以下几个方面。
1) 数据库可以结构化存储大量的数据信息,方便用户进行有效的检索和访问。
数据库可以对数据进行分类保存,并且能够提供快速的查询。例如,我们平时使用百度搜索内容时,百度也是基于数据库和数据分类技术来达到快速搜索的目的。
2) 数据库可以有效地保持数据信息的一致性、完整性、降低数据冗余。
可以很好地保证数据有效、不被破坏,而且数据库自身有避免重复数据的功能,以此来降低数据的冗余。
3) 数据库可以满足应用的共享和安全方面的要求,把数据放在数据库中在很多情况下也是出于安全的考虑。
例如,如果把所有员工信息和工资数据都放在磁盘文件上,则工资的保密性就无从谈起。如果把员工信息和工资数据放在数据库中,就可以只允许查询和修改员工信息,而工资信息只允许指定人(如财务人员)查看,从而保证数据的安全性。
4) 数据库技术能够方便智能化地分析,产生新的有用信息。
例如,超市中把物品销售信息保存在数据库中,每个月销售情况的排名决定了下半月的进货数量。数据库查询的结果实际上产生了新的数据信息。
另外 ,数据挖掘、联机分析等技术近年来发展非常快,其核心意义在于从一堆数据中分析出有用的信息,而数据库就可以为我们解决这些复杂的问题。
1.6 DBMS
数据库系统(Database System,DBS)由硬件和软件共同构成。硬件主要用于存储数据库中的数据,包括计算机、存储设备等。软件部分主要包括数据库管理系统、支持数据库管理系统运行的操作系统,以及支持多种语言进行应用开发的访问技术等。
数据库系统是指在计算机系统中引入数据库后的系统。完整的数据库系统结构关系如图所示:
由图可知,一个完整的数据库系统一般由数据库、数据库管理系统、应用开发工具、应用系统、数据库管理员和用户组成。
数据库系统主要有以下 3 个组成部分:
- 数据库:用于存储数据的地方。
- 数据库管理系统:用于管理数据库的软件。
- 数据库应用程序:为了提高数据库系统的处理能力所使用的管理数据库库的软件补充。
数据库(DataBase,DB)提供了一个存储空间来存储各种数据,可以将数据库视为一个存储数据的容器。一个数据库可能包含许多文件,一个数据库系统中通常包含许多数据库。
数据库管理系统(Database Management System,DBMS)是用户创建、管理和维护数据库时所使用的软件,位于用户和操作系统之间,对数据库进行统一管理。DBMS 能定义数据存储结构,提供数据的操作机制,维护数据库的安全性、完整性和可靠性。
虽然已经有了 DBMS,但是在很多情况下,DBMS 无法满足对数据管理的要求。
数据库应用程序(DataBase Application)的使用可以满足对数据管理的更高要求,还可以使数据管理过程更加直观和友好。数据库应用程序负责与 DBMS 进行通信、访问和管理 DBMS 中存储的数据,允许用户插入、修改、删除数据库中的数据。
下面再简单介绍一下 DBMS 提供的一些功能,主要包括以下几个方面。
1) 数据定义功能
DBMS 提供数据定义语言(Data Definition Language,DDL),用户通过它可以方便地对数据库中的数据对象进行定义。
2) 数据操纵功能
DBMS 还提供数据操纵语言(Data Manipulation Language,DML),用户可以使用 DML 操作数据,实现对数据库的基本操作,如查询、插入、删除和修改等。
3) 数据库的运行管理
数据库在建立、运用和维护时由数据库管理系统统一管理、统一控制,以保证数据的安全性、完整性、多用户对数据的并发使用及发生故障后的系统恢复。例如:
- 数据的完整性检查功能保证用户输入的数据应满足相应的约束条件;
- 数据库的安全保护功能保证只有赋予权限的用户才能访问数据库中的数据;
- 数据库的并发控制功能使多个用户可以在同一时刻并发地访问数据库的数据;
- 数据库系统的故障恢复功能使数据库运行出现故障时可以进行数据库恢复,以保证数据库可靠地运行。
4) 提供方便、有效地存取数据库信息的接口和工具
编程人员可通过编程语言与数据库之间的接口进行数据库应用程序的开发。数据库管理员(Database Administrator,DBA)可通过提供的工具对数据库进行管理。
数据库管理员是维护和管理数据库的专门人员。
5) 数据库的建立和维护功能
数据库功能包括数据库初始数据的输入、转换功能,数据库的转储、恢复功能,数据库的重组织功能和性能监控、分析功能等。这些功能通常由一些使用程序来完成。
1.7 MySQL介绍
MySQL 是最流行的数据库之一,是一个免费开源的关系型数据库管理系统,但也不意味着该数据库是完全免费的。MySQL 由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 适合中小型软件,被个人用户以及中小企业青睐。
针对不同的用户,MySQL 分为两个版本:
- MySQL Community Server(社区版):该版本是自由下载且完全免费的,但是官方不提供技术支持。
- MySQL Enterprise Server(企业版):该版本是收费的,而且不能下载,但是该版本拥有完善的技术支持(官方提供电话技术支持)。注意:MySQL Cluster 主要用于架设群服务器,需要在社区服务或企业版的基础上使用。
MySQL 的命名机制由 3 个数字和 1 个后缀组成,例如 mysql-5.7.20:
- 第 1 个数字“5”是主版本号,用于描述文件的格式,所有版本 5 的发行版都有相同的文件夹格式。
- 第 2 个数字“7”是发行级别,主版本号和发行级别组合在一起便构成了发行序列号。
- 第 3 个数字“20”是在此发行系列的版本号,随每次新发行的版本递增。通常选择已经发行的最新版本。
在 MySQL 开发过程中,同时存在多个发布系列,每个发布系列的成熟度处在不同阶段。
- MySQL 8.0.23 是最新开发的稳定(GA)发布系列,是将执行新功能的系列,目前已经可以正常使用。
- MySQL 5.7 是最新开发的稳定(GA)发布系列,是将执行新功能的系列,目前已经可以正常使用。
- MySQL 5.6 是比较稳定的(GA)发布系列,只针对漏洞修复重新发布,不增加会影响稳定性的新功能。
- MySQL 5.1 是一个稳定的(产品质量)发布系列,只针对严重漏洞修复和安全修复重新发布,不增加影响该系列稳定性的重要功能。
1.8 MySQL 客户群体
MySQL 是目前世界上最流行的开源关系数据库,大多应用于互联网行业。比如,在国内,大家所熟知的百度、腾讯、淘宝、京东、网易、新浪等,国外的 Google、Facebook、Twitter、GitHub 等都在使用 MySQL。社交、电商、游戏的核心存储往往也是 MySQL。
- Web 网站系统
Web 网站开发者是 MySQL 最大的客户群,也是 MySQL 发展史上最为重要的支撑力量。
MySQL 之所以能成为 Web 网站开发者们最青睐的数据库管理系统,是因为 MySQL 数据库的安装配置都非常简单,使用过程中的维护也不像很多大型商业数据库管理系统那么复杂,而且性能出色。还有一个非常重要的原因就是 MySQL 是开放源代码的,完全可以免费使用。
2、日志记录系统
MySQL 数据库的插入和查询性能都非常的高效,如果设计的好,在使用 MyISAM 存储引擎的时候,两者可以做到互不锁定,达到很高的并发性能。所以,对需要大量的插入和查询日志记录的系统来说,MySQL 是非常不错的选择。比如处理用户的登录日志,操作日志等,都是非常适合的应用场景。
3、数据仓库系统
随着现在数据仓库数据量的飞速增长,我们需要的存储空间越来越大。数据量的不断增长,使数据的统计分析变得越来越低效,也越来越困难。下面是几个主要的解决思路。
1)采用昂贵的高性能主机以提高计算性能,用高端存储设备提高 I/O 性能,效果理想,但是成本非常高;
2)通过将数据复制到多台使用大容量硬盘的廉价 PC Server 上,以提高整体计算性能和 I/O 能力,效果尚可,存储空间有一定限制,成本低廉;
3)通过将数据水平拆分,使用多台廉价的 PC Server 和本地磁盘来存放数据,每台机器上面都只有所有数据的一部分,解决了数据量的问题,所有 PC Server 一起并行计算,也解决了计算能力问题,通过中间代理程序调配各台机器的运算任务,既可以解决计算性能问题又可以解决 I/O 性能问题,成本也很低廉。
在上面的三个方案中,第二和第三个的实现,MySQL 都有较大的优势。通过 MySQL 的简单复制功能,可以很好的将数据从一台主机复制到另外一台 ,不仅仅在局域网内可以复制,在广域网同样可以。
当然,很多人可能会说,其他的数据库同样也可以做到,不是只有 MySQL 有这样的功能。确实,很多数据库同样能做到,但是 MySQL 是免费的,其他数据库大多都是按照主机数量或者 cpu 数量来收费,当我们使用大量的 PC Server 的时候,License 费用相当惊人。所以第一个方案,基本上所有数据库系统都能够实现,但是其高昂的成本不是每一个公司都能够承担的。
4、嵌入式系统
嵌入式环境对软件系统最大的限制是硬件资源非常有限,在嵌入式环境下运行的软件系统,必须是轻量级低消耗的软件。
MySQL 在资源的使用方面的伸缩性非常大,可以在资源非常充裕的环境下运行,也可以在资源非常少的环境下正常运行。它对于嵌入式环境来说,是一种非常合适的数据库系统,而且 MySQL 有专门针对于嵌入式环境的版本。
并且,MySQL 的定位是通用数据库,各种类型的应用一般都能利用到 MySQL 存取数据的优势。业内生产实践证明,MySQL 更适合中小型企业。以目前的软硬件产品水平来看,如果数据超过几个 TB 将难以高效利用 MySQL。
MySQL 可以作为传统的关系型数据库产品使用,也可以当作一个 key-value 产品来使用。由于它具有优秀的灾难恢复功能,因此相对于目前市场上的一些 key-value 产品会更有优势。
2. MySQL安装
2.1 MySQL下载
MySQL 数据库原来隶属于 MySQL AB 公司,在 2008 年 1 月 16 日,被 SUN 收购。在 2009 年 SUN 公司被 Oracle 公司收购。随着 MySQL 数据库功能的不断完善,该数据库几乎支持所有操作系统,同时也增加了许多新特性,这些都是 MySQL 发展迅猛的原因。
下载地址 :https://dev.mysql.com/downloads/
版本选择 : https://downloads.mysql.com/archives/community/
2.2 MySQL免安装配置
- 解压
- 配置环境变量
将MySQL解压后的bin路径配置到系统的环境变量path中即可
E:\MyPrograme\mysql-8.0.12-winx64\bin
- 创建my.ini配置文件
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=E:\Program Files\mysql-8.0.12-winx64
# 设置mysql数据库的数据的存放目录
datadir=E:\Program Files\mysql-8.0.12-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
# mysql_native_password
default_authentication_plugin=mysql_native_password
# 设置默认时区为东八区
default-time-zone = ‘+8:00’
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
- 初始化的my.ini文件
命令 : mysqld —initialize —console
获取临时密码: root @ localhost 临时密码 【注意 : 不含首位空格】
- 安装并启动MySQL的服务
在mysql安装的bin下打开cmd
注册MySQL服务 : mysqld —install 服务名
管理员模式下启动cmd
启动已注册的服务 : net start 服务名
停止已注册的服务 : net stop 服务名
删除注册的服务 : sc delete 服务名
登录并修改密码
普通模式进入cmd正常连接MySQL服务器即可(此处需要使用临时密码)
mysql -u 用户名 -p
临时密码
2. 临时密码没有更多的功能权限,需要将密码重置
alter user ‘root’@’localhost’ identified by ‘密码’
要想删除注册表已经注册的服务,则需要在管理员模式下进入cmd2.3 MySQL的入门命令
— 客户端连接MySQL的服务器
— 1. 进入cmd命令行
C:\Users\Administrator>mysql -uroot -p 从客户端连接到MySQL的服务器
Enter password: ** 数据库账号的密码
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.12 MySQL Community Server - GPL
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql> show databases; 展示数据库系统中的所有仓库
+——————————+
| Database |
+——————————+
| information_schema |
| mysql |
| performance_schema |
| sys |
+——————————+
4 rows in set (0.01 sec)
mysql> create database tc38; 新建数据库
Query OK, 1 row affected (0.04 sec)
mysql> show databases; 展示出所有的数据库
+——————————+
| Database |
+——————————+
| information_schema |
| mysql |
| performance_schema |
| sys |
| tc38 |
+——————————+
5 rows in set (0.00 sec)
mysql> use tc38; 切换到选择的数据库
Database changed
mysql> show tables; 展示出当前数据库中的所有表信息
Empty set (0.01 sec)
mysql> drop database tc38; 删除数据库(谨慎操作)
Query OK, 0 rows affected (0.12 sec)
- 连接数据库: mysql -u用户名 -p密码
- 查看已有数据库 : show databases;
- 使用该数据库 : use 数据库名;
- 创建一个数据库 : create database 数据库名;
- 删除数据库 : drop database 数据库名;
- 展示数据库中的所有表信息 : show tables;
3. 数据库表的设计
- 数据库设计的概念
数据库设计是将数据库中的数据实体及这些数据实体之间的关系,进行规划和结构化的过程。
- 数据库设计的重要性
如果一个数据库没有进行一个良好的设计,那么这个数据库完成之后他的缺点是:
- 效率会很低
- 更新和检索数据时会出现很多问题,
反之,一个数据库被尽心策划了一番,具有良好的设计,那他的优点是:
- 效率会很高.
- 便于进一步扩展.
- 使得应用程序的开发变得更容易.
- 设计数据库的步骤
- 需求分析阶段 : 分析客户的业务和数据处理需求.(耗时最长的: 业务复杂)
- 概要设计阶段 : 他主要就是绘制数据库的E-R图(绘制实体关系图)
- 逻辑设计阶段 : 应用数据库的三大范式进行审核数据库的结构.
总结 : 在进行数据库的系统分析时 , 需要安装下面的基本步骤处理:
- 收集信息
- 标识实体
- 标识每个实体需要储存的详细信息
- 标识实体之间的关系
3.1 E-R图
E-R图也称实体-联系图,是一种提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。它是描述现实世界关系概念模型的有效方法。是表示概念关系模型的一种方式。通俗点讲就是,当我们理解了实际问题的需求之后,需要用一种方法来表示这种需求,概念模型就是用来描述这种需求。
ER图组成要素
- 实体
是指现实世界中具有区分其他事物的特征或属性与其他实体有联系的实体,针对于数据库中的表而言实体是指表中一行一行特定数据(一条记录),但我们在开发中,也常常把整个表称为一个实体. (矩形)
- 属性
可以理解为实体的特征,针对于数据库中的表而言实体是指表中的列. (椭圆)
- 联系
是两个或多个实体之间的关联关系. (菱形)
ER图符号说明
- 实体 : 矩形
- 属性 : 椭圆
- 联系 : 菱形
ER映射基数
- 一对一 : X中的一个实体最对与Y中的一个实体关联,并且Y中的一个实体最多与X中的一个实体关联.
eg : 一个人只有一张身份证. 一个人只有一个班级 , 一个员工只有一个部门
- 一对多 : X中的一个实体可以与Y中的任意数量的实体关联;Y中的一个实体最多与X中的一个实体关联.
eg: 一个班级有多名学生. 一个部门有多个员工 一个人有多种角色
- 多对一 : X中的一个实体最多与Y中的一个实体关联;Y中的一个实体可以与X中的任意数量的实体关联.
eg:客人与客房之间的关系,一个客人只能住一间客房.
- 多对多 : X中的一个实体可以与Y中的任意数量的实体关联,反之亦然.
eg:
学生和课程之间的关系,一个学生可以有多门课程,一门课程可以对应多名学生.
玩家和角色之间的关系,一个玩家可以选择多个角色, 一个角色也可以对应多个玩家
RBAC 权限管理(5张表)
用户 角色
角色 权限
多对多关系的处理 : 可以拆分成两个一对多的形式(专门设计一个中间表来保存数据)
E/R博客系统分析
E/R设计
学生实体 :学号 姓名 性别 生日 籍贯 班级编号
班级 : 班级编号 班级名称 老师代号
教师 : 教师编号 姓名 性别 生日
课程 : 课程代号 课程名称 学时 学分
成绩 : 学号 课程代号 成绩
排课 : 班级代号 课程代号 老师代号
3.2 数据库设计三范式
范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。
范式 : 3个设计表的规范(强制规范和可以违反的规范)
就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。数据库范式也分为1NF, 2NF, 3NF, BCNF, 4NF, 5NF,一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式,例如符合2NF的关系模式,必定符合1NF。
1NF ∈ 2NF ∈ 3NF ∈ BCNF ∈ 4NF ∈ 5NF
- 第一范式
目标是确保每列的原子性.如果每列都是不可再分的最小数据单元,则满足第一范式。必须是原数据(可计算 ,能拆分,无存储意义的都是违反1NF的)
分析 : 以下属性是否属于1NF
姓名 性别 籍贯 民族 学历 身高 体重 三围 年龄 部门
25
原子性 : 姓名 性别 籍贯 民族 学历 身高 体重 胸围 腰围 臀围 生日 部门
姓名 班级 语文 数学 英语 总分
姓名 订单号 金额 省 市 区县 街道 具体门牌号
- 第二范式
第二范式在第一范式的基础上更进一层,其目标是确保表中的每列都和主键相关,也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中.如果一个关系满足第一范式,并且除了主键以外的其他列都依赖与该主键.则满足第二范式.
课程 : 课程名 学时 学分
班级 : 班级名称 班主任
学生 : 姓名 课程 分数
- 第三范式
第三范式在第二范式的基础上更进一层,第三范式的目标是确保每列都和主键列直接相关,而不是间接相关.如果一个关系满足第二范式,并且除了主键以外的其他列都这能依赖于主键列,列和列之间不存在相互依赖关系,则满足第三范式.
完全依赖 : A -> B ,C, D, E
传递依赖 : A -> B,C,D C -> E
数据冗余 : 数据无意义的重复存储
为了满足三大范式,我们的数据操作性能会受到相应的影响,所以,在实际的数据库设计中,既要考虑三大范式,避免数据的冗余和各种数据操作异常;有要考虑到数据访问性能,有时,为了减少表间连接,提高数据库的访问性能,允许适当的数据冗余列,这可能是最合适的数据库设计方案.
原始数据 : 员工编号 姓名 性别 雇佣日期 职位 工资标准 奖金标准 部门名称 办公地点 工资发放月 实发工资 实发奖金
员工表 : 员工编号 姓名 性别 雇佣日期 职位 工资标准 奖金标准 部门编
部门表 : 部门编号 部门名称 办公地点
工资发放表 : 员工编号 部门编号 工资发放月 实发工资 实发奖金
满足3F设计原则
3.2 数据库创建表
3.2.1 数据类型
MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
- 数值类型
- 日期类型
- 文本类型
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
MySQL 常用的数据类型
- 整数 tinyint smallint intbigint
- 浮点数
- 精度要求不高 : float double
- 精度要求高 : decimal
- 字符串类型
- char : 定长(效率高)
- varchar : 变长 (效率较char会低 )
- text : 长文本
- enum : 单选功能 enum(‘男’,’女’)
- set : 多选功能 set(‘篮球’,’足球’,’乒乓球’,’游泳’,’台球’,’LOL’,’王者荣耀’) 替代了检查约束
- 日期
- date : 年月日
- datetime : 年月日时分秒
3.2.2 建表基础语法
— MySQL 创表语法
CREATE TABLE [if not exists] 表名(
列名1 类型(长度) 约束 注释,
列名2 类型(长度) 约束 注释,
列名3 类型(长度) 约束 注释
);
需求 : 创建一个员工表(编号,工号, 姓名, 性别 , 生日, 薪资,部门编号)
CREATE TABLE IF NOT EXISTS t_emp(
id int(8)
tno char(10),
name varchar(30),
gender char(1),
birthday date,
salary decimal(8,2),
dept_id int(8)
);
— 记录
mysql> use tc38
Database changed
mysql> CREATE TABLE t_emp(
-> id int(8),
-> tno char(10),
-> name varchar(30),
-> gender char(1),
-> birthday date,
-> salary decimal(8,2),
-> dept_id int(8)
-> );
Query OK, 0 rows affected (0.08 sec)
mysql> show tables;
+————————+
| Tables_in_tc38 |
+————————+
| t_emp |
+————————+
1 row in set (0.00 sec)
mysql> desc t_emp; 查看表的结构
+—————+———————+———+——-+————-+———-+
| Field | Type | Null | Key | Default | Extra |
+—————+———————+———+——-+————-+———-+
| id | int(8) | YES | | NULL | |
| tno | char(10) | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| salary | decimal(8,2) | YES | | NULL | |
| dept_id | int(8) | YES | | NULL | |
+—————+———————+———+——-+————-+———-+
7 rows in set (0.00 sec)
mysql> drop table t_emp; — 删除指定的表
Query OK, 0 rows affected (0.10 sec)
4. 约束
数据库是用于存储数据的容器,具体数据是存储在数据表中的,数据主要体现在数据表中的数据列上,通过数据列描述了具体的某个数据。指定的数据列具体能怎么样存储数据,应该按照什么方式存储数据都是有一定的约束规则的,这样的约束规则就是数据表约束。约束关键字:constraint在创建表的时候,可以给表中的字段添加一些约束来保证表中数据的完整性和有效性。
列级约束:哪个字段需要添加约束,直接将约束名称写到该字段后面即可。表级约束:约束没有添加在列的后面,多个字段联和约束的时候使用。格式:约束名(字段1,字段2,…)
约束名称 | 含义 |
---|---|
default | 默认约束,该字段不指定数据时,数据为默认值 |
not null | 非空约束,该字段数据不能为NULL |
unique | 唯一约束,该字段的数据是唯一的,不能重复 |
primary key | 主键约束,该字段数据唯一 |
foreign key | 外键约束 |
check | 检查约束,mysql不支持(8.0.16以上版本支持check),oracle支持 |
4.1 主键约束
primary key (简称PK)
- 主键值是每行记录的唯一标识,一张表只能有一个主键。
- 任何一张表都应该有主键,没有主键,表无效!
CREATE TABLE IF NOT EXISTS t_emp(
id int(8) PRIMARY KEY, — 列级别的约束
tno char(10),
name varchar(30),
gender char(1),
birthday date,
salary decimal(8,2),
dept_id int(8)
);
— 为了演示主键的功能, 给大家提前普及一个简单的插入语句
语法 : insert into 表名(列1,列2) value(值1,值2);
mysql> insert into t_emp(name) value(‘tom’);
ERROR 1364 (HY000): Field ‘id’ doesn’t have a default value
mysql> insert into t_emp(id,name) value(1,’tom’);
Query OK, 1 row affected (0.01 sec) — 插入数据成功
— 为了查看效果 , 给大家提前普及一个简单的查询语句
语法 : select 列1,列2.. from 表;
select from t_emp; — 通配符(表示当前表中的所有列名)
mysql> select * from t_emp;
+——+———+———+————+—————+————+————-+
| id | tno | name | gender | birthday | salary | dept_id |
+——+———+———+————+—————+————+————-+
| 1 | NULL | tom | NULL | NULL | NULL | NULL |
+——+———+———+————+—————+————+————-+
1 row in set (0.00 sec)
mysql> insert into t_emp(id,name) value(1,’tom’);
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’ — 违反主键的约束
重点 : 设置一个主键的自动递增策略 auto_increment, 默认从1开始自动递增 (需要添加到建表语句中)
DROP TABLE IF EXISTS t_emp;
CREATE TABLE IF NOT EXISTS t_emp(
id int(8) PRIMARY KEY auto_increment, — 列级别的约束
tno char(10),
name varchar(30),
gender char(1) DEFAULT ‘男’,
birthday date,
salary decimal(8,2),
dept_id int(8)
);
insert into t_emp(name) value(‘tom’); — 可以正常插入(主键值是默认自动自增的)
insert into t_emp(gender,name) value(‘女’,’tom’);
- 主键的特征:not null + unique(主键值不能为空且不能重复)
mysql> insert into vip values(1,’admin’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into vip values(2,’jack’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into vip values(2,’jack’);
ERROR 1062 (23000): Duplicate entry ‘2’ for key ‘vip.PRIMARY’
mysql> insert into vip(name) values(‘tom’);
ERROR 1364 (HY000): Field ‘id’ doesn’t have a default value
- 主键可以使用列级约束添加,也可以使用表级约束添加。
mysql> create table vip(
-> id int,
-> name varchar(10),
-> primary key(id));
Query OK, 0 rows affected (0.03 sec)
- 多个字段可以联合添加主键,称为复合主键,不建议使用。
mysql> create table vip(
-> id int,
-> name varchar(10),
-> primary key(id,name));
Query OK, 0 rows affected (0.03 sec)
- 主键除了单一主键和复合主键以外,还可以分为自然主键和业务主键。自然主键:主键值是一个自然数,与业务无关。 id (auto_increment)业务主键:主键值与业务紧密关联,例如用银行卡号做主键值(身份证号码)。在实际开发中,自然主键使用更多,因为主键只要做到不重复即可,无实际意义。使用业务主键,当业务发生变动时没可能会影响到主键值。
- 在mysql中可以使用auto_increment自动维护主键值,表示自增,从1开始,递增1。
mysql> CREATE TABLE vip (
-> id int(11) NOT NULL AUTO_INCREMENT,
-> name varchar(10),
-> primary key(id)
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.03 sec)
4.2 默认约束
default默认值约束
- 数据INSERT操作时,如果该列不指定数据,就使用默认值插入。
mysql> create table vip(
-> id int,
-> name varchar(10),
-> gender char(4) default ‘男’
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> insert into vip(id,name) values (1,’jack’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into vip(id,name,gender) values (2,’tom’,’男’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into vip(id,name,gender) values (3,’mali’,’女’);
Query OK, 1 row affected (0.01 sec)
mysql> select * from vip;
+———+—————-+————+
| id | name | gender |
+———+—————-+————+
| 1 | jack | 男 | — 在插入该条数据时,并没有指定性别
| 2 | tom | 男 |
| 3 | mali | 女 |
+———+—————-+————+
3 rows in set (0.01 sec
4.2 非空约束
not null非空约束
- 非空约束的字段必须传值且不能传null。not null只有列级约束。
DROP TABLE IF EXISTS t_emp;
CREATE TABLE IF NOT EXISTS t_emp(
id int(8) PRIMARY KEY auto_increment, — 列级别的约束
tno char(10) not null, — 添加非空约束tno
name varchar(30),
gender char(1) DEFAULT ‘男’,
birthday date,
salary decimal(8,2),
dept_id int(8)
);
mysql> insert into t_emp(name) value(‘tom’);
ERROR 1364 (HY000): Field ‘tno’ doesn’t have a default value
mysql> insert into t_emp(tno,name) value(‘WNSH001’,’tom’);
mysql> insert into t_emp(tno,name,birthday) value(‘WNSH001’,’tom’,’2001-09-08’);
4.3 唯一约束
unique唯一约束
- 唯一约束的字段不能重复,但是可以为NULL,NULL可以有多个
DROP TABLE IF EXISTS t_emp;
CREATE TABLE IF NOT EXISTS t_emp(
id int(8) PRIMARY KEY auto_increment, — 列级别的约束
tno char(10) not null unique, — 添加非空约束 和 唯一约束 tno
name varchar(30),
gender char(1) DEFAULT ‘男’,
birthday date,
salary decimal(8,2),
dept_id int(8)
);
mysql> insert into t_emp(tno,name,birthday) value(‘WNSH001’,’jack’,’2001-09-08’);
mysql> insert into t_emp(tno,name,birthday) value(‘WNSH001’,’jack’,’2001-09-08’);
ERROR 1062 (23000): Duplicate entry ‘WNSH001’ for key ‘tno’ —违反了唯一约束
mysql> insert into t_emp(tno,name,birthday) value(‘WNSH002’,’jack’,’2001-09-08’);
Query OK, 1 row affected (0.10 sec) — 表示成功插入了一行数据
- 多个字段联合唯一,将多个字段看成一个整体,全部一样视为相同,部分一样依旧可以插入
mysql> create table vip(
-> id int,
-> name varchar(10) not null,
-> email varchar(255),
-> unique(name,email));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into vip values(1,’zhangsan’,’zs@123.com’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into vip values(2,’zhangsan’,’zs@sina.com’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into vip values(3,’zhangsan’,’zs@sina.com’);
ERROR 1062 (23000): Duplicate entry ‘zhangsan-zs@sina.com’ for key ‘vip.name’
4.5 外键约束
foreign key(简称FK)
为了避免数据冗余和空间浪费,可以通过添加外键来保证数据的有效性,减少垃圾数据的处理。
create table 表名(
字段 数据类型,
foreign key(外键字段名) references 引用表(引用字段名)
);
注意:
- 添加外键的表称为子表,被引用的表称为父表。
- 引用字段不一定是主键字段,但至少要有unique约束。
- 子表中外键约束的字段值只能是父表中引用字段的数据,父表中没有的不能插入。
- 创建表的顺序?先创建父表,再创建子表。
- 插入数据的顺序?先插入父表,再插入子表。
-
4.6 check约束
Oracle数据库中,有完整的检查约束的操作方式 check in(‘男’, ‘女’)
- 检查约束:对于插入到数据表中的具体数据进行条件判断
- MySQL数据库中5版本没有提供检查语法;8版本提供了检查语法没有实现
- MySQL8.0.16 版本后支持了check语法的检查
解决方案 : 高级数据类型 enum (单选) set(多选) 来解决
DROP TABLE IF EXISTS t_emp;
CREATE TABLE IF NOT EXISTS t_emp(
id int(8) PRIMARY KEY auto_increment, — 列级别的约束
tno char(10) not null unique, — 添加非空约束 和 唯一约束 tno
name varchar(30),
gender enum(‘男’,’女’) DEFAULT ‘男’,
birthday date,
salary decimal(8,2),
dept_id int(8)
);
mysql> INSERT INTO T_EMP(tno,name,gender) VALUE(‘WNSH002’,’孙悟空’,’仙’);
ERROR 1265 (01000): Data truncated for column ‘gender’ at row 1
mysql> INSERT INTO T_EMP(tno,name,gender) VALUE(‘WNSH002’,’孙悟空’,’男’);
Query OK, 1 row affected (0.06 sec)
mysql> SELECT * FROM t_emp;
+——+————-+—————-+————+—————+————+————-+
| id | tno | name | gender | birthday | salary | dept_id |
+——+————-+—————-+————+—————+————+————-+
| 1 | WNSH001 | JACK.MA | 女 | NULL | NULL | NULL |
| 2 | WNSH002 | 孙悟空 | 男 | NULL | NULL | NULL |
+——+————-+—————-+————+—————+————+————-+
2 rows in set (0.00 sec)
MySQL 8.0.16 版本及高版本支持check约束
DROP TABLE IF EXISTS t_emp;
CREATE TABLE IF NOT EXISTS t_emp(
id int(8) NOT NULL AUTO_INCREMENT,
tno char(10) not null, — 添加非空约束(只能是列级别的约束)
name varchar(30),
gender char(1) DEFAULT ‘男’,
birthday date,
salary decimal(8,2),
dept_id int(8),
constraint emp_id_pk PRIMARY KEY(id), — 表级别约束
constraint emp_tno_uk UNIQUE(tno),
constraint emp_gender_ck CHECK(gender=’男’ || gender=’女’)
);
mysql> insert into t_emp(tno,gender) value(‘WNSH001’,’男’);
ERROR 1062 (23000): Duplicate entry ‘WNSH001’ for key ‘emp_tno_uk’ — 约束名是用来定位错误发生的位置
5. 注释(评论)
COMMENT创建表时对于列的描述信息
sql 脚本程序
DROP TABLE IF EXISTS t_emp;
CREATE TABLE IF NOT EXISTS t_emp(
id int(8) NOT NULL AUTO_INCREMENT,
tno char(10) not null COMMENT ‘工号’,
name varchar(30) COMMENT ‘姓名’,
gender char(1) DEFAULT ‘男’ COMMENT ‘性别’,
birthday date COMMENT ‘生日’,
salary decimal(8,2) COMMENT ‘薪资’,
dept_id int(8) COMMENT ‘部门编号’,
CONSTRAINT emp_id_pk PRIMARY KEY(id),
CONSTRAINT emp_tno_uk UNIQUE(tno),
CONSTRAINT emp_gender_ck CHECK(gender=’男’ || gender=’女’)
);
5. 数据库操作
5.1 SQL语句的分类
- DDL(Data Definition Languages)语句:数据定义语言。这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括create、drop、alter等。
- DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和并检查数据完整性,常用的语句关键字主要包括insert、delete、udpate, 执行语句后需要提交commit后方可生效 (Oracle 中必须手动提交后才可以对操作生效,而MySQL服务器将客户端的DML操作完成了自动提交)
- DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant(授权)、revoke(回收权限) 等,专业DBA使用。
5.1 DCL
DCL(Data Control Language)语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke 等。
DCL 语句主要是DBA 用来管理系统中的对象权限时所使用,一般的开发人员很少使用。下面通过一个例子来简单说明一下。创建一个数据库用户zhangsan,具有对tc38数据库中所有表的SELECT 权限:
mysql> create user ‘zhangsan’@’%’ identified by ‘123456’; 创建用户
Query OK, 0 rows affected (0.01 sec)
mysql> grant select,insert on 数据库名.表名 to ‘zhangsan’@’%’ with grant option; 用户授权
grant select,insert on tc38.* to ‘zhangsan’@’%’ with grant option;
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges; 刷新权限
Query OK, 0 rows affected (0.01 sec)
mysql> quit
Bye
— 此时zhangsan账号只能具备对数据库tc38的查询和添加权限,其他权限都是没有的
权限:SELECT, INSERT, UPDATE, DELETE, CAREATE, DROP,ALL PRIVILEGES 权限。
注意:此处的”localhost”,是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将”localhost”改为”%”,表示在任何一台电脑上都可以登录,也可以指定某台机器可以远程登录。
mysql> show GRANTS for ‘zhangsan’@’%’;
+————————————————————————————————-+
| Grants for zhangsan@% |
+————————————————————————————————-+
| GRANT SELECT, INSERT ON . TO zhangsan
@%
WITH GRANT OPTION |
+————————————————————————————————-+
1 row in set (0.00 sec)
mysql> REVOKE insert ON . FROM ‘zhangsan’@’%’;
Query OK, 0 rows affected (0.00 sec)
5.2 DDL
DDL:(Data Definition Language)数据定义语言
原子DDL语句将数据字典更新、存储引擎操作和与DDL操作相关联的二进制日志写入合并到单个原子操作中。该操作要么提交,对数据字典、存储引擎和二进制日志保留适用的更改,要么回滚。
在MySQL8.0中,原子DDL操作这一特性,支持表相关操作,例如create table、drop table等,也支持非表相关操作,例如create routine、drop trigger等。
支持的表操作包含:drop、create、alter(操作对象是databases, tablespaces, tables, and indexes)语法、truncate语法
支持的非表操作包含:create、drop、alter(操作对象是trigger、event、views、index)
数据库创建/删除
create database 数据库名;
drop database 数据库名;
表创建/删除
create table if not exists 表名();
drop table 表名; //如果表不存在会报错
drop table if exists 表名;//表存在才删除,不存在什么都不做。
修改表结构
数据表在创建表之前就应该确认好表结构,一旦创建完成,最好不要修改表结构。实际开发中修改表结构会引发大麻烦
添加字段
alter table 表名 add 字段名 数据类型 约束;
eg :
alter table t_emp add mobile char(11); — 从表后面添加一列属性
alter table t_emp add test char(11) first; — 从表头部添加一列属性
alter table t_emp add mobile char(11) after salary; — 在指定的列后插入新列
修改字段数据类型
alter table 表名 modify 字段名 数据类型;
eg : alter table t_emp modify gender enum(‘男’,’女’);
用途 : 专门用来修改指定列的数据类型的
修改字段名
alter table 表名 change 字段名 新字段名 数据类型;
eg : alter table t_emp change gender sex char(1);
比较 :modify常用于修改字段类型,change常用于修改字段名或类型
删除字段
alter table 表名 drop 字段名;
eg : alter table t_emp drop mobile;
修改表名
alter table 表名 rename to 新表名;
eg : alter table emp rename my_emp;
插入字段
alter table 表名 add 新字段名 数据类型 after 字段名;
eg : alter table emp add birth date after ename;
添加约束
DROP TABLE IF EXISTS t_emp;
CREATE TABLE IF NOT EXISTS t_emp(
id int(8),
tno char(10) COMMENT ‘工号’,
name varchar(30) COMMENT ‘姓名’,
gender char(1) DEFAULT ‘男’ COMMENT ‘性别’,
birthday date COMMENT ‘生日’,
salary decimal(8,2) COMMENT ‘薪资’,
dept_id int(8) COMMENT ‘部门编号’
);
— 1. 添加主键
alter table t_emp add CONSTRAINT emp_id_pk PRIMARY KEY(id);
— 2. 添加自动递增的策略
alter table t_emp modify id int(8) not null auto_increment;
— 3. 添加唯一约束
alter table t_emp add CONSTRAINT emp_tno_uk UNIQUE(tno);
— 4. 添加非空约束(只能作用在列级别, 就是修改列的类型)
alter table t_emp modify tno varchar(30) not null;
— 5. 添加检查约束
alter table t_emp add CONSTRAINT emp_gender_ck CHECK(gender=’男’ || gender=’女’)
— 6. 添加外键约束
alter table t_emp add CONSTRAINT emp_dept_id_fk foreign key(dept_id) references dept(id);
扩展 :
— 删除非空约束(修改)
alter table t_emp modify tno char(10) null;
— 删除唯一约束(特殊写法)
alter table t_emp drop index emp_tno_uk; — 需要根据约束名来删除
— 删除主键
alter table t_emp modify id int(8) not null;
alter table t_emp drop PRIMARY KEY;
5.3 DML
DML:(Data Manipulation Language)数据操纵语言
- 插入 : insert
- 修改 : update
- 删除 : delete
5.3.1 插入数据
插入单条数据
insert into 表名(字段1,字段2,字段3…) values(值1,值2,值3…);
举例 :【推荐】
INSERT INTO t_emp(id,tno,name,gender,birthday,salary,dept_id)
VALUE(1,’WNSH001’,’jack’,’男’,’1998-09-09’,’5000’,null);
语法的简化 : 默认会根据创建表时列的顺序来插入数据【不推荐】
INSERT INTO t_emp VALUE(1,’WNSH001’,’jack’,’男’,’1998-09-09’,’5000’,null);
插入多条数据
insert into 表名(字段1,字段2,字段3…) values(值1,值2,值3…),(值1,值2,值3…),()…;
举例 : 【掌握】
INSERT INTO t_emp(tno,name,gender,birthday,salary,dept_id)
VALUES(‘WNSH001’,’jack’,’男’,’1998-09-09’,’5000’,null),
(‘WNSH002’,’tom’,’男’,’1998-09-09’,’5000’,null),
(‘WNSH003’,’lili’,’男’,’1998-09-09’,’5000’,null),
(‘WNSH004’,’lucy’,’男’,’1998-09-09’,’5000’,null);
注意事项:
- 字段名和值要一一对应。
- 只写表名表示添加所有字段的数据,顺序要保持和建表时字段顺序一致。【不推荐】
- 数量和数据类型要对应。
- insert语句一旦执行成功,必然会多一条记录,未指定值的字段默认为NULL。
将查询结果插入到表中
insert into 表1 select 字段 from 表2;
举例 :
insert into t_stu select tno,name,gender,birthday from t_emp;
insert into t_stu(sno,name,gender,birthday) select tno,name,gender,birthday from t_emp;
快速创建表(复制表结构及数据 : 备份)
create table 新表 as select from 原表;
举例 :
mysql> create table t_stu as SELECT tno,name,gender,birthday FROM t_emp;
mysql> select from t_stu;
+————-+———+————+——————+
| tno | name | gender | birthday |
+————-+———+————+——————+
| WNSH001 | jack | 男 | 1998-09-09 |
| WNSH002 | tom | 男 | 1998-09-09 |
+————-+———+————+——————+
— 补充 : 查看创表语句
mysql> show create table t_stu \G;
* 1. row *
Table: t_stu
Create Table: CREATE TABLE t_stu
(
tno
char(10) DEFAULT NULL,
name
varchar(30) DEFAULT NULL COMMENT ‘姓名’,
gender
char(1) DEFAULT ‘男’ COMMENT ‘性别’,
birthday
date DEFAULT NULL COMMENT ‘生日’
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
5.3.2 更新数据
update 表名 set 字段1=值1,字段2=值2,… where 条件;
举例 :
不推荐
update t_stu set name=’张三’; — 更新整列数据
update t_emp set gender=’女’,birthday=’1999-09-09’; — 更新整列数据
带条件来更新
update t_emp set gender=’男’,birthday=now() where id=5;
update t_emp set gender=’男’,birthday=now() where id=7 or id=8;
注意:没有条件限制会导致所有数据全部更新。
5.3.3 删除数据
delete from 表名 where 条件;
语法1 : delete from 表名; — 清空表中的所有记录,表还在
drop table 表名; — 直接从数据库删除表
删除后继续插入数据,则主键的策略还是接着删除前的策略继续递增
此时的删除是一行一行的删除 (删除整张表): 效率相对较低
语法2 :delete from 表名 where 条件; — 一般都会使用主键来删除
mysql> delete from t_emp where id=9;
Query OK, 1 row affected (0.07 sec) 删除成功后会返回受影响的行数
注意:
- 没有条件限制,整张表数据会全部删除!表依旧存在。
- 使用 delete 删除表数据,数据在硬盘上的真实存储空间不会被释放。
- 缺点:删除效率较低。
-
5.3.4 truncate
drop table 表名; — 删除表
truncate table 表名; — 删除表中的所有数据,每次都会新建一张全新的表
注意: 不能删除单条数据。
- 物理删除,表被一次截断。效率较高,但是不支持回滚。
-
6. 客户端
命令行模式(必须掌握)
- Navicat 可视化MySQL客户端
- SQLyog
6.1 Navicat
下载 : https://www.navicat.com.cn/download/navicat-for-mysql
安装
破解 (仅仅用于教学,不用与商业用途)
使用