MySQL使用

MySQL


参考:CSDN博主「老赖的小弟」的原创文章
原文链接:https://blog.csdn.net/weixin_45851945/article/details/114287877

一、SQL简述

1.SQL的概述

Structure Query Language(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。数据库管理系统可以通过SQL管理数据库;定义和操作数据,维护数据的完整性和安全性。

2.SQL的优点

  • 1、简单易学,具有很强的操作性
  • 2、绝大多数重要的数据库管理系统均支持SQL
  • 3、高度非过程化;用SQL操作数据库时大部分的工作由DBMS自动完成

3.SQL的分类

  • 1、DDL(Data Definition Language) 数据定义语言,用来操作数据库、表、列等; 常用语句:CREATE、 ALTER、DROP
  • 2、DML(Data Manipulation Language) 数据操作语言,用来操作数据库中表里的数据;常用语句:INSERT、 UPDATE、 DELETE
  • 3、DCL(Data Control Language) 数据控制语言,用来操作访问权限和安全级别; 常用语句:GRANT、DENY
  • 4、DQL(Data Query Language) 数据查询语言,用来查询数据 常用语句:SELECT

二 数据库的三大范式

  • 1、第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。
  • 2、第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。
  • 3、第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。

三、数据库的数据类型

使用MySQL数据库存储数据时,不同的数据类型决定了 MySQL存储数据方式的不同。为此,MySQL数据库提供了多种数据类型,其中包括整数类型、浮点数类型、定点 数类型、日期和时间类型、字符串类型、二进制…等等数据类型。

1 整数类型

根据数值取值范围的不同MySQL 中的整数类型可分为5种,分别是TINYINT、SMALUNT、MEDIUMINT、INT和 BIGINT。下图列举了 MySQL不同整数类型所对应的字节大小和取值范围而最常用的为INT类型的,
在这里插入图片描述

2 浮点数类型和定点数类型

在MySQL数据库中使用浮点数和定点数来存储小数。浮点数的类型有两种:单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE)。而定点数类型只有一种即DECIMAL类型。下图列举了 MySQL中浮点数和定点数类型所对应的字节大小及其取值范围:
在这里插入图片描述
从上图中可以看出:DECIMAL类型的取值范围与DOUBLE类型相同。但是,请注意:DECIMAL类型的有效取值范围是由M和D决定的。其中,M表示的是数据的长 度,D表示的是小数点后的长度。比如,将数据类型为DECIMAL(6,2)的数据6.5243 插人数据库后显示的结果为6.52

3 字符串类型

在MySQL中常用CHAR 和 VARCHAR 表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1。

4 文本类型

文本类型用于表示大文本数据,例如,文章内容、评论、详情等,它的类型分为如下4种:
在这里插入图片描述

5 日期和时间类型

MySQL提供的表示日期和时间的数据类型分别是 :YEAR、DATE、TIME、DATETIME 和 TIMESTAMP。下图列举了日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值:
在这里插入图片描述

5.1 YEAR类型

YEAR类型用于表示年份,在MySQL中,可以使用以下三种格式指定YEAR类型 的值。

  • 1、使用4位字符串或数字表示,范围为’1901’—'2155’或1901—2155。例如,输人 ‘2019’或2019插人到数据库中的值均为2019。
  • 2、使用两位字符串表示,范围为’00’—‘99’。其中,‘00’—'69’范围的值会被转换为 2000—2069范围的YEAR值,‘70’—'99’范围的值会被转换为1970—1999范围的YEAR 值。例如,输人’19’插人到数据库中的值为2019。
  • 3、使用两位数字表示,范围为1—99。其中,1—69范围的值会被转换为2001— 2069范围的YEAR值,70—99范围的值会被转换为1970—1999范围的YEAR值。例 如,输人19插入到数据库中的值为2019。
    请注意:当使用YEAR类型时,一定要区分’0’和0。因为字符串格式的’0’表示的YEAR值是2000而数字格式的0表示的YEAR值是0000。

5.2 TIME类型

TIME类型用于表示时间值,它的显示形式一般为HH:MM:SS,其中,HH表示小时, MM表示分,SS表示秒。在MySQL中,可以使用以下3种格式指定TIME类型的值。

  • 1、以’D HH:MM:SS’字符串格式表示。其中,D表示日可取0—34之间的值, 插人数据时,小时的值等于(DX24+HH)。例如,输入’2 11:30:50’插人数据库中的日期为59:30:50。
  • 2、以’HHMMSS’字符串格式或者HHMMSS数字格式表示。 例如,输人’115454’或115454,插入数据库中的日期为11:54:54
  • 3、使用CURRENT_TIME或NOW()输人当前系统时间。

5.3 DATETIME类型

DATETIME类型用于表示日期和时间,它的显示形式为’YYYY-MM-DD HH: MM:SS’,其中,YYYY表示年,MM表示月,DD表示日,HH表示小时,MM表示分,SS 表示秒。在MySQL中,可以使用以下4种格式指定DATETIME类型的值。

  • 1 以’YYYY-MM-DD HH:MM:SS’或者’YYYYMMDDHHMMSS’字符串格式表示的日期和时间,取值范围为’1000-01-01 00:00:00’—‘9999-12-3 23:59:59’。例如,输人’2019-01-22 09:01:23’或 ‘20140122_0_90123’插人数据库中的 DATETIME 值都为 2019-01-22 09:01:23。
  • 2 以’YY-MM-DD HH:MM:SS’或者’YYMMDDHHMMSS’字符串格式表示的日期和时间,其中YY表示年,取值范围为’00’—‘99’。与DATE类型中的YY相同,‘00’— '69’范围的值会被转换为2000—2069范围的值,‘70’—'99’范围的值会被转换为1970—1999范围的值。
  • 以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期 和时间。例如,插入20190122090123或者190122090123,插人数据库中的DATETIME值都 为 2019-01-22 09:01:23。
  • 使用NOW来输人当前系统的日期和时间。

5.4 TIMESTAMP类型

TIMESTAMP类型用于表示日期和时间,它的显示形式与DATETIME相同但取值范围比DATETIME小。在此,介绍几种TIMESTAMP类型与DATATIME类型不同的形式:
1、使用CURRENT_TIMESTAMP输人系统当前日期和时间。
2、输人NULL时系统会输人系统当前日期和时间。
3、无任何输人时系统会输入系统当前日期和时间。

6 二进制类型

在MySQL中常用BLOB存储二进制类型的数据,例如:图片、PDF文档等。BLOB类型分为如下四种:
在这里插入图片描述

四 数据库、数据表的基本操作

1 数据库的基本操作

1.1 启动和登录

若是在windows环境下,在cmd输入

net start mysql

来启动MySQL

输入

mysql -u root –p

以root身份进入数据库,会显示要求输入密码,输入完密码后就进入了数据库。

1.2 创建一个数据库

MySQL安装完成后,要想将数据存储到数据库的表中,首先要创建一个数据库。创建数据库就是在数据库系统中划分一块空间存储数据,语法如下:

create database 数据库名称;

创建一个叫db1的数据库MySQL命令:

create database db1;

运行效果展示:

在这里插入图片描述

1.3查看数据库基本信息

创建数据库后查看该数据库基本信息MySQL命令:

show create database db1;

运行效果展示:
在这里插入图片描述

1.4删除数据库

删除数据库MySQL命令:

drop database db1;

运行效果展示:
在这里插入图片描述

1.5 查看所有数据库

查询出MySQL中所有的数据库MySQL命令:

show databases;

运行效果展示:
在这里插入图片描述
注:MySQL默认有自带的数据库,mysql库存放着mysql的系统和用户权限信息,我们改密码和新增用户,实际上就是对这个库进行操作。

1.6 修改数据库的字符集

将数据库的字符集修改为gbk MySQL命令:

alter database db1 character set gbk;

运行效果展示:
在这里插入图片描述

1.7 切换数据库

切换数据库 MySQL命令:

use db1;

运行效果展示:
在这里插入图片描述

1.8 查看当前使用的数据库

查看当前使用的数据库 MySQL命令:

select database();

在这里插入图片描述

2 数据表的基本操作

数据库创建成功后可在该数据库中创建数据表(简称为表)存储数据。请注意:在操作数据表之前应使用“USE 数据库名;”指定操作是在哪个数据库中进行先关操作,否则会抛出“No database selected”错误。
注:字段就是表中的列!select命令查找的是字段,也就是查找的列!
语法如下:

 create table 表名(
         字段1 字段类型,
         字段2 字段类型,
         …
         字段n 字段类型
);

2.1 创建数据表

示例:创建学生表 MySQL命令:

 create table student(
 id int,
 name varchar(20),
 gender varchar(10),
 birthday date
 );

运行效果展示:
在这里插入图片描述

2.2 查看当前数据库内所有的数据表

示例:查看当前数据库中所有表 MySQL命令:

show tables;

运行效果展示:
在这里插入图片描述

2.3 查看某个表的基本信息

查表的基本信息 MySQL命令:

show create table student;

运行效果展示:
在这里插入图片描述

2.4 查看表的字段信息(字段就是列!)

字段就是列!

desc student;

在这里插入图片描述尽量使用这个,而不是 show create table student;

补充:查看表的内容,要用select * 命令!(select是查列,也就是字段)

一般来讲,使用select * 和desc 这两个命令就足够了。

2.5 修改数据表

有时,希望对表中的某些信息进行修改,例如:修改表名、修改字段名、修改字段数据类型…等等。在MySQL中使用alter table修改数据表。

  • 修改表名 MySQL命令
alter table student rename to stu;

运行效果展示:
在这里插入图片描述

  • 修改字段名 MySQL命令:
alter table stu change name sname varchar(10);

运行效果展示:
在这里插入图片描述

  • 修改字段数据类型 MySQL命令:
alter table stu modify sname int;

在这里插入图片描述

  • 增加字段 MySQL命令:
alter table stu add address varchar(50);

在这里插入图片描述

  • 删除字段 MySQL命令:
alter table stu drop address;

在这里插入图片描述

2.6 删除数据表

语法:

drop table 表名;

示例:删除数据表 MySQL命令:

drop table stu;

运行效果展示:
在这里插入图片描述

五 数据表的约束

为防止错误的数据被插入到数据表,MySQL中定义了一些维护数据库完整性的规则;这些规则常称为表的约束。常见约束如下:

约束条件说明
PRIMARY KEY主键约束,用于唯一标识对应的记录
FOREIGN KEY外键约束
NOT NULL非空约束
UNIQUE唯一性约束
DEFAULT默认值约束,用于设置字段的默认值

以上五种约束条件针对表中字段进行限制从而保证数据表中数据的正确性和唯一性。换句话说,表的约束实际上就是表中数据的限制条件。

1.主键约束

主键约束即primary key用于唯一的标识表中的每一行。被标识为主键的数据在表中是唯一的且其值不能为空。这点类似于我们每个人都有一个身份证号,并且这个身份证号是唯一的。
主键约束基本语法:

字段名 数据类型 primary key;

设置主键约束(primary key)的第一种方式:

create table student(
id int primary key,
name varchar(20)
);

运行效果展示:
在这里插入图片描述设置主键约束(primary key)的第二·种方式:

create table student01(
id int
name varchar(20),
primary key(id)
);

运行效果展示:
在这里插入图片描述

2 非空约束

非空约束即 NOT NULL指的是字段的值不能为空,基本的语法格式如下所示:

字段名 数据类型 NOT NULL;

示例:MySQL命令:

create table student02(
id int
name varchar(20) not null
);

运行效果展示:
在这里插入图片描述

3 默认值约束

默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值;其基本的语法格式如下所示:

字段名 数据类型 DEFAULT 默认值;

示例:MySQL命令:

create table student03(
id int,
name varchar(20),
gender varchar(10) default 'male'
);

在这里插入图片描述

4 唯一性约束

唯一性约束即UNIQUE用于保证数据表中字段的唯一性,即表中字段的值不能重复出现,其基本的语法格式如下所示:

字段名 数据类型 UNIQUE;

示例:

create table student04(
id int,
name varchar(20) unique
);

在这里插入图片描述

5 外键约束

外键约束即FOREIGN KEY常用于多张表之间的约束。基本语法如下:

-- 在创建数据表时语法如下:
CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段)
-- 将创建数据表创号后语法如下:
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);

示例:创建一个学生表 MySQL命令:

create table student05(
id int primary key,
name varchar(20)
);

示例:创建一个班级表 MySQL命令:

create table class(
classid int primary key,
studentid int
);

示例:学生表作为主表,班级表作为副表设置外键, MySQL命令:

alter table class add constraint fk_class_studentid foreign key(studentid) references student05(id);

运行效果展示:
在这里插入图片描述
什么是外键:

  • 从表(sub)的某列引用(ref)主表(main)的某列的值。
  • 比方学生表有个学生编号(sid),分数表中的学生列(stu)引用学生表的学生编号,此时对于分数表的 stu 来说。学生表的 sid 就是外键。
  • 从表也叫外键表,主表也叫主键表、外表,列也叫字段。
  • 外键名要通过特殊方法去查。一般是不显示的。
    在这里插入图片描述

所以说:

  • 每个表都会有主键(没有也会自动生成)
  • 外键是从表才会有的,从表通过外键来联结主表
  • 所以说主表与从表是一对多的关系,因为外键值并不是唯一的,主表中的每一行可以对应从表的很多行,只需要从表的这些行的外键值是主表的主键值即可!

5.1 数据一致性概念

大家知道:建立外键是为了保证数据的完整和统一性。但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢?很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据。

5.2 删除外键

语法如下:

alter table 从表名 drop foreign key 外键名;

示例:删除外键 MySQL命令:

alter table class drop foreign key fk_class_studentid;

在这里插入图片描述
外键的那个字段不在了证明删除成功了

5.3 关于外键约束需要注意的细节

1、从表里的外键通常为主表的主键
2、从表里外键的数据类型必须与主表中主键的数据类型一致
3、主表发生变化时应注意主表与从表的数据一致性问题

六 数据表插入数据

在MySQL通过INSERT语句向数据表中插入数据。在此,我们先准备一张学生表,代码如下:

 create table student(
 id int,
 name varchar(30),
 age int,
 gender varchar(30)
 );

1 为表中所有字段插入数据

每个字段与其值是严格一一对应的。也就是说:每个值、值的顺序、值的类型必须与对应的字段相匹配。但是,各字段也无须与其在表中定义的顺序一致,它们只要与 VALUES中值的顺序一致即可。
语法如下:

INSERT INTO 表名(字段名1,字段名2,...) VALUES (1,2,...);

示例:向学生表中插入一条学生信息 MySQL命令:

insert into student (id,name,age,gender) values (1,'bob',16,'male');

运行效果展示:
在这里插入图片描述

2 为表中指定字段插入数据

语法如下:

INSERT INTO 表名(字段名1,字段名2,...) VALUES (1,2,...);

插入数据的方法基本和为表中所有字段插入数据,一样,只是需要插入的字段由你自己指定

3 同时插入多条记录

语法如下:

INSERT INTO 表名 [(字段名1,字段名2,...)]VALUES (1,2,),(1,2,),...;

在该方式中:(字段名1,字段名2,…)是可选的,它用于指定插人的字段名;(值 1,值 2,…),(值 1,值 2,…)表示要插人的记录,该记录可有多条并且每条记录之间用逗号隔开。
示例:向学生表中插入多条学生信息 MySQL命令:

insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male');

在这里插入图片描述

七 更新表中数据

在MySQL通过UPDATE语句更新数据表中的数据。在此,我们将就用六中的student学生表

1 UPDATE基本语法

UPDATE 表名 SET 字段名1=1[,字段名2 =2,] [WHERE 条件表达式];

在该语法中:字段名1、字段名2…用于指定要更新的字段名称;值1、值 2…用于表示字段的新数据;WHERE 条件表达式 是可选的,它用于指定更新数据需要满足的条件

2 UPDATE更新部分数据

示例:将name为tom的记录的age设置为20并将其gender设置为female ,MySQL命令:

update student set age=20,gender='female' where name='tom';

在这里插入图片描述

3 UPDATE更新全部数据

示例:将所有记录的age设置为18 MySQL命令:

update student set age=18;

运行效果展示:
在这里插入图片描述

八 删除表中数据

在MySQL通过DELETE语句删除数据表中的数据。在此,我们先准备一张数据表,代码如下:

-- 创建学生表
 create table student(
 id int,
 name varchar(30),
 age int,
 gender varchar(30)
 );
 -- 插入数据
 insert into student (id,name,age,gender) values (2,'lucy',17,'female'),(3,'jack',19,'male'),(4,'tom',18,'male'),(5,'sal',19,'female'),(6,'sun',20,'male'),(7,'sad',13,'female'),(8,'sam',14,'male');

1 DELETE基本语法

在该语法中:表名用于指定要执行删除操作的表;[WHERE 条件表达式]为可选参数用于指定删除的条件。

DELETE FROM 表名 [WHERE 条件表达式];

2 DELETE删除部分数据

示例:删除age等于14的所有记录 MySQL命令:

delete from student where age=14;

运行效果展示:
在这里插入图片描述

3 DELETE删除全部数据

示例:删除student表中的所有记录 MySQL命令:

delete from student;

4 TRUNCATE和DETELE的区别

TRUNCATE和DETELE都能实现删除表中的所有数据的功能,但两者也是有区别的:
1、DELETE语句后可跟WHERE子句,可通过指定WHERE子句中的条件表达式只删除满足条件的部分记录;但是,TRUNCATE语句只能用于删除表中的所有记录。
2、使用TRUNCATE语句删除表中的数据后,再次向表中添加记录时自动增加字段的默认初始值重新由1开始;使用DELETE语句删除表中所有记录后,再次向表中添加记录时自动增加字段的值为删除时该字段的最大值加1
3、DELETE语句是DML语句,TRUNCATE语句通常被认为是DDL语句

九 MySQL数据表简单查询(主要是SELECT)

1.简单查询概述

简单查询即不含where的select语句。在此,我们讲解简单查询中最常用的两种查询:查询所有字段和查询指定字段。
在此,先准备测试数据,代码如下:

-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 创建student表
CREATE TABLE student (
    sid CHAR(6),
    sname VARCHAR(50),
    age INT,
    gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入数据
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

2 查询所有字段(方法不唯一只是举例)

select就是一个查字段(列)的命令。!!返回的是所有行!!
(也就是说SELECT语句返回所有匹配的行)
查询所有字段 MySQL命令:

select * from student;

运行效果展示:
在这里插入图片描述

3 查询指定字段(sid、sname)

也就是查找指定列!(字段就是列)
查询指定字段(sid、sname) MySQL命令:

select sid,sname from student;

在这里插入图片描述

4 常数的查询

在SELECT中除了书写列名,还可以书写常数。可以用于标记。
常数的查询日期标记 MySQL命令:

select sid,sname,'2021-03-02' from student;

在这里插入图片描述

5 从查询结果中过滤重复数据

背景:我们使用select会查询出指定列的所有行。

将DISTINCT和SELECT结合使用,则只会返回具有不同值的行

在使用DISTINCT 时需要注意:
在SELECT查询语句中DISTINCT关键字只能用在第一个所查列名之前。
MySQL命令:

select distinct gender from student;

在这里插入图片描述

6 算术运算符(举例加运算符)

在SELECT查询语句中还可以使用加减乘除运算符。
查询学生10年后的年龄 MySQL命令:

 select sname,age+10 from student;

运行效果展示:
在这里插入图片描述

7 限制结果

SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。

SELECT sname from student LIMIT 5;

此语句使用SELECT语句检索单个列。LIMIT 5指示MySQL返回不多于5行。

8 排序数据

上面的SELECT查出来的结果没有排序。其实,检索出的数据并不是以纯粹的随机顺序显示的。如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。因此,如果不明确控制的话,不能(也不应该)依赖该排序顺序。

首先明确字句的概念:

  • SQL语句由子句构成,有些子句是必需的,而有的是可选的。一个子句通常由一个关键字和所提供的数据组成。子句的例子有SELECT语句的FROM子句。

为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。

例子:

SELECT sname FROM student ORDER BY sname;
  • 这将查询出的结果按照sname的字母顺序进行排序(默认A-Z)!
  • 注:如果ORDER BY 后面的列名的字段类型是字符串,那么按照首字符排序;如果ORDER BY后面跟的是整数类型,那么按照数字大小进行排序。
SELECT sname,age,gender FROM student ORDER BY age,sname;
  • 这条语句查找sname和age字段(列),并将查到的所有列按照age的大小排序,如果age大小一样,那么按照sname的字母顺序排序。
    在这里插入图片描述

数据排序不限于升序排序(从A到Z)。这只是默认的排序顺序,还可以使用ORDER BY子句以降序(从Z到A)顺序排序。为了进行降序排序,必须指定DESC关键字。与DESC相反的关键字是ASC(ASCENDING),在升序排序时可以指定它。但实际上,ASC没有多大用处,因为升序是默认的(如果既不指定ASC也不指定DESC,则假定为ASC)。
下面的例子按照age以降序排序:

SELECT age FROM student ORDER BY age DESC

十 函数

首先要注意的是:函数没有SQL的可移植性强,如果你决定使用函数,应该保证做好代码注释,以便以后你(或其他人)能确切地知道所编写SQL代码的含义。

在此,先准备测试数据,代码如下:

-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 创建student表
CREATE TABLE student (
    sid CHAR(6),
    sname VARCHAR(50),
    age INT,
    gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入数据
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');

在这里插入图片描述

1 聚合函数

在开发中,我们常常有类似的需求:统计某个字段的最大值、最小值、 平均值等等。为此,MySQL中提供了聚合函数来实现这些功能。所谓聚合,就是将多行汇总成一行;其实,所有的聚合函数均如此——输入多行,输出一行。聚合函数具有自动滤空的功能,若某一个值为NULL,那么会自动将其过滤使其不参与运算。

聚合函数使用规则:
只有SELECT子句和HAVING子句、ORDER BY子句中能够使用聚合函数。例如,在WHERE子句中使用聚合函数是错误的。
接下来,我们学习常用聚合函数。

1.1 count()

统计表中数据的行数或者统计指定列其值不为NULL的数据个数。

1)查询有多少该表中有多少人(查该表的行数)。
MySQL命令:

select count(*) from student;

运行效果展示:
在这里插入图片描述2)查询指定列其值不为NULL的行数:

select count(sid) from student;

在这里插入图片描述

1.2 max(),min()

计算指定列的最大值或最小值,如果指定列是字符串类型则使用字符串排序运算

查询该学生表中年纪最大的学生
MySQL命令:

select max(age) from student;

运行效果展示:
在这里插入图片描述在这里插入图片描述

1.3 sum()

计算指定列的数值和,如果指定列类型不是数值类型则计算结果为0;
查询该学生表中年纪的总和 MySQL命令:

select sum(age) from student;

运行效果展示:
在这里插入图片描述在这里插入图片描述

1.4 avg()

计算指定列的平均值,如果指定列类型不是数值类型则计算结果为0。

查询该学生表中年纪的平均数 MySQL命令:

select avg(age) from student;

在这里插入图片描述在这里插入图片描述

2 其他常用函数

这里我就不一一举例了,基本混个眼熟,以后用到再细说。

2.1 时间函数

日期和时间采用相应的数据类型和特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。一般,应用程序不使用用来存储日期和时间的格式,因此日期和时间函数总是被用来读取、统计和处理这些值。由于这个原因,日期和时间函数在MySQL语言中具有重要的作用。

SELECT NOW();
SELECT DAY (NOW());
SELECT DATE (NOW());
SELECT TIME (NOW());
SELECT YEAR (NOW());
SELECT MONTH (NOW());
SELECT CURRENT_DATE();
SELECT CURRENT_TIME();
SELECT CURRENT_TIMESTAMP();
SELECT ADDTIME('14:23:12','01:02:01');
SELECT DATE_ADD(NOW(),INTERVAL 1 DAY);
SELECT DATE_ADD(NOW(),INTERVAL 1 MONTH);
SELECT DATE_SUB(NOW(),INTERVAL 1 DAY);
SELECT DATE_SUB(NOW(),INTERVAL 1 MONTH);
SELECT DATEDIFF('2019-07-22','2019-05-05');

2.2 字符串函数

--连接函数
SELECT CONCAT ()
--
SELECT INSTR ();
--统计长度
SELECT LENGTH();

2.3 数学函数

-- 绝对值
SELECT ABS(-136);
-- 向下取整
SELECT FLOOR(3.14);
-- 向上取整
SELECT CEILING(3.14);

3 文本处理函数

3.3.1 RTrim()

使用RTrim()函数来去除列值右边的空格

3.3.2 Upper()函数

SELECT vend_name,Upper(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;

在这里插入图片描述

  • 正如所见,Upper()将文本转换为大写,因此本例子中每个供应商都列出两次,第一次为vendors表中存储的值,第二次作为列vend_name_upcase转换为大写。

3.3.3 其他文本处理函数

在这里插入图片描述
在这里插入图片描述

十一 条件查询(SELECT中使用where子句)

数据库中存有大量数据,我们可根据需求获取指定的数据。此时,我们可在查询语句中通过WHERE子句注意子句的概念)指定查询条件对查询结果进行过滤。
在开始学习条件查询之前,我们先准备测试数据,代码如下:

-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 创建student表
CREATE TABLE student (
    sid CHAR(6),
    sname VARCHAR(50),
    age INT,
    gender VARCHAR(50) DEFAULT 'male'
);

-- 向student表插入数据
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1001', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1002', 'wang', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1003', 'tywd', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1004', 'hfgs', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1005', 'qwer', 18, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1006', 'zxsd', 19, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1007', 'hjop', 16, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1008', 'tyop', 15, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1009', 'nhmk', 13, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1010', 'xdfv', 17, 'female');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1012', 'lili', 14, 'male');
INSERT INTO student (sid,sname,age,gender) VALUES ('S_1013', 'wang', 15, 'female');

1使用关系运算符查询

在SELECT语句中,数据根据WHERE子句中指定的搜索条件进行过滤。
在WHERE中可使用关系运算符进行条件查询,常用的关系运算符如下所示:
在这里插入图片描述查询年龄等于或大于17的学生的信息 MySQL命令:

select * from student where age>=17;

运行效果展示:
在这里插入图片描述注:WHERE子句的位置 :在同时使用ORDER BY和WHERE子句时,应该让ORDER BY位于WHERE之后,否则将会产生错误

查询sname等于lili的Mysql命令:(注意不区分大小写)

SELECT sname,age,gender from student where sname='LIli';

在这里插入图片描述

  • 单引号用来限定字符串。如果将值与串类型的列进行比较,则需要限定引号。用来与数值列进行比较的值不用引号。

2 使用IN关键字查询

IN关键字用于判断某个字段的值是否在指定集合中。如果字段的值恰好在指定的集合中,则将字段所在的记录将査询出来。

查询sid为S_1002和S_1003的学生信息 MySQL命令:

select * from student where sid in ('S_1002','S_1003');

在这里插入图片描述
下面的语句完成的任务与上面相同:

SELECT * FROM student where sid='S_1002' OR sid='S_1003';

查询sid为S_1001以外的学生的信息 MySQL命令:

select * from student where sid not in ('S_1001');

在这里插入图片描述

3 使用BETWEEN AND关键字查询

BETWEEN AND用于判断某个字段的值是否在指定的范围之内。如果字段的值在指定范围内,则将所在的记录将查询出来。

查询15到18岁的学生信息 MySQL命令:

select * from student where age between 15 and 18;

在这里插入图片描述
查询不是15到18岁的学生信息 MySQL命令:

select * from student where age not between 15 and 18;

在这里插入图片描述

4 使用空值查询

在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串。
由于student表没有空值就不演示查询空值的了。

select * from student where sname is not null;

在这里插入图片描述

5 使用AND关键字查询

在MySQL中可使用AND关键字可以连接两个或者多个查询条件。
查询年纪大于15且性别为male的学生信息 MySQL命令:

select * from student where age>15 and gender='male

在这里插入图片描述

6 使用OR关键字查询

在使用SELECT语句查询数据时可使用OR关键字连接多个査询条件。在使用OR关键字时,只要记录满足其中任意一个条件就会被查询出来。
查询年纪大于15或者性别为male的学生信息 MySQL命令:

select * from student where age>15 or gender='male';

运行效果展示:
在这里插入图片描述

7 使用LIKE关键字查询

MySQL中可使用LIKE关键字可以判断两个字符串是否相匹配。

7.1 普通字符串

查询sname中与wang匹配的学生信息 MySQL命令:

SELECT * FROM student WHERE sname LIKE 'wang';

运行效果展示:
在这里插入图片描述

7.2 含有%通配的字符串

%用于匹配任意长度的字符串。例如,字符串“a%”匹配以字符a开始任意长度的字符串。
查询学生姓名以li开始的记录 MySQL命令:

select * from student where sname like 'li%';

在这里插入图片描述
查询学生姓名以g结尾的记录 MySQL命令:

select * from student where sname like '%g';

在这里插入图片描述
查询学生姓名包含s的记录 MySQL命令:

select * from student where sname like '%s%';

在这里插入图片描述

7.3含有_通配的字符串

下划线通配符只匹配单个字符,如果要匹配多个字符,需要连续使用多个下划线通配符。例如,字符串“ab_”匹配以字符串“ab”开始长度为3的字符串,如abc、abp等等;字符串“a__d”匹配在字符“a”和“d”之间包含两个字符的字符串,如"abcd"、"atud"等等。

查询学生姓名以zx开头且长度为4的记录 MySQL命令:

select * from student where sname like 'zx__';

运行效果展示:
在这里插入图片描述查询学生姓名以g结尾且长度为4的记录 MySQL命令:

select * from student where sname like '___g';

在这里插入图片描述

8 使用LIMIT限制查询结果的数量

当执行查询数据时可能会返回很多条记录,而用户需要的数据可能只是其中的一条或者几条。

查询学生表中年纪最小的3位同学 MySQL命令:

select * from student order by age asc limit 3;

9 使用GROUP BY进行分组查询

GROUP BY 子句可像切蛋糕一样将表中的数据进行分组,再进行查询等操作。换言之,可通俗地理解为:通过GROUP BY将原来的表拆分成了几张小表。
接下来,我们通过一个例子开始学习GROUP BY,代码如下:

-- 创建数据库
DROP DATABASE IF EXISTS mydb;
CREATE DATABASE mydb;
USE mydb;

-- 创建员工表
CREATE TABLE employee (
    id int,
    name varchar(50),
    salary int,
    departmentnumber int
);

-- 向员工表中插入数据
INSERT INTO employee values(1,'tome',2000,1001); 
INSERT INTO employee values(2,'lucy',9000,1002); 
INSERT INTO employee values(3,'joke',5000,1003); 
INSERT INTO employee values(4,'wang',3000,1004); 
INSERT INTO employee values(5,'chen',3000,1001); 
INSERT INTO employee values(6,'yukt',7000,1002); 
INSERT INTO employee values(7,'rett',6000,1003); 
INSERT INTO employee values(8,'mujk',4000,1004); 
INSERT INTO employee values(9,'poik',3000,1001);

9.1 GROUP BY和聚合函数一起使用

统计各部门员工个数 MySQL命令:

select count(*), departmentnumber from employee group by departmentnumber;

在这里插入图片描述
统计部门编号大于1001的各部门员工个数 MySQL命令:

select count(*), departmentnumber from employee where departmentnumber>1001 group by departmentnumber;

在这里插入图片描述

9.2 GROUP BY和聚合函数以及HAVING一起使用

统计工资总和大于8000的部门 MySQL命令:

select sum(salary),departmentnumber from employee group by departmentnumber having sum(salary)>8000;

在这里插入图片描述

10 使用ORDER BY对查询结果排序

从表中査询出来的数据可能是无序的或者其排列顺序不是我们期望的。为此,我们可以使用ORDER BY对查询结果进行排序
其语法格式如下所示:

SELECT 字段名1,字段名2,FROM 表名
ORDER BY 字段名1 [ASCDESC],字段名2 [ASC | DESC];

在该语法中:字段名1、字段名2是查询结果排序的依据;参数 ASC表示按照升序排序,DESC表示按照降序排序;默认情况下,按照ASC方式排序。通常情况下,ORDER BY子句位于整个SELECT语句的末尾。

查询所有学生并按照年纪大小升序排列 MySQL命令:

select * from student order by age asc;

在这里插入图片描述
查询所有学生并按照年纪大小降序排列 MySQL命令:

select * from student order by age desc;

在这里插入图片描述

十二 正则表达式

1 正则表达式介绍

正则表达式是用来匹配文本的特殊的串(字符集合)。

所有种类的程序设计语言、文本编辑器、操作系统等都支持正则表达式。有见识的程序员和网络管理员已经关注作为他们技术工具重要内容的正则表达式很长时间了。

正则表达式用正则表达式语言来建立,正则表达式语言是用来完成刚讨论的所有工作以及更多工作的一种特殊语言。与任意语言一样,正则表达式具有你必须学习的特殊的语法和指令。

也就是说,正则表达式是一种不依赖于编程语言的一种句法或者说是语言。

2 使用MySQL正则表达式

那么,正则表达式与MySQL有何关系?已经说过,正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据。

MySQL仅支持多数正则表达式实现的一个很小的子集。

2.1 基本字符匹配

还是以student表作为我们查找的对象。
我们从一个非常简单的例子开始。下面的语句检索列gender包含文本fe的所有行:

select gender from student where gender REGEXP 'fe';

结果:
在这里插入图片描述除关键字LIKE被REGEXP替代外,这条语句看上去非常像使用LIKE的语句。
它告诉MySQL:REGEXP后所跟的东西作为正则表达式(与文字正文fe匹配的一个正则表达式)处理。

LIKE与REGEXP 在LIKE和REGEXP之间有一个重要的差别:

  • 如果将上述的REGEXP换成like,那么不会查出结果。
  • 如果将上述的REGEXP ‘fe’ 换成LIKE ‘fe%’,那么查到的结果相同。

所以说,REGEXP注重匹配,就是有这个字符就行。

例二:

 select sid from student where sid REGEXP '.4';

在这里插入图片描述

  • . (点)是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符
  • MySQL中的正则表达式匹配(自版本3.23.4后)不区分大小写(即,大写和小写都匹配)。为区分大小写,可使用BINARY关键字。

2.2 进行OR匹配

为搜索两个串之一(或者为这个串,或者为另一个串),使用|,如下所示:

select sname from student where sname REGEXP 'e|p';

在这里插入图片描述

  • | 为正则表达式的OR操作符。它表示匹配其中之一,因此e和p都匹配并返回。

2.3 匹配几个字符之一

如果你只想匹配特定的字符,怎么办?可通过指定一组用[和]括起来的字符来完成,如下所示:

select sid from student where sid REGEXP '100[123]';

在这里插入图片描述

  • 这里,使用了正则表达式100[123]。[123]定义一组字符,它的意思是匹配1或2或3。
  • 正如所见,[]是另一种形式的OR语句。事实上,正则表达式100[123]为100[1|2|3]的缩写,也可以使用后者。

2.4 匹配范围

集合可用来定义要匹配的一个或多个字符。例如,下面的集合将匹配数字0到9:
在这里插入图片描述
为简化这种类型的集合,可使用-来定义一个范围。下面的式子功能上等同于上述数字列表:
在这里插入图片描述
范围不限于完整的集合,[1-3]和[6-9]也是合法的范围。此外,范围不一定只是数值的,[a-z]匹配任意字母字符。

select age from student where age REGEXP '1[4-7]';

在这里插入图片描述

  • 不管是数字还是字符串,都要加引号’’。

2.5 匹配特殊字符

正则表达式语言由具有特定含义的特殊字符构成。我们已经看到.、[]、|和-等,还有其他一些字符。请问,如果你需要匹配这些字符,应该怎么办呢?例如,如果要找出包含.字符的值,怎样搜索?请看下面的例子:

select sid from student where sid REGEXP '\\_';

在这里插入图片描述

为了匹配特殊字符,必须用\\为前导。\\-表示查找-,\\.表示查找. 
正则表达式内具有特殊意义的所有字符都必须以这种方式转义。这包括.|[]以及迄今为止使用过的其他特殊字符。
  • 为了匹配反斜杠(\)字符本身,需要使用三根\
  • 多数正则表达式实现使用单个反斜杠转义特殊字符,以便能使用这些字符本身。但MySQL要求两个反斜杠(MySQL自己解释一个,正则表达式库解释另一个)。

2.6匹配字符类

存在找出你自己经常使用的数字、所有字母字符或所有数字字母字符等的匹配。为更方便工作,可以使用预定义的字符集,称为字符类(character class)。
在这里插入图片描述

2.7 匹配多个实例

目前为止使用的所有正则表达式都试图匹配单次出现。如果存在一个匹配,该行被检索出来,如果不存在,检索不出任何行。但有时需要对匹配的数目进行更强的控制。例如,你可能需要寻找所有的数,不管数中包含多少数字,或者你可能想寻找一个单词并且还能够适应一个尾随的s(如果存在),等等。
这可以用表9-3列出的正则表达式重复元字符来完成。
在这里插入图片描述
下面举几个例子:

SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9]sticks?\\)';

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

1 正则表达式\\([0-9] sticks?\\)需要解说一下。
2 \\(匹配([0-9]匹配任意数字(这个例子中为15),
3 sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出
现),
4 \\)匹配)5 没有?,匹配stick和sticks会非常困难。 

以下是另一个例子。这次我们打算匹配连在一起的4位数字:

SELECT prod_name FROM products WHERE prod_name REGEXP '[[:digit:]]{4}';

在这里插入图片描述

  • 如前所述,[:digit:]匹配任意数字,因而它为数字的一个集合。{4}确切地要求它前面的字符(任意数字)出现4次,所以[[:digit:]]{4}匹配连在一起的任意4位数字。
  • 需要注意的是,在使用正则表达式时,编写某个特殊的表达式几乎总是有不止一种方法。上面的例子也可以如下编写:SELECT prod_name FROM products WHERE prod_name REGEXP ‘[0-9][0-9][0-9][0-9]’;

2.8 定位符

目前为止的所有例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,需要使用下表列出的定位符。
在这里插入图片描述
例如,如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,怎么办?简单搜索[0-9\.](或[[:digit:]\.])不行,因为它将在文本内任意位置查找匹配。解决办法是使用^定位符,如下所示:

SELECT prod_name FROM products WHERE prod_name REGEXP '^[0-9]\\.]' ORDER BY prod_name;

在这里插入图片描述

^匹配串的开始。因此,^[0-9\\.]只在.或任意数字为串中第一个字符时才匹配它们。

没有^,则还要多检索出4个别的行(那些中间有数字的行)。

十二 别名设置

在査询数据时可为表和字段取別名,该别名代替表和字段的原名参与查询操作。
操作的表事先已准备

1 为表取别名

在查询操作时,假若表名很长使用起来就不太方便,此时可为表取一个別名,用该别名来代替表的名称。语法格式如下所示:

SELECT * FROM 表名 [AS] 表的别名 WHERE .... ;

将student改为stu查询整表 MySQL命令:

select * from student as stu;

在这里插入图片描述

2 为字段取别名

在查询操作时,假若字段名很长使用起来就不太方便,此时可该字段取一个別名,用该别名来代替字段的名称。语法格式如下所示:

SELECT 字段名1 [AS] 别名1 , 字段名2 [AS] 别名2 , ... FROM 表名 WHERE ... ;

将student中的name取别名为“姓名” 查询整表 MySQL命令:

select name as '姓名',id from student;

在这里插入图片描述

十三 表的关联关系

在实际开发中数据表之间存在着各种关联关系。在此,介绍MySQL中数据表的三种关联关系。

  • 多对一
    多对一(亦称为一对多)是数据表中最常见的一种关系。例如:员工与部门之间的关系,一个部门可以有多个员工;而一个员工不能属于多个部门只属于某个部门。在多对一的表关系中,应将外键建在多的一方否则会造成数据的冗余。
  • 多对多
    多对多是数据表中常见的一种关系。例如:学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生。通常情况下,为了实现这种关系需要定义一张中间表(亦称为连接表)该表会存在两个外键分别参照老师表和学生表。
  • 一对一
    在开发过程中,一对一的关联关系在数据库中并不常见;因为以这种方式存储的信息通常会放在同一张表中。

接下来,我们来学习在一对多的关联关系中如果添加和删除数据。先准备一些测试数据,代码如下:

DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;

-- 创建班级表
CREATE TABLE class(
    cid int(4) NOT NULL PRIMARY KEY,
    cname varchar(30) 
);

-- 创建学生表
CREATE TABLE student(
    sid int(8) NOT NULL PRIMARY KEY,
    sname varchar(30),
    classid int(8) NOT NULL
);

-- 为学生表添加外键约束
ALTER TABLE student ADD CONSTRAINT fk_student_classid FOREIGN KEY(classid) REFERENCES class(cid);
-- 向班级表插入数据
INSERT INTO class(cid,cname)VALUES(1,'Java');
INSERT INTO class(cid,cname)VALUES(2,'Python');

-- 向学生表插入数据
INSERT INTO student(sid,sname,classid)VALUES(1,'tome',1);
INSERT INTO student(sid,sname,classid)VALUES(2,'lucy',1);
INSERT INTO student(sid,sname,classid)VALUES(3,'lili',2);
INSERT INTO student(sid,sname,classid)VALUES(4,'domi',2);

1 关联查询

查询Java班的所有学生 MySQL命令:

select * from student where classid=(select cid from class where cname='Java');

在这里插入图片描述

2 关于关联关系的删除数据

请从班级表中(主表)删除Java班级。在此,请注意:班级表和学生表之间存在关联关系;要删除Java班级,应该先删除学生表(从表)中与该班相关联的学生。否则,假若先删除Java班那么学生表中的cid就失去了关联。

删除Java班 MySQL命令:

delete from student where classid=(select cid from class where cname='Java');
delete from class where cname='Java';

在这里插入图片描述

十四 多表连接查询

1 交叉连接查询

交叉连接返回的结果是被连接的两个表中所有数据行的笛卡儿积;比如:集合A={a,b},集合B={0,1,2},则集合A和B的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。所以,交叉连接也被称为笛卡尔连接,其语法格式如下:

SELECT * FROM1 CROSS JOIN2;

在该语法中:CROSS JOIN用于连接两个要查询的表,通过该语句可以查询两个表中所有的数据组合。
由于这个交叉连接查询在实际运用中没有任何意义,所以只做为了解即可。

2 内连接查询

内连接(Inner Join)又称简单连接或自然连接,是一种非常常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较并列出与连接条件匹配的数据行,组合成新的记录。也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中。其语法格式如下:

SELECT 查询字段1,查询字段2, ... FROM1 [INNER] JOIN2 ON1.关系字段=2.关系字段

在该语法中:INNER JOIN用于连接两个表,ON来指定连接条件;其中INNER可以省略。

准备数据,代码如下:

-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;

-- 创建部门表
CREATE TABLE department(
  did int (4) NOT NULL PRIMARY KEY, 
  dname varchar(20)
);

-- 创建员工表
CREATE TABLE employee (
  eid int (4) NOT NULL PRIMARY KEY, 
  ename varchar (20), 
  eage int (2), 
  departmentid int (4) NOT NULL
);

-- 向部门表插入数据
INSERT INTO department VALUES(1001,'财务部');
INSERT INTO department VALUES(1002,'技术部');
INSERT INTO department VALUES(1003,'行政部');
INSERT INTO department VALUES(1004,'生活部');
-- 向员工表插入数据
INSERT INTO employee VALUES(1,'张三',19,1003);
INSERT INTO employee VALUES(2,'李四',18,1002);
INSERT INTO employee VALUES(3,'王五',20,1001);
INSERT INTO employee VALUES(4,'赵六',20,1004);

查询员工姓名及其所属部门名称 MySQL命令:

select employee.ename,department.dname from department inner join employee on department.did=employee.departmentid;

在这里插入图片描述

3 内连接查询

在使用内连接查询时我们发现:返回的结果只包含符合查询条件和连接条件的数据。但是,有时还需要在返回查询结果中不仅包含符合条件的数据,而且还包括左表、右表或两个表中的所有数据,此时我们就需要使用外连接查询。外连接又分为左(外)连接和右(外)连接。其语法格式如下:

SELECT 查询字段1,查询字段2, ... FROM1 LEFT | RIGHT [OUTER] JOIN2 ON1.关系字段=2.关系字段 WHERE 条件

由此可见,外连接的语法格式和内连接非常相似,只不过使用的是LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN关键字。其中,关键字左边的表被称为左表,关键字右边的表被称为右表;OUTER可以省略。
在使用左(外)连接和右(外)连接查询时,查询结果是不一致的,具体如下:

  • 1、LEFT [OUTER] JOIN 左(外)连接:返回包括左表中的所有记录和右表中符合连接条件的记录。
  • 2、RIGHT [OUTER] JOIN 右(外)连接:返回包括右表中的所有记录和左表中符合连接条件的记录。

先准备数据,代码如下:

-- 若存在数据库mydb则删除
DROP DATABASE IF EXISTS mydb;
-- 创建数据库mydb
CREATE DATABASE mydb;
-- 选择数据库mydb
USE mydb;

-- 创建班级表
CREATE TABLE class(
  cid int (4) NOT NULL PRIMARY KEY, 
  cname varchar(20)
);

-- 创建学生表
CREATE TABLE student (
  sid int (4) NOT NULL PRIMARY KEY, 
  sname varchar (20), 
  sage int (2), 
  classid int (4) NOT NULL
);
-- 向班级表插入数据
INSERT INTO class VALUES(1001,'Java');
INSERT INTO class VALUES(1002,'C++');
INSERT INTO class VALUES(1003,'Python');
INSERT INTO class VALUES(1004,'PHP');

-- 向学生表插入数据
INSERT INTO student VALUES(1,'张三',20,1001);
INSERT INTO student VALUES(2,'李四',21,1002);
INSERT INTO student VALUES(3,'王五',24,1002);
INSERT INTO student VALUES(4,'赵六',23,1003);
INSERT INTO student VALUES(5,'Jack',22,1009);

准备这组数据有一定的特点,为的是让大家直观的看出左连接与右连接的不同之处。
1、班级编号为1004的PHP班级没有学生
2、学号为5的学生王跃跃班级编号为1009,该班级编号并不在班级表中

3.1 左(外)连接查询

左(外)连接的结果包括LEFT JOIN子句中指定的左表的所有记录,以及所有满足连接条件的记录。如果左表的某条记录在右表中不存在则在右表中显示为空。
查询每个班的班级ID、班级名称及该班的所有学生的名字 MySQL命令:

select class.cid,class.cname,student.sname from class left outer join student on class.cid=student.classid;

运行效果展示:
在这里插入图片描述展示结果分析:
1、分别找出Java班、C++班、Python班的学生
2、右表的王跃跃不满足查询条件故其没有出现在查询结果中
3、虽然左表的PHP班没有学生,但是任然显示了PHP的信息;但是,它对应的学生名字为NULL

3.2 右(外)连接查询

右(外)连接的结果包括RIGHT JOIN子句中指定的右表的所有记录,以及所有满足连接条件的记录。如果右表的某条记录在左表中没有匹配,则左表将返回空值。
查询每个班的班级ID、班级名称及该班的所有学生的名字 MySQL命令:

select class.cid,class.cname,student.sname from class right outer join student on class.cid=student.classid;

运行效果展示:
在这里插入图片描述展示结果分析:
1、分别找出Java班、C++班、Python班的学生
2、左表的PHP班不满足查询条件故其没有出现在查询结果中
3、虽然右表的jack没有对应班级,但是任然显示王跃跃的信息;但是,它对应的班级以及班级编号均为NULL

十五 子查询

查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 SELECT、SELECT…INTO、INSERT…INTO等语句中。在执行查询时,首先会执行子查询中的语句,再将返回的结果作为外层查询的过滤条件。在子査询中通常可以使用比较运算符和IN、EXISTS、ANY、ALL等关键字。

准备数据,代码如下:

DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS class;

-- 创建班级表
CREATE TABLE class(
  cid int (4) NOT NULL PRIMARY KEY, 
  cname varchar(20)
);

-- 创建学生表
CREATE TABLE student (
  sid int (4) NOT NULL PRIMARY KEY, 
  sname varchar (20), 
  sage int (2), 
  classid int (4) NOT NULL
);

-- 向班级表插入数据
INSERT INTO class VALUES(1001,'Java');
INSERT INTO class VALUES(1002,'C++');
INSERT INTO class VALUES(1003,'Python');
INSERT INTO class VALUES(1004,'PHP');
INSERT INTO class VALUES(1005,'Android');

-- 向学生表插入数据
INSERT INTO student VALUES(1,'张三',20,1001);
INSERT INTO student VALUES(2,'李四',21,1002);
INSERT INTO student VALUES(3,'王五',24,1003);
INSERT INTO student VALUES(4,'赵六',23,1004);
INSERT INTO student VALUES(5,'小明',21,1001);
INSERT INTO student VALUES(6,'小红',26,1001);
INSERT INTO student VALUES(7,'小亮',27,1002);

1 带比较运算符的子查询

比较运算符前面我们提到过得,就是>、<、=、>=、<=、!=等
查询张三同学所在班级的信息 MySQL命令:

select * from class where cid=(select classid from student where sname='张三');

运行效果展示:
在这里插入图片描述查询比张三同学所在班级编号还大的班级的信息 MySQL命令:

select * from class where cid>(select classid from student where sname='张三');

在这里插入图片描述

2 带EXISTS关键字的子查询

EXISTS关键字后面的参数可以是任意一个子查询, 它不产生任何数据只返回TRUE或FALSE。当返回值为TRUE时外层查询才会执行。

假如王五同学在学生表中则从班级表查询所有班级信息 MySQL命令:

select * from class where exists (select * from student where sname='王五');

运行效果展示:
在这里插入图片描述

3 带ANY关键字的子查询

ANY关键字表示满足其中任意一个条件就返回一个结果作为外层查询条件。

查询比任一学生所属班级号还大的班级编号 MySQL命令:

select * from class where cid > any (select classid from student);

在这里插入图片描述

4 带ALL关键字的子查询

ALL关键字与ANY有点类似,只不过带ALL关键字的子査询返回的结果需同时满足所有内层査询条件。

查询比所有学生所属班级号还大的班级编号 MySQL命令:

select * from class where cid > all (select classid from student);

在这里插入图片描述

————————————————
版权声明:本文为CSDN博主「老赖的小弟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45851945/article/details/114287877

总结

重要(从关键字分析):
查询语句的书写顺序和执行顺序
select ===> from ===> where ===> group by ===> having ===> order by ===> limit
查询语句的执行顺序
from ===> where ===> group by ===> having ===> select ===> order by ===> limit

————————————————

参考:CSDN博主「老赖的小弟」的原创文章
原文链接:https://blog.csdn.net/weixin_45851945/article/details/114287877

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值