数据库-[mysql]--详细笔记+教程

不知道发什么笔记,有帮助就点个赞吧,求求了。
孩子赚点浏览量好难啊!!!
笔记有参考其他的,反正啥都看,跟着培训班的笔记来的,整理了一下逻辑。有参考了一些其他的笔记。后续复习应该还会更新,因为有的sql语句写的不够完全。
下次应该是JDBC 事务 然后会复习mybatis 吧!hibernate 看情况。

文章目录

一、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) 数据操作语言,用来操作数据库中表里的数据;常用语句:inserrt、 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.整数类型

数据类型 字节数 无符号数的取值范围 有符号数的取值范围
tinyInt 1 0-255 -128~127
smallInt 2 0-65535 -32768~32768
mediumInt 3 0~16777215 -8388608~8388608
Int 4 0~4294967295 -2147483648~ 2147483648
bigInt 5 0~18446744073709551615 -9223372036854775808~9223372036854775808

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

数据类型 字节数 无符号数的取值范围 有符号数的取值范围
float 4 -3.402823466E+38~-1.175494351E-38 0和1.175494351E-38~3.402823466E+38
double 8 -1.7976931348623157E+308~2.2250738585072014E-308 0和2.2250738585072014E-308~1.7976931348623157E+308
decimal M+2 -1.7976931348623157E+308~2.2250738585072014E-308 0和2.2250738585072014E-308~1.7976931348623157E+308

3.字符串类型

在MySQL中常用CHAR 和 VARCHAR 表示字符串。两者不同的是:VARCHAR存储可变长度的字符串。

当数据为CHAR(M)类型时,不管插入值的长度是实际是多少它所占用的存储空间都是M个字节;而VARCHAR(M)所对应的数据所占用的字节数为实际长度加1

插入值 CHAR(3) 存储需求 VARCHAR(3) 存储需求
‘’ ‘’ 3个字节 ‘’ 1个字节
‘a’ ‘a’ 3个字节 ‘a’ 2个字节
‘ab’ ‘ab’ 3个字节 ‘ab’ 3个字节
‘abc’ ‘ab’ 3个字节 ‘abc’ 4个字节
‘abcd’ ‘ab’ 3个字节 ‘abc’ 4字节

4.文本类型

数据类型 储存范围
TINYTEXT 0~255字节
TEXT 0~65535字节
MEDIUMTEXT 0~16777215字节
LONGTEXT 0~4294967295字节

5.日期与时间类型

数据类型 字节数 取值范围 日期格式 零值
year 1 1901~2155 YYYY 0000
date 4 1000-01-01~9999-12-31 YYYY-MM-DD 0000=00-00
time 3 -838:59:59~ 838:59:59 HH:MM:SS 00:00:00
dateTime 8 1000-01-01 00:00:00~9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 0000-00-00 00:00:00
timeStamp 4 1970-01-01 00:00:01~2038-01-19 03:14:07 YYYY-MM-DD HH:MM:SS 0000-00-00 00:00:00

(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。

(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()输人当前系统时间。

(3)dateTIme类型

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

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

(4)timeStamp类型

TIMESTAMP类型用于表示日期和时间,它的显示形式与DATETIME相同但取值范围比DATETIME小。在此,介绍几种TIMESTAMP类型与DATATIME类型不同的形式:

  1. 使用CURRENT_TIMESTAMP输人系统当前日期和时间。
  2. 输人NULL时系统会输人系统当前日期和时间。
  3. 无任何输人时系统会输入系统当前日期和时间。

6.二进制类型

在MySql中常用BLOB存储二进制类型的数据

数据类型 存储范围
tinyBlob 0~255字节
blob 0~65535字节
mediumBlob 0~16777215字节
longBlob 0~4294967295字节

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

1.数据库的基本操作

创建数据库: create database 数据库名称;
查看数据库基本信息:show create database 数据库名称;
删除数据库: drop database 数据库名称;
查看所有数据库: show databases;
修改数据库字符集:alter database 数据库名称 character set utf-8;
切换数据库命令:use 数据库名称;
查看当前使用的数据库 :select database;

2.数据表的基本操作

(1)创建数据表

创建表: create table 表名(字段1 字段类型,字段2 字段类型......);

(2)查看数据表

查看所有表 :show tables;

查看表的基本信息: show create table 表名;

查看表的字段信息:desc 表名;

(3)修改数据表

修改表名: alter table 表名 rename to 新表名;

修改字段名 :alter table 表名 change 字段名 新字段名 字段属性;

修改字段类型: alter table 表名 modify 字段名 新字段属性

增加字段: alter table 表名 add 新字段 新字段属性

删除字段 :alter table 表名 drop 字段名

(4)删除数据表

drop table 表名;


五、数据表的约束

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

以下约束条件针对表中字段进行限制,从而保证表中数据的这正确性和一致性,

约束条件 说明
primary key 主键约束用于唯一标识对应的记录
foreign key 外键约束
not null 非空约束
unque 唯一性约束
default 默认值约束,用于设置字段的默认值

1.主键约束

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

主键约束基本语法: 字段名 数据类型 primary key;

设置主键约束的两种方式

  1. create table student (id int primary key);
  2. create table student (id int , primary key (id));
    在这里插入图片描述

2.非空约束

非空约束即not null指的是字段到的值不能为空,

非空约束基本语法:字段名 数据类型 not null;
在这里插入图片描述

3.默认值约束

默认值约束即DEFAULT用于给数据表中的字段指定默认值,即当在表中插入一条新记录时若未给该字段赋值,那么,数据库系统会自动为这个字段插人默认值;

默认值约束语法:字段名 数据类型 default 默认值;

在这里插入图片描述

4.唯一性约束

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

唯一性约束语法:字段名 数据类型 unique;
在这里插入图片描述

5.外键约束

外键约束即foreign key常用于多张表之间的约束

基本语法:

  1. 创建数据表时指定:constraint 外键名 foreign key (从表外键字段) references 主表 (主键字段);

  2. 创建数据表后指定:alter table 表名 add constraint 外建名 foreign key(从表外键字段) references(主键字段);

(1)数据一致性概念

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

(2)删除外键

基本语法:alter table 从表名 drop foreign key 外键名;

(3)关于外键约束需要注意的细节

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

六、数据表插入数据

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

基本语法
insert into 表名 (字段名1,字段名2,....) values (值1,值2,.....)

insert into 表名 values(值1,值2.....)

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

同上

3.同时插入多条记录

基本语法:
insert into 表名 [(字段名1,字段名2,......)] values (值1,值2....),(值1,值2......),....;


七、更新数据

1.update基本语法

update 表名 set 字段名1=值1,字段名2=值2......[where 条件表达式]

2.update更新部分数据

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

3.update更新全部数据

举例:update student set age=18;


八、删除数据

1.delete基本语法

delete from 表名 [where 条件表达式];

2.delete删除部分数据

举例:delete from student where age=14;

3.delete删除全部数据

举例:delete from student;

4.truncate和delete的区别

  1. delete后可以跟where字句,可以通过where字句中的条件表达式只删除满足条件的部分记录;但是truncate语句只能用于删除表中的所有记录

  2. 使用truncate语句删除表中的数据后,在想表中添加记录时,自动增减字段的默认初始值重新由1开始;使用delete语句删除表中所有记录后,再次向表中添加记录时,自动增加字段的值为删除时该字段的最大值加1。

    人话:truncate是将整张表摧毁重建。表中数据会被清空和表结构的重建。delete form是逐行删除数据。truncate的效率更高。

  3. delete是DML语句。truncate是DDL语句。


九、MySQL数据表简单查询

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 * from student;

3.查询指定字段

select sid,sname from student;

4.常数的查询

在select中除了书写列名,还可以书写常数,用于标记。

常数的查询日期标记用于MySQL命令

select sid,sname,'gakki' from student;

在这里插入图片描述

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

注意:在select查询语句中distinct关键字只能用在第一个所查列名之前。

select distinct gender from student;

在这里插入图片描述

6.算数运算符

可以使用=-*\运算符

select name,age*10 from student;


十、函数

1.聚合函数

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

聚合函数使用规则

只有select和having字句,order by 字句中能使用聚合函数。例如; 在where子句中使用聚合函数是错误的。

(1)count()

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

  1. 查询表中有多少人 select count(*) from student;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ixTggAp-1642238240128)(https://secure2.wostatic.cn/static/njvrPYpPienm42WVhQvCXM/image.png)]

(2)max()

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

  1. 查询表中年级最大的学生select max(age) from student;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ejsJcDBV-1642238240129)(https://secure2.wostatic.cn/static/vhmegx1iyQjPa5eyqVtgR6/image.png)]

(3)min()

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

  1. 查询该学生表中年级最小的学生select min(age) from student;
    在这里插入图片描述

(4)sum()

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

  1. 查询学生表中年纪的总和 select sum(age) from student;

在这里插入图片描述

(5)avg()

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

  1. 查询年纪平均数 select avg(age) from student;
    在这里插入图片描述

2.其他常用函数

(1)时间函数

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)字符串函数

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

(3)数字函数

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


十一、条件查询

where和having

区别:

  1. where字句在group by分组和聚合函数之前对数据进行过滤
  2. HAVING子句对GROUP BY分组和聚合函数之后的数据行进行过滤

可以组合使用

1.使用关系运算符查询

关系运算符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于

select * fom student where age ≥ 16;

2.使用in关键字查询

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

  1. 查询sid为S_1002和S_1003的学生信息 MySQL命令:select * from student where sid in ('s_1002','s_1003');
    在这里插入图片描述

  2. 查询sid为s_1001以外的学生的信息:select * from student where sid not in ('s_1001');
    在这里插入图片描述

3.使用between and关键字查询

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

  1. 查询15到18岁的学生信息: select * from student where age between 15 and 18 ;
    在这里插入图片描述

  2. 查询不是15到18岁的学生信息 : select * from student where age not between 15 and 18;
    在这里插入图片描述

4.使用空值查询

在MySQL中,使用 IS NULL关键字判断字段的值是否为空值。请注意:空值NULL不同于0,也不同于空字符串

  1. 查询sname不为空值的学生信息 select * from student where sname is not null;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUJRS8cq-1642238240133)(https://secure2.wostatic.cn/static/LZnTNc8Yek1xq445X6cDw/image.png)]

5.使用and关键字查询

在MySQL中可使用AND关键字可以连接两个或者多个查询条件。

  1. 查询年纪大于15且性别为male的学生信息 select * from student where age>15 and gender='male';

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T8NJygYQ-1642238240133)(https://secure2.wostatic.cn/static/4fZU5JZA8YBKEqvhwwchEK/image.png)]

6.使用or关键字查询

在使用SELECT语句查询数据时可使用OR关键字连接多个査询条件。在使用OR关键字时,只要记录满足其中任意一个条件就会被查询出来

  1. 查询年纪大于15或者性别为male的学生信息 select * from student where age>15 or gender='male';

在这里插入图片描述

7.使用like关键字查询

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

(1)普通字符串

  1. 查询sname中与wang匹配的学生信息: select * from student where sname like 'wng';

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jz2JQ1es-1642238240134)(https://secure2.wostatic.cn/static/aD9mcLjDVMUzququNMZ4n6/image.png)]

(2)含有%通配的字符串

%用于匹配任意长度的字符串。例如,字符串“a%”匹配以字符a开始任意长度的字符串

  1. 查询学生姓名以li开始的记录 select * from student where sname like 'li%';

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sx6QtuVW-1642238240135)(https://secure2.wostatic.cn/static/eUqnafYxrwSfN3tjNPJmru/image.png)]

  2. 查询以g结尾的 select * from student where sname like '%g';
    在这里插入图片描述

  3. 查询包含s的 select * from student where sname like '%s%';

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EZt8GwLY-1642238240135)(https://secure2.wostatic.cn/static/oaDkZ4LjEbwvk9EKPNWXG6/image.png)]

(3)含有_通配的字符串

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

  1. 查询学生姓名以zx开头且长度为4的记录 select * from student where sname like 'zx__';

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfSPdrS5-1642238240136)(https://secure2.wostatic.cn/static/hNpuKwD6jdq1LwAv9iKena/image.png)]

  2. 查询学生姓名以g结尾且长度为4的记录 select * from student where sname like '____g';

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GaJ3B5zF-1642238240136)(https://secure2.wostatic.cn/static/nnA5wJaPnujbphNpsf12KV/image.png)]

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

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

  1. 查询学生表中年纪最小的3位同学 select * from student order by age limit 3;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uza1lRoc-1642238240136)(https://secure2.wostatic.cn/static/q7C5rKEyuaYa6ndz4rMhux/image.png)]

9.使用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);

(1)GROUP BY和聚合函数一起使用

  1. 统计各部门员工个数 select count(*), departmentnumber from employee group by departmentnumber;

在这里插入图片描述

  1. 统计部门编号大于1001的各部门员工个数 select count(*),departmentnumber from employee where departmentnumber>1001 group by departmentnumber;
    在这里插入图片描述

(2)GROUP BY和聚合函数以及HAVING一起使用

  1. 统计工资总和大于8000的部门 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[ASC | DESC],字段名2[ASC | DESC];

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

  1. 查询所有学生并按照年纪大小升序排列 select * from student order by age asc;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R38s7YTc-1642238240138)(https://secure2.wostatic.cn/static/ceC5Kkj9KBTXt2s8iv3JpS/image.png)]

  2. 查询所有学生并按照年纪大小降序排列 select * from student order by age desc;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OoZZxCp9-1642238240139)(https://secure2.wostatic.cn/static/hq7AfGXJ8XgHmpEAWQgkq7/image.png)]

11. group_concat

将group by产生的同一个分组中的值连接起来,返回一个字符串结果,也就是所谓的把多行转化为一行(也就是所谓的列转行,Oracle中对应wm_concat)

group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符']

![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6MXRfp7-1642238240139)(https://secure2.wostatic.cn/static/njDsBwm3Z2quKJV4VWZ6mz/image.png)\]](https://img-blog.csdnimg.cn/df7db4aa418a42c8908e5d624b95a53a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5rO96ZuF576O5L2g6ICB5amG,size_10,color_FFFFFF,t_70,g_se,x_16)
![\[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHjMT37B-1642238240140)(https://secure2.wostatic.cn/static/7AZxyESgYMxwR7kcVzSGme/image.png)\]](https://img-blog.csdnimg.cn/cf37f4ec196b49c6bf25ffe9716e2564.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5rO96ZuF576O5L2g6ICB5amG,size_14,color_FFFFFF,t_70,g_se,x_16)

12.case when用法

用法

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE
CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

案例

# 创建salary表:
create table salary(
id int,
name char(1),
sex char(1),
salary int
)engine myisam charset utf8;
 
#向salary表中插入数据:
insert into salary values
(1,'A','m',2500),
(2,'B','f',1500),
(3,'C','m',5500),
(4,'D','f',500);

示例一:在查询语句中实现更改salary表中员工的性别,即如果员工的性别是‘m’,则将其改为‘f’,反之如果性别为‘f’,则将其改为‘m’。

采用case when的第一种用法:

第一种


select id,name
case sex
when 'f' then 'm'
else 'f' 
end as new_sex from salary;

第二种


select id,name,case
when sex='f' then 'm'
else 'f' end as new_sex,salary from salary;

示例二:在查询语句中实现将salary表中员工的工资归类。归类依据是,工资在1000元以下的归为‘low’类,工资在1000-3000元范围归为‘middle’类,工资在3000元以上的归为‘high’类

select id,name,sex,case
when salary > 3000 then 'high'
when salary between 1000 and 3000 then 'middle'
else 'low' end as salary_level from salary;

select id,name,sex,case salary>3000
when True then 'high'
else 'low' end as salary_level from salary;

十二、别名设置

1.为表取别名

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

select * from 表名 [as] 别名 where.....;

2.为字段取别名

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

select 字段名1[as] 别名1,字段名2[as] 别名2,...... from 表名 where ...;


十三、表的关联关系

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

  1. 多对一

    多对一(亦称为一对多)是数据表中最常见的一种关系。例如:员工与部门之间的关系,一个部门可以有多个员工;而一个员工不能属于多个部门只属于某个部门。在多对一的表关系 中,应将外键建在多的一方否则会造成数据的冗余。

  2. 多对多

    多对多是数据表中常见的一种关系。例如:学生与老师之间的关系,一个学生可以有多个老师而且一个老师有多个学生。通常情况下,为了实现这种关系需要定义一张中间表(亦称为连接表)该表会存在两个外键分别参照老师表和学生表。

  3. 一对一

    在开发过程中,一对一的关联关系在数据库中并不常见;因为以这种方式存储的信息通常会放在同一张表中。

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.关联查询

  1. 查询Java班的所有学生 select from student where classid=(select cid form class where cname = 'java');

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUWUEfBP-1642238240140)(https://secure2.wostatic.cn/static/eHeftkW5ZGaoj4Hgnx5Nvz/image.png)]

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

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

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

    delete from class where cname = 'java';

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GxOODkWz-1642238240141)(https://secure2.wostatic.cn/static/rEutii5qvniBdA1kG6q4uS/image.png)]


十四、多表连接查询

1.交叉链接查询

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

select * from 表1 cross join 表2;

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5EJms8DK-1642238240141)(https://secure2.wostatic.cn/static/r6Ust2kptZ5sCrHJGJy9Um/image.png)]

2.内连接查询

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

select 查询字段1,查询字段2,......from 表1 [inner] join 表2 on 表1.关系字段=表2.关系字段

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

数据

-- 若存在数据库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,'一班');
INSERT INTO class VALUES(1002,'二班');
INSERT INTO class VALUES(1003,'三班');
INSERT INTO class VALUES(1004,'四班');
-- 向学生表插入数据
INSERT INTO student VALUES(1,'张三',19,1003);
INSERT INTO student VALUES(2,'李四',18,1002);
INSERT INTO student VALUES(3,'王五',20,1001);
INSERT INTO student VALUES(4,'赵六',20,1004);


  1. 查询学生姓名及其所属班级名称 select student.sname,class.cname from class inner join student on student.classid=class.cid;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LK22fkLD-1642238240142)(https://secure2.wostatic.cn/static/mzZkggn92tm2zjoLjSoHpa/image.png)]

3.外连接查询

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

SELECT 查询字段1,查询字段2, ... FROM 表1 LEFT | RIGHT [OUTER] JOIN 表2 ON 表1.关系字段=表2.关系字段 WHERE 条件

  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)左外链接查询

  1. 查询每个班的班级ID、班级名称及该班的所有学生的名字:select class.cid,class.cname,student.sname from class left join student on class.cid=student.classid;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6VT9UaCT-1642238240142)(https://secure2.wostatic.cn/static/24k4yKs3pydJf74EeehDKP/image.png)]

(2)右外链接查询

  1. 查询每个班的班级ID、班级名称及该班的所有学生的名字:select class.cid,class.cname,student.sname from student right join class on class.cid=student.classid;

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Za8OVZT3-1642238240142)(https://secure2.wostatic.cn/static/bYnRNRWVs8eLN6on21d9vT/image.png)]


十五、子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询;该查询语句可以嵌套在一个 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.带比较运算符的子查询

  1. 查询张三同学所在班级的信息 select * from calss where cid=(select classid from student where sname='张三');

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yY4gBjSi-1642238240143)(https://secure2.wostatic.cn/static/6h3oUJgUy6YS3PGoLsLA3J/image.png)]

  2. 查询比张三同学所在班级编号还大的班级的信息 select * from class where cid>(select classid from student where sname='张三' );

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0XdZBvZE-1642238240143)(https://secure2.wostatic.cn/static/7oTLgfb1HsBCVeCcxXipcJ/image.png)]

2.带exists关键字的子查询

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

  1. 假如王五同学在学生表中则从班级表查询所有班级信息 select * from class where exists (select * from student where sname='王五');

在这里插入图片描述

3.带any关键字的子查询

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

  1. 查询比任一学生所属班级号还大的班级编号 select * from class where cid > any (select classid from student);

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lXK20dq8-1642238240144)(https://secure2.wostatic.cn/static/rnfogDSrdkbVVsBim9JqUe/image.png)]

4.带all关键字的子查询

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

  1. 查询比所有学生所属班级号还大的班级编号 select * from class where cid > all (select classid from student);

在这里插入图片描述

十六、Mysql练习题

经典 50题目
这是我个人的笔记链接
sql练习

猜你喜欢

转载自blog.csdn.net/m0_56186460/article/details/122512980