快速上手MySQL(两万字梳理~)

本文是作者首次完整撰写的关于MySQL数据库的学习心得,涵盖了数据库基础、MySQL的下载安装、编码和存储引擎、数据表操作、字段约束、数据管理、查询语言等方面,深入浅出地介绍了MySQL的核心概念和操作。
摘要由CSDN通过智能技术生成

作为大二的一枚学生党,这是我第一次这么认真完整的写完一篇博客,这是一个学习的过程,也是巩固的过程,写完这篇博客,我收获了很多,整个思维体系更加立体了,我想这可能会是一个好习惯。

MySQL的学习

一.前言

随着互联网的发展,我们进入了新时代,各行各业都离不开计算机,而其中有一门程序员的必修课,那就是我们亲爱的数据库。 计算机越来越卷,而我本人就是属于被别人卷死的那种,小菜鸡一枚。那我们废话少说,进入学习状态,开干。

二、数据库

1.什么是数据库:

数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
它可以想成是一张超级大的仓库,仓库中有各种表,各种表中有各种各样的数据。

2、MySQL的优势:

  1. 成本低:开发源代码,任何人都可以修改MySQL数据库的缺陷。
  2. 性能优良:执行速度快功能强大。
  3. 值得信赖,操作简单。
  4. 兼容性好,可以跨越多个平台。
  5. 当然最主要的还是好用又实惠啊,可以白嫖,哈哈。

二.常识和学前准备

1.MySQL语言分类(了解即可)

1、DDL:数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP
2、DML:数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE
3、DCL:数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY
4、DQL: 数据查询语言,用来查询数据 常用语句:SELECT。(有返回结果)
极速版:
DDL是建立数据;DML是用来修改数据;
DCL是保证安全;DQL是查询数据

2.几个名词之间的区分(容易搞混)

Database    数据库(DB):按照一定结构组织并长期存储在计算机内部,可共享的大量数据的集合。
DBMS        数据库管理系统:安装操作系统之上,管理控制数据库各种数据库对象的系统软件。
DBS         数据库系统:由数据库,数据库管理系统,应用系统,数据库管理员和用户构成。
DBA         数据库管理员:全面2负责管理和控制数据库系统的一个人或一组人。

3.MySQL的下载安装和使用工具

第一步:下载安装

首先你肯定要下载下来吧,小伙先去官网下载下来吧,选择合适的系统安装就好了。
MySQL下载的官网点击进去后,基本一路next,修改一下保存的地址就可以了,切记不要忘了自己设置的密码。
其中:

  • 默认的端口号为:3306;
  • 用户名为:root;
  • 密码自己设置,不要忘记了,以后还要用。
第二步:使用工具的连接
  1. 下载MySQL的图形化管理工具:SQLyog或者Navicat。
  2. 下载完成后点击与MySQL的连接。
  3. 输入名称(随便起),和自己之前设置 的密码,连接完成。
  4. 建立数据库开始我们的学习了,有个建立查询,我们所有操作都在那边完成。

三.MySQL的编码和储存引擎

1.编码

输入以下语句,可以查看MySQL所支持的所有编码:

	show variables like "char%";

结果如下:这是数据库的支持编码

2.常用字符集:

查看所有可以字符集的操作:

SHOW  CHARACTER SET

而MySQL默认使用的字符集是latin1,是单字节编码,而汉字是双字节编码,所以在编译时会出现乱码,这时候就要搬出我们常用的utf-8了。

常用的utf-8字符集:
utf8_general_ci:一般不区分大小写
utf8_general_cs:一般区分大小写
utf8_bin:字符串用二进制数据编译储存,区分大小写,可以存二进制的内容。
-utf8_general_ci:准确性较差,但是速度快。
uyf8_unicode_ci:准确度高,但速度缓慢。

3.储存引擎

1.概念:如何储存数据,如何为存储的数据建立索引和如何更新,查询数据的机制。
2.查看当前MySQL数据库支持的储存引擎

SHOW ENGINES

3.常用储存引擎ENGINE

事务型数据库首选——INNODB引擎
最常用的储存引擎——MYISAM引擎
将数据储存在内存中——MEMOBY引擎

四.数据库的基本操作

1.创建数据库
CREATE DATABASE库名;
例如:创建一个名为Student的数据库

CREATE DATABASE Student;

2.创建前一般,判断是否存在(这是一个好习惯)
CREATE DATABASE IF NOT EXISTS 库名

CREATE DATABASE IF NOT EXISTS Student;

3.选择使用数据库
USE 库名;

USE  Student;

4.删除数据库
DROP DATABASE 库名

DROP DATABASE Student;

5.修改默认编码

ALTER DATABASE 库名 CHARACTER SET 编码

6.设置默认编码

DEFAULT CHARACTER SET 编码

7.查看数据库(会返回数据库中已有表单)

SHOW DATABASES

注意:我们执行查询语句时,是一句一句执行,而不是像写代码,整个代码跑,而是一一对应。

五.常用名词和数据类型

1.常用名词:

DESC 查看表的结构
Table 表
Schema 模式
Column 列
Row 行
Primary Key 主键
FOREIGN KEY 外键
DISTINCT 不同的
ENGINE 引擎
DEFAULT 默认值
REFERENCES 参照
CONSTRAINT 限制,约束
ALTER 改变
DELETE 删除
DROP 移除
SELECT 选择
GROUP BY 分组
WHERE 表达式
HAVING 表达式(与分组搭配使用)
ORDER BY 排序

2.数据类型

在建表之前先别着急,我们先来了解一下MySQL的数据类型,和所有语言一样,有它的规定,又有所区分,请耐心看下去:

2.1.整数类型
整数类型字节数无符号取值范围
TINTINT10~255
SMALLINT20~65535
MEDIUMINTINT30~16777215
INT或INTEGER40~42949672955
BIGINT80~18446744073709551615
注:有符号范围:一般为无符号取值范围的一半,对半分哈。
2.2.浮点数和定点数类型
浮点数,定点数类型字节数
FLOAT8
DOUBLE8
DEC(M,D)和DECIMAL(M,D)如果M>D为M+2,否则为D+2

注:取值范围太大,就不一一敲了,有兴趣可以自行查阅。

2.3.日期·类型

MySQL中支持五种日期类型:

时间日期类型字节数格式用途
DATE4YYYYY-MM-DD日期值
TIME8HH:MM:SS时间值
YERA4YYYYY年份值
DARETIME4YYYYY-MM-DD HH:MM:SS混合时间值
TIMESTAMP4YYYYMMDDHHMMSS时间戳
2.4.字符串类型

字符串类型有以下常用类型:

字符串类型大小用途
CHAR0~255B定长字符串
VARCHAR0~255B可变长字符串
TEXT0~65535B长文本数据
BLOB0~65535B二进制形式的长文本数据

其中有个要注意的地方:

  • CHAR(M),M是是固定长度,少于固定长度时,会用空格补充,占用了多余空间,但它存取更快,是属于空间换时间。
  • VARCHAR(M):是可变的,M是最大长度,会自动检索末尾空格,储存的字符串的实际长度,和CHAR想法,时间换空间。
2.5.复合类型
复合类型用途
ENUM只允许从一个集合中取一个值,类似单选框,性别男女二选一
SET可以在集合中选择多个值,类似复选框,兴趣爱好选多个

六.数据表的基本操作

1.什么是表:

ok,接下来我们终于来到了数据表的操作,进入实战:
表格我们都见过:

姓名学号班级性别
小毛111软件2114
小黄121软件2114

其中:

  1. 姓名,学号,班级我们称之为字段
  2. 而字段又有它的定义:字段名,数据类型,默认值,约束。

2.建表(CREATE TABLE)

例如建立一个学生表:

  1. 建表之前判断是否存在是个好习惯。
  2. 表名称不区分大小写,且不能使用关键字。
  3. NOT NULL 说明使用时,不能通过空数据。
  4. 字段与字段之间用,隔开,最后一个不需要。
  5. comment是自己的注释,不参加代码的运行,给程序员看的,知道字段的含义。
    因为输入的姓名会有中文,所以设置字符集为utf8。
学生表如下 :
CREATE TABLE  IF NOT EXISTS student(
sname VARCHAR(10) NOT NULL COMMENT '姓名',
sid   INT(10) NOT NULL COMMENT '学号',
sclass VARCHAR(10) NOT NULL COMMENT '班级',
ssex ENUM('男','女') NOT NULL COMMENT '性别'
)DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

3.查看表的名称与结构

  1. 显示数据库中所有表的名称:
SHOW TABLES

结果如下:

2. 显示表的结构:

DESC student;

利用这个,我们就可以查看刚刚建好的学生表了:

4.修改数据库表的操作(大集合 )

  1. 修改数据表的表名(rename)
ALTER TABLE 旧表名 RENAME 新表名;
ALTER TABLE Student RENAME Student1;
  1. 修改字段的数据类型(modify)
ALTER TABLE 表名 MODIFY 字段名 数据类型 ;
ALTER TABLE student MODIFY sname CHAR(10) ;
  1. 修改字段的名字(change)
    以下只是简单示例:
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 数据类型;
ALTER TABLE student CHANGE ssex sex VARCHAR(2);
  1. 向数据表中添加新的字段(add)
    例如:我们现在向建好的学生表中添加字段——grade,记录成绩。
ALTER TABLE 表名 ADD 字段名 数据类型 [约束]
ALTER TABLE Student ADD grade INT(10) COMMENT '成绩';

添加完之后,可以用DESC student;来查看表的结构,看是否添加成功;

如图,则成功:
在这里插入图片描述

  1. 删除字段(drop)
ALTER TABLE 表名 DROP 字段;
ALTER TABLE Student DROP grade;

删除完之后,可以用DESC student;来查看表的结构,看是否删除成功;

  1. 修改字段的排序(after)
ALTER TABLE 表名 MODIFY 字段名1 数据类型 [FIRST] AFTER 字段名2;
<!-- 其中first是可选参数,可不写,表示把字段1修改为表的第一个字段。>
<!-- 下面把学生表中的sid放在sname前面。>
ALTER TABLE student MODIFY sname AFTER sid ;
  1. 更改表的储存引擎(engine)
    之前简单给大家介绍了几种常用引擎,以及怎么查看MySQL所支持的储存引擎有哪些。
    接下来看看怎么更改表的引擎:
ALTER TABLE 表名 ENGINE=更改后的储存引擎;
ALTER TABLE Student DROP grade;
  1. 复制数据表
    索引:类似于目录,可以快速找到数据,提高效率,要是学过别的语言,相比也有所了解。
    索引有两种结构:B型树索引和哈希索引。(先做简单了解)
  • 第一种:会将表B复制到表A,会将表B中的完整字段结构和索引都复制过去。
CREATE TABLE A LIKE B;    <!--全盘复制>
  • 第二种:会将表B复制到表A,只是将表B中的字段结构复制过去,但不会复制索引,更加灵活,可以指定复制的字段,并且自身表可以根据需要添加字段。
CREATE TABLE A AS SELECT sno,sname FROM B;  
<!-- 其中的SELECT是查询语句,英文是选择,即从B中筛选出所需要的字段>
  1. 删除数据表
DROP TABLE A,B,C;  <!--可以一次清除多个没有关联的数据表>
TURNCATE 表名;     <!--完全清空一个表,速度快>
  1. 删除表的外键约束
ALTER TABLE A DROP  FOREIGN KEY 字段名;

最后一个可能现在看有些不懂,但看完下面的就明白了。

七.字段的约束

常见的七种约束:(建表时候用)
Primary KEY 主键约束
FOREIGN KEY 外键约束
NOT NULL 非空约束
UNIQUE 唯一约束
DEFAULT 默认约束
AUTO_INCREMNT 自增约束 (字段值自加1)
CHECK(条件) 检查约束 (检查字段值有效性)

  1. 主键约束——PRIMARY KRY
  • 很好理解,就是用来确保数据表中记录的唯一性,主键可以是一个字段或者多个字段。
  • 我们一般选择id,学号,工号这些作为主键,示例如下,键表student2:
  • 一个表只能有一个主键约束。
CREATE TABLE  IF NOT EXISTS student2(
sname VARCHAR(10) NOT NULL  COMMENT '姓名',
sid   INT(10) NOT NULL PRIMARY KEY COMMENT '学号',
sclass VARCHAR(10) NOT NULL COMMENT '班级',
ssex ENUM('男','女') NOT NULL COMMENT '性别'
)DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

我们建了表2,只是在学号添加了主键约束,其他都一样,但是添加数据时,学号就不能重复了。
如果要建立复合主键:

PRIMARY KEY(字段1,字段2);
  1. 非空约束——NOT NULL
    如上所示,每个字段在建表时都表明非空,则输入时不能输入空数据。

  2. 唯一约束—— UNIQUE
    唯一约束要求该字段唯一,可以为空值,但只能有一个空。与主键约束不同,一张表可以有多个唯一约束。

  3. 自增约束——AUTO_INCREMENT
    它的使用呢,与主键搭配使用,每增加一条记录,字段默认加1,就不需要手动在插入主键值了。

  4. 检查约束——CHECK
    用来检查输入的数据是否符合它的要求,是检查字段有效性的好方法,例如 :

sage INT CHECK(sqge>15)     
  1. 默认约束——DEFAULT
    这个就相当好理解了,比如性别默认设定为男。
  • ok,说了前六个,我们可以先用 DESC 表名 查看我们所键表的情况吧:
    建表如下,注意约束的使用:
 CREATE TABLE  IF NOT EXISTS student5(
sname VARCHAR(10) NOT NULL  COMMENT '姓名',
sid   INT(10) NOT NULL  PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
sclass VARCHAR(10) NOT NULL COMMENT '班级',
ssex ENUM('男','女') DEFAULT '男' NOT NULL COMMENT '性别'
)DEFAULT CHARSET=utf8 COLLATE=utf8_bin;  

查看结果如下,圈圈所画的(虽然有些丑):
在这里插入图片描述

  1. 外键约束——FOREIGN KEY
把这个放在最后,自然是一个初学时不常用,又有些繁琐的啦,但还是要仔细看:

(1) MySQL数据库外键的创建,需要满足以下四个条件:

  • 创建外键的表和列存在
  • 组成外键的列存在索引
  • 必须指定数据表的引擎为InnoDB
  • 外键字段和关联字段,数据类型必须一致

(2)外键是表中的一个字段,它可以不是本表的主键,但一定是另外一个表的主键。其中关联字段为主键的表为主表,为外键的是从表。从表和主表是参照关系。

第一种:
CREATE TABLE B(
A 数据类型,
FOREIGN KEY (A)REFERENCES2(A) 
)
第二种:
CONSTRAINT 自己起的约束名 FOREIGN KEY(A)REFERENCES2(A)

八.数据基本操作管理

1.插入数据

(1)为表中所有字段添加数据
INSERT INTO 表名 VALUES(值1,值2,值3…);

我们以之前建好的表Student为例:
INSERT INTO student VALUES(小王,12,软件2114,);

(2)为表中指定字段添加数据
INSERT INTO 表名(指定字段1,字段2…) VALUES(值1,值2…);

INSERT INTO student(sname) VALUES(小王);

(3)同时插入多条数据
INSERT INTO 表名(指定字段1,字段2…) VALUES(取值列表1),(取值列表2),……(取值列表n);

INSERT INTO student VALUES
(小二,11,软件2114,),
(小天,14,软件2114,),
(小美,18,软件2114,);

(4)从目标表中插入数据(借东风)
INSERT INTO 表名(列名列表) SELECT (列名列表) FROM 表名2;
//用到了下面的SELECT查询语句。

(5)REPLACE语句:

  • 将一个表中的结果集插入目标表中,如相同,先删后加原则
  • REPLACE [INTO] 表名 VALUES(对应值)

2.WHERE表达式

  • WHERE表达式是一种筛选,比如:老师联系家长 WHERE 你的成绩<60;
    意思就是只有当你不及格的时候,老师才会练习你的家长。
  • 经常用于修改更新数据,还有查询语句之中。

3.数据的修改和删除

  • 修改数据——UPDATE
    将原本的小王改成小鬼为例:
UPDATE  student 
set sname='小鬼' WHERE sname='小王';
  • 数据的删除(慎用,一般要备份)
    1.DELETE TABLE:删除内容,但不删定义不释放空间。
    2.TRUNCATE TABLE:删除内容,释放空间,但不删除定义。
    3.DROP TABLE:删除内容和定义,释放空间。
1. DELETE  FROM 表名 [WHERE表达式]:可以加where表达式
例如:DELETE  FROM Student WHERE sname='小二';
2. TRUNCATE TABLE 表名
3.DROP TABLE 表名

九.查询

先建表:

CREATE TABLE IF NOT EXISTS student1(
sno VARCHAR(12) PRIMARY KEY,
sname VARCHAR(10) NOT NULL,
ssex ENUM('男','女') NOT NULL,
Sbirth DATE NOT NULL,
Sclass VARCHAR(10) NOT NULL,
zno VARCHAR(4) 
) 
INSERT INTO student1 VALUES('1601043220', '罗李强', '男', '1998-02-04', '机制2121', '5603');
INSERT INTO student1 VALUES('1601043219', '鲁彭飞', '男', '1998-01-08', '机制2121', '5603');
INSERT INTO student1 VALUES('1601043218', '刘涛', '女', '1998-06-07', '机制2121', '5603');

INSERT INTO student1 VALUES('1406053308', '夏俊杰', '男', '1996-06-04', '通信2122', '6103');
INSERT INTO student1 VALUES('1406053309', '纪威', '男', '1996-03-08', '通信2122', '6103');
INSERT INTO student1 VALUES('1406053310', '韦超', '男', '1996-05-07', '通信2122', '6103');
INSERT INTO student1 VALUES('1406053311', '韦小宝', '男', '1997-07-07', '通信2122', '6103');
INSERT INTO student1 VALUES('1406053312', '刘琳', '女', '1996-11-08', '通信2122', '6103');

INSERT INTO student1 VALUES('210501100214', '张雨露', '女', '1999-11-16', '软件2126', '6102');
INSERT INTO student1 VALUES('210501100215', '李珂', '男', '2000-04-08', '软件2126', '6102');
INSERT INTO student1 VALUES('210501100216', '张蓓蓓', '女', '2000-08-10', '软件2126', '6102');
INSERT INTO student1 VALUES('210501100217', '王魏', '男', '2000-08-10', '软件2126', '6102');

1.单表查询

1.查询所有字段的信息

  • SELECT * FROM 表名 (其中*是通配符)
  • SELECT 字段1,字段2,……FROM 表名 (字段与字段用,隔开)
SELECT * FROM  student1  ;

结果如下:
请添加图片描述

  1. 查询指定字段
只查询班级
SELECT Sclass FROM  student1  ;

结果如下:
在这里插入图片描述

  1. 避免重复查询——DISTINCT
    我们不难发现,单纯查询班级时会有重复项,所以要去重:
SELECT DISTINCT Sclass FROM  student1  ;

结果如下:
在这里插入图片描述

  1. 为表和字段取别名——AS(也可简写)
    因为字段都是英文名,在查询时可以给它取别名,更加直观。
SELECT sno AS 学号,sname AS 姓名,sclass AS 班级 FROM student1;

结果如下,十分的直观:
在这里插入图片描述

2.条件查询

  • 当然是和WHERE表达式一起用了,它就像一个定位器一样,可以帮助我们实现精准打击。

1. 带关系运算符和逻辑运算符 :

关系运算符:!=,=,>,<.....
逻辑运算符:AND ,OR,NOT,XOR    (与或非,异或)

例如:查找性别为女生,并且出生日期在2000年之前的信息:

SELECT * FROM student1 WHERE ssex='女' AND Sbirth<'2000-00-00';

结果如下:
请添加图片描述

2. 带IN关键字的查询

  • IN代表一个范围,后面跟着一个集合,在这个集合中就拿查询到,前面加NOT表示不在。
  • 当然也可以用OR,但那会比较麻烦。
SELECT * FROM student1 WHERE sclass  IN'通信2122','软件2126';
SELECT * FROM student1 WHERE sclass  NOT IN'通信2122','软件2126';

3. 带BETWEEN AND 关键字的查询:

如下,查询1997到2000年出生的学生信息:

SELECT * FROM student1 WHERE Sbirth BETWEEN '1997-00-00' AND '2000-00-00';

4. 带IS NULL关键字的空值查询:

查询没有分专业的学生,即专业号为空。

SELECT * FROM student1 WHERE zno IS NULL;

5.带LIKE关键字的查询——模糊查询

常用:

符号用途
*表格中所有列
%表示任何字符出现的任意次数(null除外)
_表示任字符出现一次(不多不少)

(1)查询所有姓韦的学生:

SELECT * FROM student1 WHERE sname LIKE '韦%';

请添加图片描述
(2)查询姓韦,两个字的同学:

SELECT * FROM student1 WHERE sname LIKE '韦_';

(3)转义字符——ESCAPE
如果匹配的字符串中就含有%和_,就要用到转义字符。
如我们现在要查询以DB_开头的数据,ESCAPE ‘’,声明了\为转码字符。

SELECT * FROM 表名 WHERE 字段名 LIKE 'DB\_%' ESCAPE '\';

请添加图片描述

6.正则表达式REGEXP(具体模式)

符号用途
.它表示匹配任意一个字符
I
[]里面定义一组字符,匹配到其中之一即可
[0-9],[a-z]集合中的任意数字,任意字母
(0或者1)
*(0或者>1)
+(>=1)
^, [[:<:]文本开始,词的开始
$,[[:>:]]文本结束, 词的结束

注意:LIKE和REGEXP的区别,前者是匹配整个列,而后者是匹配列值的字串。

7.高级查询

  1. 聚合函数
    (1)COUNT用来统计记录的条数
    (2)SUM用来计算字段的值的总和
    (3)AVG用来计算字段平均值
    (4)MAX和MIN,最大值和最小值

  2. 分组查询
    (1)GROUP BY 字段名 [HAVING表达式]
    (2)HAVING表达式用法和WHERE类似:
    不同的是,它用于分组过后数据,必须跟在分组后面。
    而WHERE作用在表或视图上。
SELECT * FROM student2 GROUP BY Sclass;

结果如下,默认显示一个分组的一条记录:
请添加图片描述
查询选修课超过1门的学生信息:

SELECT * FROM sc GROUP BY sno HAVING COUNT(*)>1;

请添加图片描述

  1. 对查询结果进行排序——ORDER BY
    (1)默认为升序——ASC
    (2)降序为——DESC
SELECT * FROM student2 ORDER BY zno;
SELECT * FROM student2 ORDER BY zno DESC;

这里展示降序的,注意观察zno那一栏:
请添加图片描述

  1. 限制查询结果的数目——LIMIT
    默认的偏移量为0,第一行是0。LIMIT 起点,长度。(起点要注意第一行开始)
    查询第3行到第5行的数据:
SELECT * FROM student2 LIMIT 2,3;

查询前四条信息:

SELECT * FROM student2 LIMIT 4;

3.多表查询

同样,先建成绩表,用于和学生表的连接:

CREATE TABLEIF NOT EXISTS sc (
sno VARCHAR ( 12 ) NOT NULL COMMENT'学号',
cno VARCHAR ( 8 ) NOT NULL COMMENT'科目编号',
grade FLOAT ( 4 ) NOT NULL COMMENT'成绩',
PRIMARY KEY ( sno, cno )) 
INSERT INTO sc VALUES('1601043220', '4001', 50);
INSERT INTO sc VALUES('1601043219', '4001', 70);
INSERT INTO sc VALUES('1601043218', '4001', 66);
INSERT INTO sc VALUES('1601043220', '3001', 83);
INSERT INTO sc VALUES('1601043219', '3001', 75);
INSERT INTO sc VALUES('1601043218', '3001', 88);
INSERT INTO sc VALUES('210501100214', '2001', 73);
INSERT INTO sc VALUES('210501100214', '2001', 70);
INSERT INTO sc VALUES('210501100215', '2001', 66);
INSERT INTO sc VALUES('210501100215', '1004', 80);
INSERT INTO sc VALUES('210501100216', '1004', 84);
INSERT INTO sc VALUES('210501100216', '1004', 82);
INSERT INTO sc VALUES('210501100217', '2001', 65);
INSERT INTO sc VALUES('210501100217', '1004', 80);
INSERT INTO sc VALUES('210501100217', '1003', 85);

1. 内连接

  • 等值连接(INNER JOIN):
    用来连接两个表的条件,如果连接条件中的连接运算符是=时,为等值连接,
    用ON关键字。如下,连接学生表和成绩表,通过相同的学号连接:
SELECT * FROM student2 INNER JOIN sc ON student2.sno=sc.sno;

结果如下,很直观:请添加图片描述

  • 自然连接(NATURAL JOIN)——比较常用
    先根据表中相同的字段连接,再去掉重复项,可以理解为在等值连接中去重。
    这里的结果经过去重后和第一个一样:
SELECT * FROM student2 NATURAL  JOIN sc ;

请添加图片描述

  • 不等值连接
    连接条件的运算符不为=,都是度等值连接。
SELECT * FROM student2 INNER JOIN sc ON student2.sno!=sc.sno;

2. 外连接

(1)左外连接——LEFT JOIN
左表按连接条件与右表相连:

SELECT sno,sname,grade FROM student2 LEFT JOIN sc ON student2.sno=sc.sno;

(2)右外连接——RIGHT JOIN
右表按连接条件与左表相连:

SELECT sno,sname,grade FROM student2 RIGHT JOIN sc ON student2.sno=sc.sno;

3. 子查询

(1)带IN的子查询
查询成绩大于70的学生姓名和学号:
因为学生表中没有成绩,要到成绩表中查询,就可以用IN

SELECT sname,sno FROM student2 
WHERE  sno 
IN (SELECT sno FROM sc WHERE grade>70 );

结果如下:
请添加图片描述

(2) 带EXISTS的子查询
内查询不返回查询记录,而是返回一个真假值,查询得到位真,否则为假。

SELECT * FROM1
WHERE  EXISTSSELECT 字段 FROM2  WHERE表达式);

(3)带ANY的子查询
表示满足其中任意一个条件。
(4)带ALL的子查询
表示满足所有条件。

十.视图(VIEW)

1. 视图的概念:

视图是为数据查询提供了一条捷径,是一个虚拟表,不占存储空间,存储的仅仅是一条SELECT语句,行和列数据来自定义视图所引用的表,并且在引用视图时动态生成。

2. 视图的优势

-增强数据的安全性
-提高灵活性,操作变简单
-提高了数据的逻辑独立性

3. 视图的创建和使用:

  1. 创建视图:
-- 其中属性清单可以选填
CREATE VIEW 视图名(属性清单)    
AS SELECT  字段1,字段2…… FROM1,2…… WHERE表达式;
具体如下:
CREATE VIEW stuser ('姓名','学号')
AS SELECT  sname,sno FROM student2;
  1. 视图的使用
    和普通的表的使用一样,只不过它是虚拟表。
SELECT * FROM 视图名 WHERE 表达式;

4. 删除视图

注意:因为视图是虚拟表,只会删除视图的定义,但是不会删除数据本身。

同样,在删除前,先看看是否存在是一个好习惯:
DROP VIEW IF EXISTS 视图名

5. 查看和修改视图定义

  1. 查看视图的定义:
1DESCRIBE  视图名; 或者  DESC 视图名;2SHOW TABLE STATUS LIKE '视图名';3SHOW CREATE VIEW '视图名';

结果如下:我们在此之前建了一个名为stuser的视图
在这里插入图片描述

  1. 修改视图的定义
    含义:是指修改数据库中已经存在表的定义;
    作用:当基本表发生变化时,可以通过修改视图,保存视图和基本表之间的一致性。
1CREATE OR REPLACE VIEW 视图名(属性清单)
AS SELECT 字段1,字段2…… FROM1,2…… WHERE表达式;2ALTER VIEW 视图名(属性清单)
AS SELECT 字段1,字段2…… FROM1,2…… WHERE表达式; 

6. 更新视图的数据

对视图的更新其实就是对表的更新,因为视图是一个虚拟表,没有数据,所以更新时都是转化到基本表来更新。
注意:更新只能在更新权限范围内,超出范围,更新失败。
例如:

CREATE VIEW 视图名(属性清单)
AS SELECT 字段1,字段2…… FROM 表名 WHERE sno='110'; 

说明视图中的id是110,设置了权限范围
UPDATE 表名 SET sno='121',sname='王二';
此更新失败了,其余操作和表类似,只是多了个更新权限范围。

7. 视图小结:

是一个基于基本表所键的虚拟表,用户可以借此从原有表中筛选有用的信息,简化应用,也保证了系统的安全,主要起筛选作用。

十一.存储过程和函数

首先:

在学存储过程和函数前,先知道DELIMITER 命令语句。
因为你的存储语句和函数可能不止一条语句,但在执行时,MySQL默认的是“;”就结束了,这时候就要我们的DELIMITER出马了,可以自行定义结束的符号,一般用:$$和//。

格式使用如下:

DELIMITER $$
创建存储/函数
begin
存储或函数语句
end $$
DELIMITER;

1. 存储过程

1.1 含义

存储过程就是事先经过编译并存储在数据库中的一段 SQL 语句的集合。

1.2 存储过程的创建:

CREATE PROCEDURE 储存过程名称 (参数列表)
begin
SQL处理语句
end $$
DELIMITER;

其中参数列表中又以下几种:
IN是输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出。
(创建存储过程时按照顺序依次对应,也可以不填。)

1.3 使用和删除

call 储存过程名称(参数列表);
DROP PROCEDURE [ IF EXISTS ] 存储过程名称 ;

1.4优点

  • 增加了SQL语言的功能和灵活性,且执行速度较快。
  • 封装,复用,减少了网络流量和交互,提升效率,
  • 可以作为一种安全机制充分利用。
  • 可以接收参数,也可以返回数据, 在存储过程中,可以传递参数,也可以接收返回值;

2.函数

声明变量:

-- DECLARE需要声明变量类型,放在符合语句的前面
DECLARE 变量名 变量类型;
-- SET可以直接声明局部变量,不需要声明类型,可放在任意位置:
SET 变量名='值1';

2.1无参函数

DELIMITER $$
CREATE FUNCTION 函数名 ()
RETURN 返回值;    -- 与存储过程的区别
begin
SQL处理语句
end $$
DELIMITER;

2.2有参函数

DELIMITER $$
CREATE FUNCTION 函数名 (参数列表)
RETURN 返回值;    -- 与存储过程的区别
begin
SQL处理语句
end $$
DELIMITER;

2.3函数的使用

函数名(参数列表);  -- 有参数填参数,没有不填,和存储过程中的call区别开

2.4常用的系统函数

函数名功能介绍
mod(n,m)取模运算,同操作符%
floor(n)向下取整
ceiling(n)向上取整
rand()返回0到1.0的随机浮点数
trim()去除字符串首尾空格部分
concat(s1,s2,……,sn)将字符串s1~sn拼接成新字符串
substr(‘s1’,起始位置,截取长度)截取s1的字串
now()返回当前日期和时间
curdate()返回当前日期
curtime()返回当前时间
password()加密函数,且是一个不可逆的过程

3.存储过程和存储函数的区别

  • 存储过程实现的功能要复杂一点,而函数实现的功能针对性比较强。
  • 存储过程可以返回参数,而函数只能返回值或者表对象。
  • 存储过程可以使用非确定函数,不允许在用户定义函数主体中内置非确定函数。
  • 存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用。

十二.触发器(Trigger)

1.触发器的概念和优点:

它是一种特殊的存储过程,和函数和存储过程不同,不需要手。动启动,它是通过事件被动触发的,当对一个表进行DML操作,插入,删除,修改时,触发该事件。例如:在插入表之前检查数据是否合法,类似于约束但是比约束更加灵活。

优点:(很好用就是了)

1.安全性
2.审计
3.实现复杂的数据完整性规则
4.实现复杂的非标准的数据库相关完整性规则

2. 基本格式:

DELIMITER //
--表示在哪中操作之前或之后执行
CREATE TRIGGER 触发器名字 
[BEFORE/AFTER] [INSERT/UPDATE/DELETE]     
ON 表名 
FOR EACH ROW      --表示作用于表中每一行数据
语句块;
BEGIN 
END //
DELIMITER;

3.练习:

接下来,进入实战:在插入成绩表(sc)之前创建触发器,来检验待插的数据合理性。

要求:
在插入数据前,如果待插成绩不在0-100之间,说明它是有问题的,将其设置为0。

DELIMITER //
CREATE TRIGGER s1_beforeinsert
BEFORE INSERT
ON sc
FOR EACH ROW
begin
    IF new.grade NOT BETWEEN 0 AND 100 
		THEN SET new.grade=0;
	END IF;
end //

4.触创建发器后的效果

--创建好触发器,我们来执行插入语句,看看结果。
INSERT INTO sc VALUES('210504100212', '1004', 999);
-- 用select来查看结果
SELECT * FROM sc;

结果如下:请注意最后一行的成绩那一栏的数据变为了0.
在这里插入图片描述

5.查看触发器和删除触发器

第一种查看:

它会返回所有触发器信息,不能指定,不方便
SHOW TRIGGERS

第二种查看:
通过调用系统表information_schema.triggers,这个方式可以查看指定的触发器

SELECT * FROM information_schema.triggers WHERE trigger_name='s1_beforeinsert';

返回结果如下:
在这里插入图片描述
删除触发器

DROP TRIGGER 触发器名称;

十三.事件(EVENT)

事件类似于javascript中的定时器效果,简单了解一下:
创建一个30秒后启动的事件,向成绩表中插入数据。

CREATE EVENT insert1
ON sc AT current_timestamp+interval 30 second
DO INSERT INTO sc VALUES('210504100111', '1004', 89);
-- 30秒后再执行该语句,一开始是没有的
SELECT * FROM sc WHERE sno="210504100111";

十四.MYSQL的索引(INDEX)

概述:索引类似于目录,突出的就是一个快字,提高了工作效率。

准备工作:

CREATE TABLE `student_info` (
 `id` INT(11) AUTO_INCREMENT,
 `student_id` INT NOT NULL ,
 `name` VARCHAR(20) DEFAULT NULL,
 `course_id` INT NOT NULL ,
 `class_id` INT(11) DEFAULT NULL,
 `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


CREATE TABLE `course` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`course_id` INT NOT NULL ,
`course_name` VARCHAR(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

1.索引优缺点

优点:

  • 创建索引可以大幅提高系统性能,帮助用户提高查询的速度;
  • 通过索引的唯一性,可以保证数据库表中的每一行数据的唯一性;
  • 可以加速表与表之间的链接;
  • 降低查询中分组和排序的时间。

缺点 :

  • 索引的存储需要占用磁盘空间;
  • 当数据的量非常巨大时,索引的创建和维护所耗费的时间也是相当大的;
  • 当每次执行CRU操作时,索引也需要动态维护,降低了数据的维护速度。

2.索引的分类

索引名关键字索引名关键字
普通索引唯一性索引UNIQUE
全文索引FULLTEXT单列索引
多列索引空间索引SPATIAL

3.索引的创建

值得注意的是:在建表的时候,主键会默认为一个索引。

# 测试索引,以下是我的电脑测试的结果:索引就是快哈。
-- 1. 查看索引
SHOW INDEX FROM course;
SHOW INDEX FROM student_info;
-- 无索引情况下:0.245s
SELECT * FROM student_info WHERE student_id=181871;
-- 添加一个普通索引:1.636s
ALTER TABLE student_info ADD INDEX in_sid(student_id);  
-- 有索引,0.018s
SELECT * FROM student_info WHERE student_id=181871;

# 2.和group by ,order by 连用
SELECT student_id ,count(*)AS num FROM student_info GROUP BY student_id LIMIT 10; -- 0.048s
DROP INDEX in_sid ON student_info;
SELECT student_id ,count(*)AS num FROM student_info GROUP BY student_id LIMIT 10; -- 0.535s

# 3.更新删除字段的where条件语句
UPDATE student_info set student_id=22221 WHERE NAME='KYOYCQ'; -- 0.63s
SELECT * FROM student_info  WHERE NAME='KYOYCQ';
-- 添加索引
ALTER TABLE student_info ADD INDEX in_name(name); 
UPDATE student_info set student_id=22222 WHERE NAME='KYOYCQ';  -- 0.001s

# 4.多表连接的where语句
-- 有索引
SELECT s.course_id,name s.student_id,c.course_name
FROM student_info s INNER JOIN course c ON s.course_id=c.course_id
WHERE name='KYOYCQ';

在这里插入图片描述

好了,不知不觉写了这么多了,想必认真看完,上手MySQL那不是轻轻松松吗? 当然还有一些内容就没有写了,比如事务,权限管理,日志管理,分布式等等,这里就不一一介绍了。以后还会出几篇相关的,就不放在这边了,毕竟要快速上手。 哈哈哈,完结撒花✿✿ヽ(°▽°)ノ✿。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱笑的蓝孩子~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值