MySQL数据库 (从入门到精通)

MySQL数据库

大纲:

 1. MySQL数据库安装与配置

 2. MySQL表操作

 3. MySQL基本查询

4. MySQL高级查询

5.  MySQL写入操作

6. MySQL基本函数

7.  MySQL的综合应用

数据库的概念

什么是数据库

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过SQL对数据库中的数据进行增加,修改,删除及查询操作。

什么是关系型数据库

数据库中的记录是有行有列的数据库就是关系型数据库,与之相反的就是NoSQL数据库了。

什么数据库和表

数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用 于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据 库管理系统访问数据库中表内的数据。

常见的数据库管理系统

MySQL :开源免费的数据库,小型的数据库 已经被Oracle收购了。

MySQL5.5版本之后都是由 Oracle发布的版本。

Oracle :收费的大型数据库,Oracle公司的产品。Oracle收购SUN公司,收购MySQL。

DB2 :IBM公司的数据库产品,收费的。常应用在银行系统中。在中国的互联网公司,要求去 IOE(IBM小型机、Oracle数据库、EMC存储设备)

SQLServer:MicroSoft 公司收费的中型的数据库。C#、.net等语言常使用。

SyBase :已经淡出历史舞台。提供了一个非常专业数据建模的工具PowerDesigner。

SQLite : 嵌入式的小型数据库,应用在手机端。

MySQL是什么

MySQL 是最流行的关系型数据库管理系统,在WEB应用方面 MySQL是最好的RDBMS应用软件之一。

MySQL发展历程

MySQL的历史可以追溯到1979年,一个名为Monty Widenius的程序员在为TcX的小公司打工,并且用 BASIC设计了一个报表工具,使其可以在4MHz主频和16KB内存的计算机上运行。当时,这只是一个很底层的 且仅面向报表的存储引擎,名叫Unireg。

1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。Monty直接借助于mSQL的代码,将 它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,决心自己重写一个SQL支持。

1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。到了1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris下的二进制版本。一个月后,Linux版本出现了。在接下来的两年里,MySQL被依次移植到各个平台。

1999~2000,MySQL AB公司在瑞典成立。Monty雇了几个人与Sleepycat合作,开发【Berkeley DB引擎】, 由于BDB支持事务处理,因此MySQL从此开始支持事务处理了。

2000,MySQL不仅公布自己的源代码,并采用GPL(GNU General Public License)许可协议,正 式进入开源世界。同年4月,MySQL对旧的存储引擎ISAM进行了整理,将其命名为MyISAM。

2001年,集成Heikki Tuuri的存储引擎【InnoDB】,这个引擎不仅能【支持事务处理,并且支持行级锁】。后来该引擎被证明是最为成功MySQL事务存储引擎。MySQL与InnoDB的正式结合版本是4.0

2003年12月,【MySQL 5.0】版本发布,提供了视图、存储过程等功能。

2008年1月,MySQL AB公司被Sun公司以10亿美金收购,MySQL数据库进入Sun时代。在Sun时代,Sun公司对其进行了大量的推广、优化、Bug修复等工作。

2008年11月,MySQL 5.1发布,它提供了分区、事件管理,以及基于行的复制和基于磁盘的NDB集群系 统,同时修复了大量的Bug。

2009年4月,Oracle公司以74亿美元收购Sun公司,自此MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。

2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。MySQL 5.5不是时 隔两年后的一次简单的版本更新,而是加强MySQL各个方面在企业级的特性。Oracle公司同时也承诺 MySQL 5.5和未来版本仍是采用GPL授权的开源产品。

什么是SQL

SQL是Structured Query Language的缩写,它的前身是著名的关系数据库原型系统System R所采 用的SEQUEL语言。


作为一种访问关系型数据库的标准语言,SQL自问世以来得到了广泛的应用,不仅是著 名的大型商用数据库产品Oracle、DB2、Sybase、SQL Server支持它,很多开源的数据库产品如PostgreSQL、MySQL也支持它,甚至一些小型的产品如Access也支持SQL。

近些年蓬勃发展的NoSQL系最初是宣称不再需要SQL的,后来也不得不修正为Not Only SQL,来拥抱SQL。 蓝色巨人IBM对关系数据库以及SQL语言的形成和规范化产生了重大的影响,第一个版本的SQL标准SQL86 就是基于System R的手册而来的。Oracle在1979年率先推出了支持SQL的商用产品。随着数据库技术和应 用的发展,为不同RDBMS提供一致的语言成了一种现实需要。

对SQL标准影响最大的机构自然是那些著名的数据库产商,而具体的制订者则是一些非营利机构,例如 【国际标准化组织ISO、美国国家标准委员会ANSI】等。各国通常会按照 ISO标准和ANSI标准(这两个机构 的很多标准是差不多等同的)制定自己的国家标准。中国是ISO标准委员会的成员国,也经常翻译一些国际标准对应的中文版。标准为了避免采用具体产品的术语,往往会抽象出很多名词,从而增加了阅读和理解的难度,翻译成中文之后更容易词不达意。对于数据库系统实现者和用户而言,很多时候还不如直接读英文版本为好。虽然正式的标准不像RFC那样可以从网络上免费获得,标准草案还是比较容易找到的。待批准的标准草案和最终的标准也没有什么实质上的区别,能够满足日常工作的需要。

下面是SQL发展的简要历史:

1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86

1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89

1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)

1999年,ISO/IEC 9075:1999,SQL:1999(SQL3)

2003年,ISO/IEC 9075:2003,SQL:2003

2008年,ISO/IEC 9075:2008,SQL:2008

2011年,ISO/IEC 9075:2011,SQL:2011

如果要了解标准的内容,比较推荐的方法是【泛读SQL92】(因为它涉及了SQL最基础和最核心的一些内容),然后增量式的阅读其他标准。

不只是mysql还有其他数据库,在SQL92或者SQL99这些国际SQL标准基础之上,它们还扩展了自己的一些SQL语句,比如MySQL中的limit关键字

1. MySQL数据库安装与配置

数据库系统:

  • 数据库系统(DBMS) Database Management System 是指一个能为用户提供信息服务的系统。它实现了有组织地、动态地储存大量相关数据的功能,提供了数据处理和信息资源共享的便利手段。

关系型数据库系统:

  • 关系型数据库系统( RDBMS) Relational database management system 是指使用了关系模型的数据库系统。

  • 关系模型中,数据是分类存放的,数据之间可以有联系

第一个关系型数据库

  • 1976年BM的 System R团队在出版的论文中阐述了关系模型,1979年 Oracle公司推出了首个关系型数据库成品。

关系型数据的应用

  • 关系型数据库被应用在非常多的领域,教育系统,商业系统,医疗系统,而且关系型数据库可以有效组织和管理大量复杂的数据,所以关系型数据库才是最重要的数据库产品。

主流的关系型数据库

  • DB2 :商业版,成本高,比如电信,金融领域

  • Oracle:按照CPU数据库收费

  • MySQL:开源免费

  • SQL Server:微软数据库

NOSQL数据库系统

  • NOSQL数据库指的是数据分类存放,但是数据之间没有关联关系的数据库系统

主流的NoSQL数据库

  • Redis 内存保存数据秒杀 ,微博

  • MemCache:相似于Redis,市场份额不是很大

  • MongoDB: 硬盘保存数据,知乎,简书

  • Ne04j:负责的人际关系

1.2 MySQL数据库安装与初始化

MySQL数据库:

  • MySQL是应用最广泛、普及度最高的开源关系型数据库

  • MySQL由瑞典 MySQL AB公司开发,目前属于 Oracle旗下产品

MySQL 大事记

  • 1996 MySQL1.0 诞生

  • 1999 MySQL AB公司成立

  • 2000 MySQLL4.0发布

  • 2003 MySQL5.0发布 MySQL衍生版 - Oracle - MariaDB - Percona

1.3 用户管理

MySQL客户端:Navicat,DBeaver

  •  官网地址 Navicat:https://www.navicat.com.cn

密码忘记重设置root密码

  • 重设root密码(二)

  • 创建一个TXT文件,定义修改密码的SQL语句

    
    ALTER USER 'root'@'localhost' IDENTIFIED BY ′123456′
    注意:本地'@'表示root登录方式,可以本地登录与远程登录。localhost是本地登录,如果加上%,代表可远程登录 
  • 重设root密码(二)

    • 右键,Window PowerShell管理员运行

      • 停止:输入net stop mysql80

      • 启动:mysqld --defaults-file =" "路径"\my.ini" --init -file=“ “TXT文件路径” --console 注意:路径存在空格j记得加引号

      • 关闭:关闭当前服务Ctrl +C

      • 启动:输入 net start mysql80

1.4 MySQL配置文件

MySQL配置文件

在my.ini文件中,我们可以设置各种 MySQL的配置,例如字符集、端口号、目录地址等等[client] #客户端信息配置信息
[mysql] #客户端信息配置信息
[mysqld] #数据库配置信息
 
[client]
port=3306   
        
[mysql]
no-beep

port=3306 #端口号
datadir=C:/ ProgramData/ MySQL/ MySQL Server8.0/Data #数据目录
default authentication_ plugin= caching sha2_ password #密码认证插件
default- storage- engine= INNODB #默认存储引擎
sq1-mode=" STRICT TRANS TABLES, NO ENGINE SUBSTITUTION" #开启严格模式
log- output=FILE #用文件记录日志
genera1-10g=0 #关闭日志输出
genera1_1 og file=" DESKTOP-HB42AU2.1og" #日志文件名称
slow- query-1og=1 #开启慢查询日志
query_1 og file=" DESKTOP-HB42AU2-s1ow.1og" #慢查询日志文件名称
long query time=10 #大于多少秒的执行SQL被记录在慢查询日志
log- error=" DESKTOP-HB42AU2.err” #错误日志名称
server-id=1 #数据库ID
lower case table names=1 #把表名转换成小写
secure-f1le-priv="C:/ ProgramData/MyQL/ lySQL Server8.0/ Uploads" #导入导出数据的目录地址
max connections=151 #最大连接数
table open cache=2000
tmp table size=16M
thread cache size=10#线程数量
myisam max sort file size=100G
myisam sort buffer size=8M
key buffer size=8M
read buffer size=0

2. 数据库表的相关操作

2.1 定义逻辑库,数据表

什么是SQL语言:

  • SQL是用于访问和处理数据的标准的计算机语言

SQL语言分类

  • DML:添加 修改 删除 查询

  • DCL:用户 权限 事务

  • DDL:逻辑库 数据表 视图 索引

SQL语句注意事项

  • SQL语句不区分大小写,但是字符串区分大小写 SELECT “HelloWorld”;

  • SQL语句必须以分号结尾,SQL语句中的空白和换行没有限制,但是不能破坏语法

SQL语句的注释

  • SQL语句的注释有两种,分别如下:

  • #这是一段注释文字

  • /这是另一段注释文字/

创建逻辑库

mysql> CREATE DATABASE 逻辑库名称 #创建逻辑库
mysql> SHOW DATABASES; #展示逻辑库
mysql> DROP DATABSE 逻辑库名称 ;#展示逻辑库

mysql> CREATE DATABASE student #创建逻辑库
mysql> CREATE DATABASE drop #删除逻辑库

创建数据表

 CREATE TABLE数据表 (                        
    列名1 数据类型 [约束][ COMMENT注释],
    列名2 数据类型 [约束][ COMMENT注释],
    ...
 )[ COMMENT=注释];

CREATE TABLE student(
  	id INT UNSIGNED PRIMARY KEY,  #unsigned:无符号
    NAME VARCHAR(20) NOT NULL,
    sex CHAR(1) NOT NULL,
    birthday DATE NOT NULL,
    tel CHAR(11) NOT NULL,
    remark VARCHAR(200)
);

写入数据表

INSERT INTO student VALUES(1,"张三","男","1995-05-13","13383838438",NULL);

数据表的其他

SHOW tables;#查看逻辑表
DESC Student;#查看数据表
SHOW CREATE TABLE student,#查询建表语句
DROP TABLE Student #删除表文件

2.2 定义数据库语言:数据类型

数字类型:

  • tinyint: 小整数

  • smallint 普通整数

  • mediumint:普通整数

  • int 较大整数

  • bigint: 大整数

  • float:单精度浮点数

  • double:双精度浮点数

  • decimal : deciimal(10,2 ) #2.代表精确到后两位。10;整数位加小数位为10个字符

不精确的浮点数

  • 十进制的浮点数无法在计算机中用二进制精确表达

字符串类型:

  • char:固定长度字符串

  • varchar 不固定长度字符串

  • text 不固定长度字符串

日期类型:

  • Date:日期

  • Time:时间

  • Year:年份

  • datetime :日期时间

  • timestamp:时间戳

修改表结构

ALTER TABLE 表名称
ADD 列1 数据类型 [约束] [COMMENT注释],
ADD 列2 数据类型 [约束] [COMMENT注释];

ALTER TABLE student
ADD address VARCHAR(200) NOT NULL,
ADD home tel CHAR(11) NOT NULL;

修改字段类型和约束

ALTER TABLE 表名称
MODIFY 列1 数据类型 [约束] [COMMENT注释],
MODIFY 列2 数据类型 [约束] [COMMENT注释];

ALTER TABLE student
MODIFY home tel VARCHAR(20)NOT NULL;

修改字段名称
 

ALTER TABLE 表名称
CHANGE 列1 新列名1 数据类型 [约束] [COMMENT注释],
CHANGE 列2 新列名2 数据类型 [约束] [COMMENT注释];

ALTER TABLE student
CHANGE address home address VARCHAR(200)NOT NULL;

删除字段 
        

ALTER TABLE 表名称
DROP 列1,
DROP 列2,

ALTER TABLE student
DROP home address,
DROP home tel;

2.3 数据库的范式与字段约束

数据库的范式:

  • 构造数据库必须遵循一定的规则,这种规则就是范式

  • 目前关系数据库有6种范式,一般情况下,只满足第三范式即可

  • 第一范式:原子性

    • 第一范式是数据库的基本要求,不满足这一点就不是关系数据库。数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。

  • 第二范式:唯一性

    • 数据表中的每条记录必须是唯一的。为了实现区分,通常要为表加上一个列用来存储唯一标识,这个唯一属性列被称作主键列

  • 第三范式:关联性

    • 每列都与主键有直接关系,不存在传递依赖。依照第三范式,数据可以拆分保存到不同的数据表,彼此保持关联

字段约束

  • MySQL中的字段约束共有四种

  • 主键约束: primary key 字段值唯一,且可以为NULL

  • 非空约束:not null 字段不能为null

  • 唯一约束 UNIQUE 字段唯一,且可以为null

  • 外键约束 FOREIGN KEY 保持关联数据的逻辑性

主键约束:

  • 主键约束要求字段的值在全表必须唯一,而目不能为NU儿L值

  • 建议主键一定要使用数字类型,因为数字的检索速度会非常快

  • 如果主键是数字类型,还可以设置自动增长
     

    CREATE TABLE t_teacher(
        id INT PRIMARY KEY AUTO INCREMENT,
    );

非空约束

  • 非空约束要求字段的值不能为NULL值

  • NULL值以为没有值,而不是 "” 空字符串
     

    CREATE TABLE t_teacher(
        id INT PRIMARY KEY AUTO_INCREMENT
        name VARCHAR(200) NOT NULL,
        married BooLeaN NOT NULL DEFAULT FALSE
    );
    

唯一约束

  • 唯一约束要求字段值如果不为NULL,那么在全表必须唯一
     

    CREATE TABLE  t_teacher(
        .....
        tel CHAR(11) NOT  NULL UNIQUE
    );
    

创建表

  • 创建数据表 t_teacher
     

    create table t_teacher(
    	id int unsigned primary key auto_increment,
    	name varchar(20) not null,
    	tel char(11) not null unique,
    	married boolean not null default false #默认未婚
    );

外键约束

  • 外键约束用来保证关联数据的逻辑关系

  • 外键约束的定义是写在子表上的
     

    CREATE TABLE t_dept( #父表
        deptno INT UNSIGNED PRIMARY KEY,
        dname VARCHAR(20) NOT NULL UNIQUE,
        tel CHAR(4) UNIQUE
    );
    
    CREATE TABLE t_temp( # 子表
        empno INT UNSIGNED PRIMARY KEY,
        ename VARCHAR(20) NOT NULL,
        sex ENUM("男","女") NOT NULL, #enum枚举,只能选男或者女
        deptno INT UNSIGNED,
        hiredate DATE NOT NULL,
        FOREIGN KEY (deptno) REFERENCES t_dept(deptno)
    );
    关联单词 references

外键约束的闭环问题

  • 如果形成外键闭环,我们将无法删除任何一张表的记录

2.4 索引

数据排序的好处

  • 一旦数据排序之后,查找的速度就会翻倍,现实世界跟程序世界都是如此 如何创建索引
     

    CREATE TABLE表名称(
        ...,
        INDEX[索引名称](字段),
        ...,
    );
    
    CREATE TABLE t message(
        id INT UNSIGNED PRIMARY KEY,
        content VARCHAR(200)NOT NULL,
        type ENUM("公告","通报","个人通知")NOT NULL,
        create_time TIMESTAMP NOT NULL,
        INDEX idx_type (type)   
    );
    

如何添加与删除索引

  • 添加与删除
     

    CREATE INDEX 索引名称 ON 表名(字段);#增加索引
    ALTER TABLE 表名称 ADD INDEX [索引名](字段);#增加索引
    
    SHOW INDEX FROM 表名;#展示索引
    DROP INDEX 索引名称 ON 表名;#删除索引
    
    
    
    DROP INDEX idx_type ON t_message;
    CREATE INDEX idx_type ON t message(type)i
    SHOW INDEX FROM t message;
    ALTER TABLE t message ADD INDEX idx_type(type);

索引的使用原则

  • 数据量很大,而且经常被查询的数据表可以设置索引

  • 索引只添加在经常被用作检索条件的字段上面

  • 不要在大字段上创建索引

3.1 数据库操作语言:普通查询

记录查询

  • 最基本的查询语句是由 SELECT和FROM关键字组成的
     

    SELECT * FROM t_emp; 
    SELECT empno, ename, sal FROM t_emp;
  • SELECT语句屏蔽了物理层的操作,用户不必关心数据的真实存储,交由数据库高效的査找数据 使用列别名

  • 通常情况下, SELECT子句中使用了表达式,那么这列的名字就默认为表达式,因此需要一种对列名重命名的机制
     

    SELECT empno,sal * 12 as "income" FROM t_emp; 
  • 词法分析与优化,读取SQL语句

  • FROM 选择数据来源

  • SELECT 选择输出内容

3.2 数据库操作语言:数据分页

数据分页

  • 如我们查看朋友圈,只会加载少量部分信息,不用一次性加载全部朋友圈,那样只会浪费CPU时间、内存和网络带宽

  • 如果结果集的记录很多,则可以使用limit关键字限定结果集数量
    数据分页的简写用法

    SELECT .... FROM … LIMIT 起始位置,偏移量;
    SELECT empno, ename FROM t_emp LIMIT 0,20;
    

数据分页的简写用法

  • 如果LIMIT子句只有一个参数,它表示的是偏移量,起始值默认为0
    SELECT empno, ename FROM t emp LIMIT 10; 
    SELECT empno, ename FROM t emp LIMIT 0, 10;
  • 查询语句的子句执行顺序

    FROM -> SELECT -> LIMIT

3.3 数据操作语言:排序

结果集排序

  • 如果没有设置,查询语句不会对结果集迸行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用 ORDER BY子句。

  • ​​​​​​​SELECT FROM ORDER BY 列名 [ASC|DESC]
    SELECT ename,sal from t_emp ORDER BY sal

排序关键字

  • 如果排序列是数字类型,数据库就按照数字大小排序,

  • ASC代表升序(默认), DESC代表降序

  • 如果是日期类型就按照日期大小排序

  • 如果是字符串就按照字符集序号排序。
     

    SELECT ename, sal FROM t_emp order BY hiredate desc; 

多个排序字段

  • 我们可以使用 ORDER BY规定首要排序条件和次要排序条件。数据库会先按照首要排序条件排序,如果遇到首要排序內容相同的记录,那么就会启用次要排序条件接着排序
     

    SELECT empno, ename, sal hiredate FROM t emp ORDER BY sal desc,hiredate Asc;

    ​​​​​​​

排序+分页

  • ORDER BY子句书写的时候放在LMIT子句的前面

    FROM - SELECT - ORDER BY - LIMIT

3.4 数据操作语言:去除重复记录

去除重复记录
        如果我们需要去除重复的数据,可以使用 DISTINCT关键字来实现

SELECT DISTINCT 字段 FROM … ;
SELECT DISTINCT job FROM t emp;

注意事项:使用 DISTINCT的 SELECT子句中只能查询一列数据
                        如果查询多列,去除重复记录就会失效。
                        DISTINCT关键字只能在 SELECT 子句中使用一次

3.5 数据操作语言:条件查询

条件查询

  • 很多时候,用户感兴趣的并不是逻辑表里的全部记录,而只是它们当中能够满足某一种或某几种条件的记录。这类条件要用 WHERE子句来实现数据的筛选
     

    SELECT FROM WHERE条件[AND|OR]条件 .....;
    SELECT empno, ename, sal FRom t emp WHERE deptno=10 AND sal >=2000;

  • 算数运算符

    • + 加法

    • - 减法

    • * 乘法

    • / 除法

    • % 求模

  • 比较运算符

    • 包含 IN

    • 为空 IS NULL

    • BETWEEN AND 范围

    • LIKE 模糊查询

    • REGEXP 正则表达式

  • 逻辑运算符

    • AND 与关系

    • OR 或关系

    • NOT 非关系

  • WHERE子句的注意事项

    • WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧
       

      SELECT empno, ename FROM t emp WHERE ename = FORD AND sal >=2000
      SELECT empno, ename FROM t emp Where deptno =10 AND sal >=2000

  • 各种子句的执行顺序
     

    FROM -> WHERE- >seLECT -> ORDER BY ->LIMIT

4. 数据库的高级查询

4.1数据操作语言:聚合函数

什么是聚合函数

  • 聚合函数在数据的查询分析中,应用十分广泛。聚合函数可以对数据求和、求最大值和最小值、求平均值等等。 聚合函数

  • SUM函数

    • SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。

      SELECT SUM(ename) FROM t emp; SELECT SUM(sal) FROM t emp; WHERE deptno In (10, 20);

  • MAX函数

    • MAX函数用于获得非空值的最大值。

      • SELECT MAX (comm) FROM t empi
    • 问题1:查询10和20部门中,月收入最高的员工?

      • SELECT MAX (sal+IFNULL(comm, 0)) FROM t emp WhERE deptno IN(10,20)

        问题2:查询员工名字最长的是几个字符?

        • SELECT MAX (LENGTH (ename)) FROM t emp
  • MIN函数

    • MIN函数用于获得非空值的最小值。

      SELECT MIN (empno) FROM t emp; SELECT MIN (hiredate) FRoM t empi
  • AVG函数

    • AVG函数用于获得非空值的平均值,非数字数据统计结果为0

      SELECT AVG(sal+IFNULL(comm)) FROM t empi
  • COUNT函数

    • COUNT()用于获得包含空值的记录数, COUNT(列名)用于获得包含非空值的记录数。

    • SELECT COUNT(*) FROM t emp;
  • COUNT函数

    • 查询10和20部门中,底薪超过2000元并且工龄超过15年的员工人数?

      • SELECT COUNT(*)FROM t emp WhERE deptno IN (10, 20) AND sal>=2000 AND DATEDIFF(NOW(hiredate)/365>=15
    • 查询1985年以后入职的员工,底薪超过公司平均底薪的员工数量?

      • SELECT COUNT (* FROM t emp WHERE hiredate>=1985-01-01 AND Sal>AVG(sal)

4.2数据操作语言:分组查询

为什么要分组?

  • 默认情况下汇总函数是对全表范围内的数据做统计

  • GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理

    • SELECT deptno, AVG(sal) FROM t_emp GROUP BY deptno 逐级分组

      • 数据库支持多列分组条件,执行的时候逐级分组。

      • 查询每个部门里,每种职位的人员数量和平均底薪

      • SELECT deptno, job, COUNT(*), AVG(sal) FROM t emp GroUP BY deptno, job ORDER BY deptno 对 SELECT子句的要求

  • 查询语句中如果含有 GROUP BY子句,那么 SELECT-子句中的内容就必须要遵守规定: SELECT子句中可以包括聚合函数,或者 GROUP BY子句的分组列,其余内容均不可以出现在 SELECT子句中

    • SELECT deptno, CoUNT(*), AVG(sal) FROM t emp GroUP BY deptno;

    • selECt deptno, CoUNT(), AVG(sal), sal FROM t emp GroUP BY deptno;

  • 对分组结果集再次做汇总计算 SELECT deptno, CoUNT(*),AVG(sal), MAX (sal), MIN (sal) ROM t emp groUP BY deptno WITH ROLLUP;

  • GROUP CONCAT函数

    • GROUP CONCAT函数可以把分组查询中的某个字段拼接成一个字符串

    • 查询每个部门内底薪超过2000元的人数和员工姓名

      • SELECT deptno, GroUP CONCAT (ename), COUNT(*) FROM t emp WHERE sal>=2000 GROUP BY deptno

  • 各种子句的执行顺序

    • 查询语句中, GROUP BY子句应该第几个执行? FROM - WHERE-> GROUP BY -> SELECT - ORDER BY -> LIMIT

4.3数据操作语言: HAVING子句

  • HAVING子句的特殊用法 按照数字1分组, MySQL会依据 SELECT子句中的列进行分组,HAVING子句也可以正常使用

4.4 表连接查询

从多张表中提取数据

  • 从多张表中提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连接,产生笛卡尔积。

  • 从多张表中提取数据规定了连接条件的表连接语句,就不会出现笛卡尔积 SELECT e empno, e. ename, d dname FROM t emp e join t dept d oN e deptno=d. deptnoi

  • 表连接的分类

    • 内连接: 内连接是结果集中只保留符合连接条件的记录

    • 内连接的简介

      • 内连接是最常见的一种表连接,用于查询多张关系表符合连接条件的记录。

        • SELECT FROM表1 [|NER] JON表2 ON 条件 [NER] JON表3 ON 条件

      • 内连接的多种语法形式

        • SELECT ...FROM 表1 J0IN 表2 0N 连接条件 SELECT ...FROM 表1 J0IN 表2 WHERE 连接条件; SELECT…FROM表1,表2 WHERE连接条件

    • 外连接: 外连接是不管符不符合连接条件,记录都要保留在结果集中

      • 外连接简介 外连接与内连接的区别在于,除了符合条件的记录之外,结果集中还会保留不符合条件的记录。

      • 左连接和右连接

        • 左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。如果右表没有符合条件的记录,就用NUL与左表连接。右外连接也是如此。

      • 外连接的注意事项 内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。但是外连接里,条件写在 WHERE子句里,不合符条件的记录是会被过滤掉的,而不是保留下来。

4.5 子查询

子查询简介 - 子查询是一种査询中嵌套查询的语句 - 查询底薪超过公司平均底薪的员工的信息 子查询的分类 - 子查询可以写在三个地方: WHERE子句、FROM子句、 SELECT子句,但是只有FROM子句子查询是最可取的 WHERE子查询 - 这种子查询最简单,最容易理解,但是却是效率很低的子查询 - 查询底薪超过公司平均底薪的员工的信息 FROM子查询 - 这种子查询只会执行一次,所以查询效率很高 SELECT-子查询 - 这种子查询每输出一条记录的时候都要执行一次,查询效率很低

单行子查询和多行子查询

  • 单行子查询的结果集只有一条记录,多行子查询结果集有多行记录

  • 多行子查询只能出现在 WHERE子句和FROM子句中

  • WHERE子句中的多行子查询

    • WHERE子句中,可以使用N、ALL、ANY、 EXISTS关键字来处理多行表达式结果集的条件判断

  • EXISTS关键字

    • EXISTS关键字是把原来在子查询之外的条件判断,写到了子查询的里面。

    • SELECT……FROM表名 WHERE[NOT] EXISTS(子查询)

5. MySQL对数据的基本操作

5.1数据操作语言: INSERT语句

  • INSERT语句可以向数据表写入记录,可以是一条记录,也可以是多条记录

    • INSERT INTO 表名(字段1,字段2,…) VALUES(值1,值2,) INSERT INTO 表名(字段1,字段2,… VALUES(值1,值2,……),(值1,值2,…)

  • INSERT语句方言

    • MYSQL的 NSERT语句还有一种方言语法

    • INSERT INTO表名SET字段1=值1,字段2=值2,……

  • IGNORE关键字

    • IGNORE关键字会让 INSERT只插入数据库不存在的记录 INSERT [IGNORE] INTO表名

5.2 数据操作语言: UPDATE语句

  • UPDATE语句

    • UPDATE语句用于修改表的记录

    • UPDATE[ GNORE]表名 SET字段1=值1,字段2=值2, [WHERE条件1…] [ ORDER BY…] [LIMIT …….] 练习题

      • 把每个员工的编号和上司的编号+1,用 ORDER BY子句完成

      • 把月收入前三名的员工底薪减100元,用LMT子句完成

      • 把10部门中,工龄超过20年的员工,底薪增加200元

      • 把ALEN调往 RESEARCH部门,职务调整为 ANALYST

  • UPDATE语句的表连接

    • 因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造 UPDATE语句

      • UPDATE表10表2 ON条件 SET字段1=值1,字段2=值2,.....,

    • 表连接的 UPDATE语句可以修改多张表的记录

    • UPDATE语句的表连接既可以是内连接,又可以是外连接

      • UPDATE 表1[ LEFT I RIGHT]JOIN 表2 0N条件 SET字段1=值1,字段2=值2,…,

5.5数据操作语言: DELECT 语句

  • DELETE语句

    • DELETE语句用于删除记录,语法如下: DELETE [ GNORE] FROM 表名 [ WHERE 条件1,条件2,…] [ORDER BY ,.....] [LMIT….];

    • 练习:

      • 删除10部门中,工龄超过20年的员工记录 删除20部门中工资最高的员工记录

    • DELETE语句的表连接(一)

      • 因为相关子查询效率非常低,所以我们可以利用表连接的方式来改造 DELETE语句 DELETE表1, FROM 表1 J0IN 表2 ON条件 [ WHERE条件1,条件2.,,,,,,] [ORDER BY......] [LIMIT…]

    • 练习

      • 删除 SALES部门和该部门的全部员工记录

      • 删除每个低于部门平均底薪的员工记录

    • DELETE语句的表连接(二)

      • DELETE语句的表连接既可以是内连接,又可以是外连接 DELETE表1,……FROM表1 LEFT IRGHTJOIN 表2 ON条件

    • 快速删除数据表全部记录

      • DELETE语句是在事务机制下删除记录,删除记录之前,先把将要删除的记录保存到日志文件里,然后再删除记录

      • TRUNCATE语句在事务机制之外删除记录,速度远超过 DELETE语句 TRUNCATE TABLE表名

6. MySQL基本函数的使用

6.1 MySQL的函数

函数的定义:像编程语言利用函数封装业务功能一样,数据库也把一些复杂的功能封装到函数里,供使用者调用

  • 函数的分类

    • 数字函数

    • 字符函数

    • 日期函数

    • 条件函数

6.2 数字函数

  • ABS 绝对值

  • ROUND 四舍五入

  • POWER 幂函数

  • LOG 对数函数

  • LN 对数函数

6.3 日期函数

  • 获取系统时间函数

    • NOW() 函数能获得系统日期和时间,格式yy-MM-dh:mm:ss

    • CURDATE() 函数能获得当前系统日期,格式yy-MM-dd

    • CURTIME() 函数能获得当前系统时间,格式hh:mm:Ss

    • DATE FORMAT() 函数用于格式化曰期,返回用户想要的日期格式 DATE FORMAT(日期,表达式) SELECT ename, DATE FORMAT(hiredater,“%Y”)FROM t emp 练习

      • 利用日期函数,查询明年你的生日是星期几?

      • 利用日期函数,查询1981年上半年入职的员工有多少人?

  • 日期计算的注意事项

    • MySQL数据库里面,两个日期不能直接加減,日期也不能与数字加减

  • 日期偏移计算

    • DATE ADD0函数可以实现日期的偏移计算,而且时间单位很灵活 DATE ADD(日期, NTERVAL偏移量时间单位)

  • 计算日期之间相隔的天数

    • DATEDIFFOI函数用来计算两个日期之间相差的天数 DATEDIFF(日期,日期)

6.4字符函数

字符函数

  • LOWER 转换小写字符

  • UPPER 转换大写字符

  • LENGTH 字符数量

  • CONCAT 连接字符串

  • INSTR 字符出现的位置

  • INSERT 插入/替换字符

  • SUBSTR截取字符串

  • SUBSTRING截取字符串

  • TRIM 去除首尾

6.5条件函数

  • SQL语句中可以利用条件函数来实现编程语言里的条件判断

    • IFNUL(表达式,值)

      • IF(表达式,值1,值2) 练习

    • 中秋节公司发放礼品, SALES部门发放礼品A,其余部门发放礼品B,打印每名员工获得的礼品。

    • 条件语句

      • 复杂的条件判断可以用条件语句来实现,比F语句功能更强大 CASE WHEN 表达式 THEN 值1 WHEN 表达式 THEN 值2 ELSE 值 N END

  • 练习

    • 公司年庆决定组织员工集体旅游,每个部门旅游目的地是不同的。 SALES部门去P1地点, ACCOUNTING部门去P2地点, RESEARCH部门去P3地点,查询每名员工的旅行地点。

7. MySQL的综合应用

7.1事务机制

避免写入直接操作数据文件

  • 如果数据的写入直接操作数据文件是非常危险的事情

  • 利用日志来实现间接写入

  • MySQL总共有5种日志,其中只有redo日志和undo日志与事务有关

  • 事务机制( Transaction) RDBMS=SQL语句+事务(ACID) 事务是一个或者多个SQL语句组成的整体,要么全部执行成功,要么全都执行失败

  • 事务执行流程

    • 开启事物 UPDATE语句 DELETE语句 提交事物

  • 管理事务

    • 默认情况下, MySQL执行每条SQL语句都会自动开启和提交事务

    • 为了让多条SQL语句纳入到一个事务之下,可以手动管理事务

    • START TRANSACTION

    • SQL语句I COMMIT I ROLLBACK I

  • 事务的ACD属性

    • 原子性:一个事务中的所有操作要么全部完成,要么全部失败。事务执行后不允许停留在中间某个状态

    • 一致性:事务的一致性。不管在任何给定的时间、并发事务有多少,事务必须保证运行结果的一致性

    • 隔离性:隔离性要求事务不受其他并发事务的影响,如同在给定的时间內该事务是数据库唯一运行的事物,默认情况下A事务,只能看到日志中该事务的相关数据

    • 持久性:事务一旦提交,结果便是永久性的。即便发生宕机,仍然可以依靠事务日志完成数据的持久化

  • 事务的四个隔离级别

    • read uncommitted 读取未提交数据

    • read committed 读取已提交数据

    • repeatable read 重复读取

    • serializable序列化

  • 修改事务隔离级别

    • READ UNCOMMITTED代表可以读取其他事务未提交的数据

      • SET SESSION TRANSACTON工 SOLATION LEVEL READ UNCOMMITTED

    • READ COMMITTED代表只能读取其他事务提交的数据

      • SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

    • READ COMMITTED代表只能读取其他事务提交的数据

      • SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

    • 事务的序列化

      • 由于事务并发执行所带来的各种问题,前三种隔离级别只适用在某些业务场景中,但是序列化的隔离性,让事务逐一执行,就不会产生上述问题

        • SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

7.2 数据导入与导出

  • 数据导出与备份的区别

    数据导出,导出的纯粹是业务数据
    数据备份,备份的是数据文件、日志文件、索引文件等等
  • 数据导出的分类

    SQL文档
    文本文档
  • 导入SQL文件

    mysqldump用来把业务数据导出成SQL文件,其中也包括了表结构
    • ​​​​​​​mysqldump -uroot-p[ no-data] 逻辑库> 路径

你可能感兴趣的:(数据库,mysql,java)