MYSQL 基础(一)

MYSQL介绍

MySQL 是一种关系型数据库,主要用于持久化存储我们的系统中的一些数据比如用户信息。

由于 MySQL 是开源免费并且比较成熟的数据库,因此,MySQL 被大量使用在各种系统中。任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL 的默认端口号是3306。

概述

  • MySQL是一个开放源代码的关系型数据库管理系统,由瑞典MySQL AB(创始人Michael Widenius)公司1995年开发,迅速成为开源数据库的 No.1。

  • 2008被Sun收购(10亿美金),2009年Sun被Oracle收购。MariaDB应运而生。(MySQL 的创造者担心 MySQL 有闭源的风险,因此创建了 MySQL 的分支项目 MariaDB)

  • MySQL6.x 版本之后分为社区版商业版

  • MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • MySQL是开源的,所以你不需要支付额外的费用。

  • MySQL是可以定制的,采用了GPL(GNU General Public License)协议,你可以修改源码来开发自己的MySQL系统。

  • MySQL支持大型的数据库。可以处理拥有上千万条记录的大型数据库。

  • MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB

  • MySQL使用标准的SQL数据语言形式。

  • MySQL可以允许运行于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP和Ruby等。

 

RDBMS 与 非RDBMS

关系型数据库(RDBMS)

 实质

  • 这种类型的数据库是最古老的数据库类型,关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。

  • 关系型数据库以行(row)列(column)的形式存储数据,以便于用户理解。这一系列的行和列被称为表(table),一组表组成了一个库(database)。

  • 表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。关系型数据库,就是建立在关系模型基础上的数据库。

  • SQL 就是关系型数据库的查询语言。 

      

 优势

  • 复杂查询 可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。

  • 事务支持 使得对于安全性能很高的数据访问要求得以实现。

 

非关系型数据库(非RDBMS)

 介绍

非关系型数据库,可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,不需要经过SQL层的解析,性能非常高。同时,通过减少不常用的功能,进一步提高性能。

目前基本上大部分主流的非关系型数据库都是免费的。

4.2.2 有哪些非关系型数据库

相比于 SQL,NoSQL 泛指非关系型数据库,包括了榜单上的键值型数据库、文档型数据库、搜索引擎和列存储等,除此以外还包括图形数据库。也只有用 NoSQL 一词才能将这些技术囊括进来。

键值型数据库

键值型数据库通过 Key-Value 键值的方式来存储数据,其中 Key 和 Value 可以是简单的对象,也可以是复杂的对象。Key 作为唯一的标识符,优点是查找速度快,在这方面明显优于关系型数据库,缺点是无法像关系型数据库一样使用条件过滤(比如 WHERE),如果你不知道去哪里找数据,就要遍历所有的键,这就会消耗大量的计算。

键值型数据库典型的使用场景是作为内存缓存Redis是最流行的键值型数据库。

文档型数据库

此类数据库可存放并获取文档,可以是XML、JSON等格式。在数据库中文档作为处理信息的基本单位,一个文档就相当于一条记录。文档数据库所存放的文档,就相当于键值数据库所存放的“值”。MongoDB 是最流行的文档型数据库。此外,还有CouchDB等。

搜索引擎数据库

虽然关系型数据库采用了索引提升检索效率,但是针对全文索引效率却较低。搜索引擎数据库是应用在搜索引擎领域的数据存储形式,由于搜索引擎会爬取大量的数据,并以特定的格式进行存储,这样在检索的时候才能保证性能最优。核心原理是“倒排索引”。

典型产品:Solr、Elasticsearch、Splunk 等。

列式数据库

列式数据库是相对于行式存储的数据库,Oracle、MySQL、SQL Server 等数据库都是采用的行式存储(Row-based),而列式数据库是将数据按照列存储到数据库中,这样做的好处是可以大量降低系统的 I/O,适合于分布式文件系统,不足在于功能相对有限。典型产品:HBase等。

 

 

 

图形数据库

图形数据库,利用了图这种数据结构存储了实体(对象)之间的关系。图形数据库最典型的例子就是社交网络中人与人的关系,数据模型主要是以节点和边(关系)来实现,特点在于能高效地解决复杂的关系问题。

图形数据库顾名思义,就是一种存储图形关系的数据库。它利用了图这种数据结构存储了实体(对象)之间的关系。关系型数据用于存储明确关系的数据,但对于复杂关系的数据存储却有些力不从心。如社交网络中人物之间的关系,如果用关系型数据库则非常复杂,用图形数据库将非常简单。典型产品:Neo4J、InfoGrid等。

 NoSQL的演变

由于 SQL 一直称霸 DBMS,因此许多人在思考是否有一种数据库技术能远离 SQL,于是 NoSQL 诞生了,但是随着发展却发现越来越离不开 SQL。到目前为止 NoSQL 阵营中的 DBMS 都会有实现类似 SQL 的功能。下面是“NoSQL”这个名词在不同时期的诠释,从这些释义的变化中可以看出 NoSQL 功能的演变

1970:NoSQL = We have no SQL

1980:NoSQL = Know SQL

2000:NoSQL = No SQL!

2005:NoSQL = Not only SQL

2013:NoSQL = No, SQL!

NoSQL 对 SQL 做出了很好的补充,比如实际开发中,有很多业务需求,其实并不需要完整的关系型数据库功能,非关系型数据库的功能就足够使用了。这种情况下,使用性能更高成本更低的非关系型数据库当然是更明智的选择。比如:日志收集、排行榜、定时器等。

关系型数据库设计规则

  • 关系型数据库的典型数据结构就是数据表,这些数据表的组成都是结构化的(Structured)。

  • 将数据放到表中,表再放到库中。

  • 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。

  • 表具有一些特性,这些特性定义了数据在表中如何存储,类似Java和Python中 “类”的设计。

表、记录、字段

  • E-R(entity-relationship,实体-联系)模型中有三个主要概念是:实体集属性联系集

  • 一个实体集(class)对应于数据库中的一个表(table),一个实体(instance)则对应于数据库表中的一行(row),也称为一条记录(record)。一个属性(attribute)对应于数据库表中的一列(column),也称为一个字段(field)。

 ORM思想 (Object Relational Mapping)体现:
 数据库中的一个表 <---> Java或Python中的一个类
 表中的一条数据 <---> 类中的一个对象(或实体)
 表中的一个列 <----> 类中的一个字段、属性(field)

 表的关联关系

  • 表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。

  • 四种:一对一关联、一对多关联、多对多关联、自我引用

 一对一关联(one-to-one)

  • 在实际的开发中应用不多,因为一对一可以创建成一张表。

  • 举例:设计学生表:学号、姓名、手机号码、班级、系别、身份证号码、家庭住址、籍贯、紧急联系人、...

    • 拆为两个表:两个表的记录是一一对应关系。

    • 基础信息表(常用信息):学号、姓名、手机号码、班级、系别

    • 档案信息表(不常用信息):学号、身份证号码、家庭住址、籍贯、紧急联系人、...

  • 两种建表原则:

    • 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一。

    • 外键是主键:主表的主键和从表的主键,形成主外键关系。

 

 

 

 一对多关系(one-to-many)

  • 常见实例场景:客户表和订单表分类表和商品表部门表和员工表

  • 举例:

    • 员工表:编号、姓名、...、所属部门

    • 部门表:编号、名称、简介

  • 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键

 

 

 

 

 

多对多(many-to-many)

要表示多对多关系,必须创建第三个表,该表通常称为联接表,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。

 

 

  • 举例1:学生-课程

    • 学生信息表:一行代表一个学生的信息(学号、姓名、手机号码、班级、系别...)

    • 课程信息表:一行代表一个课程的信息(课程编号、授课老师、简介...)

    • 选课信息表:一个学生可以选多门课,一门课可以被多个学生选择

       学号     课程编号  
       1       1001
       2       1001
       1       1002
  • 举例2:产品-订单

    “订单”表和“产品”表有一种多对多的关系,这种关系是通过与“订单明细”表建立两个一对多关系来定义的。一个订单可以有多个产品,每个产品可以出现在多个订单中。

    • 产品表:“产品”表中的每条记录表示一个产品。

    • 订单表:“订单”表中的每条记录表示一个订单。

    • 订单明细表:每个产品可以与“订单”表中的多条记录对应,即出现在多个订单中。一个订单可以与“产品”表中的多条记录对应,即包含多个产品。

 

 

 

SQL 分类

SQL语言在功能上主要分为如下3大类:

  • DDL(Data Definition Languages、数据定义语言),这些语句定义了不同的数据库、表、视图、索引等数据库对象,还可以用来创建、删除、修改数据库和数据表的结构。

    • 主要的语句关键字包括CREATEDROPALTER等。

  • DML(Data Manipulation Language、数据操作语言),用于添加、删除、更新和查询数据库记录,并检查数据完整性。

    • 主要的语句关键字包括INSERTDELETEUPDATESELECT等。

    • SELECT是SQL语言的基础,最为重要。

  • DCL(Data Control Language、数据控制语言),用于定义数据库、表、字段、用户的访问权限和安全级别。

    • 主要的语句关键字包括GRANTREVOKECOMMITROLLBACKSAVEPOINT等。

  因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)。

  还有单独将COMMITROLLBACK 取出来称为TCL (Transaction Control Language,事务控制语言)。

SQL语言的规则与规范

 基本规则

  • SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进

  • 每条命令以 ; 或 \g 或 \G 结束

  • 关键字不能被缩写也不能分行

  • 关于标点符号

    • 必须保证所有的()、单引号、双引号是成对结束的

    • 必须使用英文状态下的半角输入方式

    • 字符串型和日期时间类型的数据可以使用单引号(' ')表示

    • 列的别名,尽量使用双引号(" "),而且不建议省略as

SQL大小写规范 (建议遵守)

  • MySQL 在 Windows 环境下是大小写不敏感的

  • MySQL 在 Linux 环境下是大小写敏感的

    • 数据库名、表名、表的别名、变量名是严格区分大小写的

    • 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。

  • 推荐采用统一的书写规范:

    • 数据库名、表名、表别名、字段名、字段别名等都小写

    • SQL 关键字、函数名、绑定变量等都大写

基本的SELECT语句

3.0 SELECT...

 SELECT 1; #没有任何子句
 SELECT 9/2; #没有任何子句

 SELECT ... FROM

  • 语法:

 SELECT   标识选择哪些列
 FROM     标识从哪个表中选择
  • 选择全部列:

 SELECT *
 FROM   departments;

 

一般情况下,除非需要使用表中所有的字段数据,最好不要使用通配符‘*’。使用通配符虽然可以节省输入查询语句的时间,但是获取不需要的列数据通常会降低查询和所使用的应用程序的效率。通配符的优势是,当不知道所需要的列的名称时,可以通过它获取它们。

在生产环境下,不推荐你直接使用SELECT *进行查询。

  • 选择特定的列:

 SELECT department_id, location_id
 FROM   departments;

 

在SELECT语句中使用关键字DISTINCT去除重复行

 SELECT DISTINCT department_id
 FROM   employees;

 

 

显示表结构

使用DESCRIBE 或 DESC 命令,表示表结构。

 DESCRIBE employees;
 
 DESC employees;
 

过滤数据

  • 背景:

 

 

  • 语法:

     SELECT 字段1,字段2
     FROM 表名
     WHERE 过滤条件
    • 使用WHERE 子句,将不满足条件的行过滤掉

    • WHERE子句紧随 FROM子句


 

课后练习:

 

# 1.查询员工12个月的工资总和,并起别名为ANNUAL SALARY

 

# 2.查询employees表中去除重复的job_id以后的数据

 

# 3.查询工资大于8000的员工姓名和工资

# 4.查询员工号为106的员工的姓名和部门号

# 5.显示表 depart 的结构,并查询其中的全部数据

 

 

posted @ 2022-01-07 16:22  宗神一  阅读(78)  评论(0编辑  收藏  举报