mysql

1.数据库的概述

1.1程序当中数据库的概念

方式一:

程序运行时变量

java 复制代码
public String name....

方式二:

I/O流本地文件存储

方式三:

持久化手段:数据库存储

  1. 数据库是"按照数据结构来组织、存储和管理数据的仓库"。

  2. 是一个长期存储在计算机内、有组织、可共享的、统一管理的大量数据的集合()

  3. 数据库的具体体现就是磁盘的文件或者内存当中的数据

  4. 一种长期的存储手段,不主动删除数据不应该消失

1.2数据库的分类

①非关系型数据库

非关系型数据库并没有统一存储结构标准,现常见结构有键值、文档、JSON类型等,对高性能需求设计

灵活的数据模型:支持多种数据模型,例如键值对、文档型、列族型和图形数据库。

无固定的表结构:不需要预定义固定的表结构,适应非结构化或者半结构化数据。

高性能读写:少关系型,注重高性能读写能力,适用于大规模数据和高并发访问模型。

②关系型数据库

数据按照类别进行存储,每个类别存储到一个容器(表)中, 表和表之间可以建立关系,可以进行关联操作,性能相对一般

结构化数据模型:数据以表格形式存储,具有固定的结构。例如:学生和分数分别存储到不同的表

ACID事务:通过强大的事务支持,保证数据的原子性、一致性、隔离性和持久性。 例如:转账失败,钱不损失

丰富查询语句:支持SQL语句,能够进行复杂的关联数据查询。例如:查询学生以及学生的分数

数据一致性:数据的关系和约束确保数据的一致性和完整性。例如:存储学生数据,保证身份证号唯一且不为空

特点总结

关系型数据库适用于需要强一致性和复杂查询的场景。

非关系型数据库适用于需要高性能、灵活性和分布式处理的场景。

1.3数据库的选择

数据库选择总结:

  1. 绝大部分应用采用混合模式,二者结合使用

  2. 程序主体数据一般存储在关系型数据库(主)

  3. 程序缓存数据和高并发数据存储到非关系型数据库(辅)

  4. 本次课程讲解的是关系型数据库

1.4关系型数据库存储设计规则(E-R模型)

• 遵循 ER 模型
• E ( Entity ) 代表实体类别 , 关系型数据库中一类数据 , 对应数据库中的一张 ` 表 ` 存储
• R ( Relationship ) ` 表 ` 和 ` 表 ` 可以维护某种 ` 关系 `, 可以通过 ` 关系 ` 进行多表操做
• 模型解释
• 数据库中最大的存储单位为 ` `
• 每类数据存储一张 ` ` 中 , 表存储到 ` `
` ` 具有一些特性 ` ` , 这些特性 ` ` 定义数据在表中如何存储
` ` 中的数据是按照 ` ` 存储 , 一 ` ` 即为一条记录
• 对比总结

2.数据库管理系统安装

2.1数据库管理系统概述

数据库管理系统(DataBase Management System,DBMS)

指一种操作和管理数据库的大型软件,用户通过数据库管理系统操作数据库中的数据。

2.2****常见关系型数据库管理系统有哪些?

**2.3****数据库管理系统(MySQL)**安装

• 版本选择( 8+ or 5.7
MySQL 8 has numerous improvements over MySQL 5.7,Such as better performance, security, and new features. In addition, per Oracle's Lifetime Support policy, as of October 25, 2023, MySQL 5.7 Extended Support is ended, and it is now covered under Oracle Sustaining Support only. Hence, all MySQL 5.7 users are encouraged to migrate to MySQL 8.0 to start benefiting again from Premier Support.

MySQL 8相对于5.7带来了许多改进,包括更好的性能、安全性增强以及新功能的引入。Oracle的支持政策也在2023年10月25日结束了MySQL 5.7的扩展支持,目前只提供Sustaining Support(末期版本)。因此,强烈建议所有的MySQL 5.7用户尽快迁移到MySQL 8.0,以重新享受到首选支持。

•下载

•地址:https://dev.mysql.com/downloads/mysql/

•界面:

3.结构化查询语句(SQL)概述

3.1SQL:Structure Query Language。(结构化查询语言)

SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准,可以使用SQL命令进行关系型数据库操作。

SQL包括了所有对数据库的操作,主要是由数据定义、数据操纵、数据查询、数据控制、事务控制等SQL语言的使用规定组成。

基础跟重点:

  1. 创建和修改盛放数据的容器(数据定义DDL)

  2. 表中添加、修改、删除数据(数据操纵DML)

  3. 表中数据多条件查询(数据查询DQL)

扩展跟拔高:

  1. 事务启动、提交和回滚(事务控制TCL)

  2. 账号创建、权限控制(数据控制DCL)

扩展和拔高

3.2介绍SQL输入位置和基本命令:包含连接、退出、版本查询、以及注释等。

1.先打开cmd命令窗口

2.连接mysql服务命令

登录用户名>mysql -u <username> -p<password> -h <hostname> <databasename>

注意: 参数不分先后顺序

解释一下这些参数的含义:

-u <username>:用于指定你要连接的 MySQL 数据库的用户名。

-p<password>:表示密码,后面紧跟着密码,中间没有空格。如果你不希望在命令行中显示密码,可以不指定密码,直接 -p,然后在提示下手动输入密码。

-h <hostname>:用于指定 MySQL 服务器的主机名或者 IP 地址。如果 MySQL 在本地运行,可以用 localhost。

-P <port>:用于指定连接 MySQL 服务器的端口号,默认情况下是 3306。

<databasename>:是你要连接的数据库的名称。连接后会默认使用这个数据库。

3.其他基础SQL命令

SQL注释:

单行注释:#注释内容

单行注释:-- 注释内容 其中--后面的空格必须有

多行注释:/* 注释内容 */

版本和退出连接:

-- 查看版本,命令符号之间空格隔开,每条命令后使用;结束,否则不执行。切记!!

mysql>select version();

-- 退出连接

mysql> exit;

4.数据定义语言****DDL

4.1数据定义语言概述

一条数据的存储过程

在 MySQL 中,一个完整的数据存储过程总共有 4 步,分别:

数据库定义语句介绍:

数据定义语言(Data Definition Language)。

DDL 用于定义和管理数据库的结构,包括、索引、视图等数据库对象的创建、修改和删除。

DDL 不涉及对数据的操作,而是关注数据库的结构和元数据(容器)。

DDL 关键字:

CREATE**:** 用于创建数据库、表、索引、视图等。

•**ALTER:**用于修改数据库对象的结构,如修改表结构、添加列、删除列等。
• **DROP:**用于删除数据库对象,如删除表、删除索引等。

4.2SQL命名规定和规范

前置1标识符命名规

  1. 数据库名、表名不得超过30个字符,变量名限制为29个
  2. 必须只能包含 A--Z, a--z, 0--9, _共63个字符 ,而且不能数字开头
  3. 数据库名、表名、字段名等对象名中间 不能 包含空格
  4. 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名 https://dev.mysql.com/doc/refman/8.0/en/keywords.html
  5. 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使用`(着重号)引起来

前置2标识符命名规范(基于阿里巴巴规范手册)

  1. 注释应该清晰、简洁地解释 SQL 语句的意图、功能和影响。
  2. 库、 表 、列 名应该使用小写字母,并使用 下划线( _ ) 或驼峰命名法。
  3. 库、表、字段名 应该简洁明了,具有描述性,反映其所存储数据的含义。
  4. 库名应于对应的程序名一致 例如: 程序名为 EcommercePlatform 数据库名命名为 ecommerce_platform "
  5. 表命名最好是遵循 "业务名称_表 " 的作用 例如: alipay_task 、 force_project、 trade_config
  6. 列名应遵循"表实体 _ 属性"的作用 例如: product_name 或 productName

4.3数据定义语言之库管理

4.3.1创建数据库

创建库,必须指定库名,可能指定字符集或者排序方式

方式1:创建数据库,使用默认的字符集跟排序方式

sql 复制代码
CREATE DATABASE 数据库名;

方式2: 判断并创建默认字符集库(推荐)

sql 复制代码
CREATE DATABASE IF NOT EXISTS 数据库名;

**方式3:**创建指定字符集库或者排序方式

sql 复制代码
CREATE DATABASE  数据库名 CHARACTER SET 字符集;
CREATE DATABASE  数据库名 COLLATE  排序规则; 

方式4 **:**创建指定字符集和排序规则库

sql 复制代码
CREATE DATABASE  数据库名 CHARACTER SET 字符集 COLLATE  排序规则; 

基础和重点

MySQL8默认值**(不同版本可能会有不同)****:**

字符集:utf8mb4 是一种广泛支持各种语言字符的字符集。

排序规则:utf8mb4_0900_ai_ci 是一种不区分大小写的排序规则

sql 复制代码
# 查看默认字符集和排序方式命令
SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';

4.3.2 库管理:查看和使用库

使用和查看库,包括展示和切换库等命令

**方式一:**查看当前的所有库

sql 复制代码
SHOW DATABASES;

**方式二:**查看当前使用的库

sql 复制代码
SELECT  DATABASE();

方式三 **:**查看指定库下所有表

sql 复制代码
SHOW TABLES FROM 数据库名;;

方式四 **:**查看创建库的信息

sql 复制代码
SHOW CREATE DATABASE 数据库名;

方式五: 切换库/选中库

sql 复制代码
USE 数据库名;

注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作,先use库

基础ji重点

4.3.3库管理:修改库

方式1 :修改库编码字符集

sql 复制代码
ALTER DATABASE 数据库名 CHARACTER SET 字符集; # 修改字符集gbk utf8
ALTER DATABASE 数据库名 COLLATE 排序方式; #修改排序方式
ALTER DATABASE 数据库名 CHARACTER SET 字符集 COLLATE 排序方式; # 修改字符集和排序方式

注意:

DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删旧库完成的。

4.3.4****库管理:删除库

方式1 **:**直接删除库

sql 复制代码
DROP DATABASE 数据库名;

方式2:判断并删除库(推荐)

sql 复制代码
DROP DATABASE IF EXISTS 数据库名;

基础和基础和重点重点

4.4数据定义语言之表管理

4.4.1表管理:创建表

关键点1:表名、列名、类型必须填写,其他可选

关键点2:推荐使用if not exists,直接创建存在报错

关键点3:列之间使用,进行分割

关键点4:注释不是必须的,但是是很有必要的

sql 复制代码
CREATE TABLE [IF NOT EXISTS]  表名 ( 
     列名 类型 [列可选约束], 
     列名 类型 [列可选约束]  [COMMENT '列可选注释'], 
     列名 类型 [列可选约束]  [COMMENT '列可选注释'],
     列名 类型 [列可选约束]  [COMMENT '列可选注释'], 
     列名 类型 [列可选约束]  [COMMENT '列可选注释'],  #列之间使用,分割
    [列可选约束]
) [表可选约束] [COMMENT '表可选注释'];

4.4.2表管理:数据类型

MySQL支持多种数据类型,包括整数****、浮点数、****定点数、字符串、****日期时间等。

https://dev.mysql.com/doc/refman/8.0/en/data-types.html

1.整数

MySQL支持SQL标准整数类型 INTEGER (或 INT )和 SMALLINT 。作为标准的扩展,MySQL 还支持整数类型 TINYINT 、 MEDIUMINT 和 BIGINT 。下表显示了每种整数类型所需的存储和范围。

|-----------|------------|-------------|------------|------------|------------|
| 类型 | 存储(字节) | 最小值有符号 | 最小值无符号 | 最大值有符号 | 最大值无符号 |
| TINYINT | 1 | -128 | 0 | 127 | 255 |
| SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
| MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
| INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
| BIGINT | 8 | -263 | 0 | 263-1 | 264-1 |

注意:无符号==无负号,整数类型都可以添加unsigned 修饰符,添加以后对应列数据变成无负号类型,值从0开始!!

示例:

sql 复制代码
stu_age tinyint  unsigned COMMENT '年龄字段,tinyint类型,无符号值从0开始',

stu_age tinyint  COMMENT '年龄字段,tinyint类型,无符号值从-128开始', 

# unsigned 必须紧贴类型后放置

2.浮点数

FLOAT 和 DOUBLE 类型表示近似的数值数据值。MySQL 使用 4 个字节表示单精度值,使用 8 个字节表示双精度值。下表显示了每种类型所需的存储和范围。

|-------------|------------|----------------------------|----------------|
| 类型 | 存储(字节) | M**(小数****+整数位数) | D(小位数)** |
| FLOAT(M,D) | 4 | M最大为24 | D最大为8 |
| DOUBLE(M,D) | 8 | M最大为53 | D最大为30 |

**注意:**从 MySQL 8.0.17 开始,不推荐使用非标准 FLOAT(M,D) 语法 DOUBLE(M,D) ,未来版本中可能删除对它的支持。

支持unsigned修饰,添加修饰,只保留正值范围负值不会迁移到正值!

示例:

sql 复制代码
stu_height float(4,1)  unsigned COMMENT '身高,保留一位小数,多位会四舍五入', 

3.定点数

DECIMAL 类型存储精确的数值数据值。当需要保持精确精度时,例如货币数据,商品价格等等!

|--------------|------------|----------------------------|----------------|
| 类型 | 存储(字节) | M**(小数****+整数位数) | D(小位数)** |
| DECIMAL(M,D) | 动态计算 | M最大为65 | D最大为30 |

**注意:**DECIMAL 类型的存储空间是可变的,它的存储大小受 DECIMAL 数据类型定义时指定的精度和规模影响。

如果D小数位数为 0, DECIMAL 则值不包含小数点或小数部分。

4.字符串

CHAR和VARCHAR类型都可以存储比较短的字符串

|-------------------------|--------|--------|--------------------|-----------------------|
| 字符串**(文本)** | 特点 | 长度 | 长度范围(字符) | 存储空间 |
| CHAR(M) | 固定长度 | M | 0 <= M <= 255 | M*4个字节(utf8mb4) |
| VARCHAR(M) | 可变长度 | M | MySql一行数据最多65535字节 | (M*4+1) 个字节(utf8mb4) |

**注意:**CHAR(M) 类型一般需要预先定义字符串长度。如果不指定(M),则表示长度默认是1个字符。

保存数据的实际长度比CHAR类型声明的长度小,则会在右侧填充空格以达到指定的长度。

当MySQL检索CHAR类型的数据时,CHAR类型的字段会去除尾部的空格。

VARCHAR(M) 定义时,必须指定长度M,否则报错。

MySQL4.0版本以下,varchar(20):指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节);

MySQL5.0版本以上,varchar(20):指的是20字符。

检索VARCHAR类型的字段数据时,会保留数据尾部的空格。

通过显示将各种字符串值存储到 CHAR(4) and VARCHAR(4) 列的结果(假设使用单字节字符集,如 latin1 )说明 和 VARCHAR 之间的 CHAR 差异。

|---------|-------------|----------|----------------|----------|
| 插入值 | CHAR(4) | 所需存储 | VARCHAR(4) | 所需存储 |
| '' | ' ' | 4 bytes | '' | 1 byte |
| 'ab' | 'ab ' | 4 bytes | 'ab' | 3 bytes |
| 'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |

5. 讨论M

**前提:**在MySQL的设定中,单行数据最大能存储65535字节数据(注意:是一行非额外存储所有列总和且单位是字节)

**原因:**字符集为utf8mb4,每个字符占4个字节

字符串列需要1个额外字节空间记录是否为空

计算(65535-1)/ 4 = 16383.5 向下取余 16383,单列utf8mb4字符集类型最大字符限制16383

sql 复制代码
CREATE TABLE 表名 (  
    post_name  VARCHAR(16384) NOT NULL  
) ENGINE=INNODB CHARSET=utf8mb4;

错误代码: 1074
Column length too big for column 'post_name' (max = 16383); use BLOB or TEXT instead
sql 复制代码
CREATE TABLE 表名 (  
    post_name  VARCHAR(16000) NOT NULL, 
    post_name2  VARCHAR(384) NOT NULL  
) ENGINE=INNODB CHARSET=utf8mb4;

错误代码: 1118
Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

解决:在MySQL的设定中,单行数据最大能存储65535字节数据,但是TEXTBLOB类型不计算,他们属于额外存储!

这种场景可以使用TEXT进行某列类型替换即可!

6.文本类型

在MySQL中,TEXT用来保存文本类型的字符串,总共包含4种类型,分别为TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT 类型。

在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。这一点和 VARCHAR类型相同。

|-------------|-----------|------------------------|-----------------------|-----------------|
| 文本字符串类型 | 特点 | 长度**(字符)** | 存储范围(字节) | 占用的存储空间 |
| TINYTEXT | 小文本、可变长度 | L | 0 <= x <= 255 | L + 2 个字节 |
| TEXT | 文本、可变长度 | L | 0 <= x <= 65535 | L + 2 个字节 |
| MEDIUMTEXT | 中等文本、可变长度 | L | 0 <= x <= 16777215 | L + 3 个字节 |
| LONGTEXT | 大文本、可变长度 | L | 0 <= x<= 4294967295 | L + 4 个字节(最大4g) |

sql 复制代码
CREATE TABLE 表名(
      tx TEXT
);

开发经验:

短文本,固定长度使用char 例如:性别,手机号

短文本,非固定长度使用varchar 例如:姓名,地址

大文本,建议存储到文本文件,使用varchar记录文件地址,不使用TEXT,直接存储大文本,他性能非常较差!

7.时间类型

用于表示时态值的日期和时间数据类型为 DATE 、TIME、DATETIME、TIMESTAMP 和 YEAR 。每种类型都有一个有效值范围,换一种思路,可以理解时间类型就是`特殊格式的字符串`

|-----------|--------|--------|---------------------|---------------------|---------------------|
| 类型 | 名称 | 字节 | 日期格式 | 小值 | 最大值 |
| YEAR | 年 | 1 | YYYY或YY | 1901 | 2155 |
| TIME | 时间 | 3 | HH:MM:SS | -838:59:59 | 838:59:59 |
| DATE | 日期 | 3 | YYYY-MM-DD | 1000-01-01 | 9999-12-03 |
| DATETIME | 日期时间 | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
| TIMESTAMP | 日期时间 | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00 | 2038-01-19 03:14:07 |

**注意:**year类型赋00-99值对应年限,[00-69]对应[2000-2069],[70-99]对应[1970-1999],建议四位年值!

默认情况下,时间需要主动赋予默认值和修改值!

扩展:DATETIMETIMESTAMP类型自动初始化和更新

sql 复制代码
# 方式1: 插入默认当前时间和修改自动更新当前时间
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
# 方式2: 插入默认当前时间
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
dt DATETIME DEFAULT CURRENT_TIMESTAMP

数据类型总结

整数类型(Integer Types)

INT:范围为 -2147483648 到 2147483647。

TINYINT:范围为 -128 到 127。

SMALLINT:范围为 -32768 到 32767。

BIGINT:范围为 -9223372036854775808 到 9223372036854775807。

非整数****类型(Floating-Point Types)

FLOAT:单精度浮点数。

DOUBLE:双精度浮点数。

DECIMAL:固定精度十进制数。

字符串类型(String Types)

VARCHAR:可变长度的字符串。

CHAR:固定长度的字符串。

TEXT:较大的文本数据(最大4G)。

日期和时间类型(Date and Time Types**)**

DATE:日期值。

TIME:时间值。

DATETIME:日期和时间值。

TIMESTAMP:日期和时间值,具有特殊的自动更新功能。

YEAR:年份值。

4.2.3修改表

sql 复制代码
# 修改表,添加一列[可以指定X字段前或者后]
ALTER TABLE 表名 ADD 字段名 字段类型 【FIRST|AFTER 字段名】;
# 修改表,修改列名
ALTER TABLE 表名 CHANGE  原字段名 字段名  新字段类型 【FIRST|AFTER 字段名】;
# 修改表,修改列类型
ALTER TABLE 表名 MODIFY  字段名  新字段类型 【FIRST|AFTER 字段名】;
# 修改表,删除一列
ALTER TABLE 表名 DROP  字段名 ;

修改表名

sql 复制代码
# 修改表名
ALTER TABLE 表名 RENAME  [TO]  新表名;

5.DML:数据操作语言

理解:对于数据库中字段数据的操作(增删改查 - CRUD)

创建表

PRIMARY KEY 表示主键

auto_increment 表示自动增长

sql 复制代码
CREATE TABLE student(
  id int(3) PRIMARY KEY auto_increment,
  name VARCHAR(32),
  age int(3),
  sex VARCHAR(32),
  money FLOAT(8,2),
  course VARCHAR(32)
)

5.1删除数据

方式1:

**# 清空表的所有数据方式1

注意:清空后,再次添加,主键从之前的开始增长**

sql 复制代码
# 删除表

DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, ..., 数据表n];

方式2:

清空表的所有数据方式2
注意:清空后,再次添加,主键从1开始增长

sql 复制代码
# 清空表数据
TRUNCATE TABLE 表名;

经验:

1.推荐使用"清空表的所有数据方式2",因为主键不会重复,数据可以恢复

2.项目中不会把重要的数据删除,可以改变状态码来实现删除的业务(实际上就是改变某个状态码数据)

删除 + 单条件

sql 复制代码
DELETE from student WHERE money<18000;

删除 + 多条件

OR表示或者

AND表示并且

IN表示包含

sql 复制代码
DELETE from student WHERE age = 40 or sex = '女';
DELETE from student WHERE sex = '男' and age = 43;
DELETE from student WHERE age IN(30,40,43);

5.2修改数据

修改该字段上所有的数据

UPDATE 表名 SET 字段名 = 值;

sql 复制代码
UPDATE student SET money = 18000;

修改 + 单条件

sql 复制代码
UPDATE student SET money=15000 WHERE sex='男';

修改 + 多条件

sql 复制代码
UPDATE student set money = 20000 WHERE sex = '男' and age < 45;
UPDATE student SET money = 30000 WHERE sex = '男' OR age <50;
UPDATE student SET money = 50000 WHERE age in(110,45,43);

修改多个数据

sql 复制代码
UPDATE student SET age = 120,money = 66666 WHERE id = 1;

5.3查询数据

**SELECT**语句用于从数据库中查询数据,关键字的书写顺序一般如下:

sql 复制代码
SELECT [DISTINCT] column1, column2, ...
FROM table_name
[JOIN table_name2 ON join_condition]
[WHERE condition]
[GROUP BY column1, column2, ...]
[HAVING condition]
[ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
[LIMIT number];
  • 含义解释
    • SELECT:指定要查询的列。DISTINCT 可选,用于去除重复行。
    • FROM:指定要查询数据的表。
    • JOIN:可选,用于连接多个表,ON 后面跟连接条件。
    • WHERE:可选,用于筛选满足特定条件的行。
    • GROUP BY:可选,用于对结果进行分组。
    • HAVING:可选,用于对分组后的结果进行筛选。
    • ORDER BY:可选,用于对结果进行排序,ASC 为升序(默认),DESC 为降序。
    • LIMIT:可选,用于限制返回结果的数量。

查询所有字段

sql 复制代码
SELECT * from student;

查询指定字段

sql 复制代码
SELECT name, sex,age from student;

查询指定字段 + 别名

sql 复制代码
SELECT name '姓名',sex '性别', age '年龄' from student;

条件查询

sql 复制代码
SELECT * FROM student WHERE age>22;
SELECT * FROM student WHERE age<23 or age>29;
SELECT * FROM student WHERE age<25 AND sex='女';
SELECT * FROM student WHERE age IN(35,45);

5.3.1去重distinct

语法:

复制代码
SELECT DISTINCT 列名称 FROM 表名称
需求:查询出学科
sql 复制代码
SELECT DISTINCT course from student;

5.3.2模糊查询like

% 表示没有或多个任意字符

**_**表示一个任意字符

sql 复制代码
# 需求:查询出姓名中带'遥'的学生信息
SELECT * from student WHERE name LIKE '%遥%'; 
# 需求:查询出姓名中第二个字带'遥'的学生信息
SELECT * from student WHERE name LIKE '_遥%'; 

5.3.3排序查询ORDER BY

ASC 表示升序(默认)

DESC 表示降序

sql 复制代码
# 需求:按照年龄排序(升序)
SELECT * from student ORDER BY age ASC;
# 需求:按照年龄排序(降序)
SELECT * from student ORDER BY age DESC;
# 需求:按照年龄排升序,年龄一致按照工资排降序
SELECT * from student ORDER BY age ,course DESC;

5.3.4分页查询 LIMT

1.普通限制查询

SELECT * from 表名 ORDER BY 排序字段名 排序方式 LIMIT 数据条数;

sql 复制代码
# 需求:查询出工资排在前三名的学生信息
SELECT * from student ORDER BY money DESC LIMIT 3;

2.分页查询

SELECT * from 表名 ORDER BY 排序字段名 排序方式 LIMIT 偏移量,数据条数;

SELECT * FROM student LIMIT 偏移量,获取条数;

分页公式:SELECT * FROM student LIMIT (页数-1)*获取条数,获取条数;

sql 复制代码
# 分页查询
# SELECT * FROM student LIMIT 偏移量,获取条数;
# 分页公式:SELECT * FROM student LIMIT (页数-1)*获取条数,获取条数;
SELECT * from student LIMIT 0,5;
SELECT * from student LIMIT 5,5;

5.3.5 操作符BETWEEN

操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

语法:

sql 复制代码
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2

5.4多表查询

老师表:

学生表:

1.内连接(2张表的交集)

理解:查询出多张表有关联的数据

sql 复制代码
SELECT s.name,t.name from student01 s,teacher01 t WHERE s.t_id = t.id;

查询结果

2.左连接

理解:针对于左边表的数据进行查询(左边表里的数据都在查询结果内)

sql 复制代码
SELECT s.name,t.name from student01 s LEFT JOIN teacher t on s.t_id = t.id;

查询结果

3.右连接

针对于右边表的数据进行查询(右边表里的数据都在查询结果内)

sql 复制代码
SELECT s.name,t.name from student01 s RIGHT JOIN teacher t on s.t_id = t.id;

查询结果:

4.全连接

**理解:**所有表里的数据都查询出来

合并查询结果:

sql 复制代码
SELECT s.name,t.name from student01 s LEFT JOIN teacher01 t on s.t_id = t.id
UNION ALL 
SELECT s.name,t.name from student01 s RIGHT JOIN teacher01 t on s.t_id = t.id;

查询结果:

注意:MySQL没有全连接的查询命令,要想在MySQL中实现全连接的思想,就用合并+去重

sql 复制代码
SELECT s.name,t.name from student01 s LEFT JOIN teacher01 t on s.t_id = t.id
UNION
SELECT s.name,t.name from student01 s RIGHT JOIN teacher01 t on s.t_id = t.id;

查询结果

6.函数

6.1.聚合函数

聚合函数用于对一组值进行计算,并返回一个单一的值。常见的聚合函数有 COUNTSUMAVGMAXMIN

1.COUNT

  • 功能:用于统计记录的数量。
  • 语法
sql 复制代码
COUNT(*);  -- 统计所有记录的数量
COUNT(column_name);  -- 统计指定列非 NULL 值的数量
  • 示例
sql 复制代码
-- 统计 students 表中的记录数量
SELECT COUNT(*) FROM students;
-- 统计 students 表中 age 列非 NULL 值的数量
SELECT COUNT(age) FROM students;

2.SUM

  • 功能:用于计算指定列值的总和。
  • 语法
sql 复制代码
SUM(column_name);
  • 示例
sql 复制代码
-- 计算 orders 表中 amount 列的总和
SELECT SUM(amount) FROM orders;

3.AVG

  • 功能:用于计算指定列值的平均值。
  • 语法
sql 复制代码
AVG(column_name);
  • 示例
sql 复制代码
-- 计算 scores 表中 score 列的平均值
SELECT AVG(score) FROM scores;

4.MAX

  • 功能:用于返回指定列中的最大值。
  • 语法
sql 复制代码
MAX(column_name);
  • 示例
sql 复制代码
-- 查找 products 表中 price 列的最大值
SELECT MAX(price) FROM products;

5.MIN

  • 功能:用于返回指定列中的最小值。
  • 语法
sql 复制代码
MIN(column_name);
  • 示例

    -- 查找 employees 表中 salary 列的最小值
    SELECT MIN(salary) FROM employees;

6.2. 字符串函数

字符串函数用于处理字符串数据。常见的字符串函数有 CONCATSUBSTRINGUPPERLOWERLENGTH

1.CONCAT

  • 功能:用于将多个字符串连接成一个字符串。
  • 语法
sql 复制代码
CONCAT(string1, string2, ...);
  • 示例
sql 复制代码
-- 将 first_name 和 last_name 列的值连接成一个完整的姓名
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;

2.SUBSTRING

  • 功能:用于截取字符串的一部分。
  • 语法
sql 复制代码
SUBSTRING(string, start_position, length);
  • 示例
sql 复制代码
-- 截取 product_name 列中从第 3 个字符开始的 5 个字符
SELECT SUBSTRING(product_name, 3, 5) FROM products;

3.UPPER

  • 功能:用于将字符串转换为大写。
  • 语法
sql 复制代码
UPPER(string);
  • 示例
sql 复制代码
-- 将 city 列的值转换为大写
SELECT UPPER(city) FROM customers;

4.LOWER

  • 功能:用于将字符串转换为小写。
  • 语法
sql 复制代码
LOWER(string);
  • 示例
sql 复制代码
-- 将 email 列的值转换为小写
SELECT LOWER(email) FROM users;

5.LENGTH

  • 功能:用于返回字符串的长度。
  • 语法
sql 复制代码
LENGTH(string);
  • 示例
sql 复制代码
-- 计算 product_name 列中每个字符串的长度
SELECT LENGTH(product_name) FROM products;

6.3. 日期和时间函数

日期和时间函数用于处理日期和时间数据。常见的日期和时间函数有 NOWDATE_FORMATYEARMONTHDAY

1.NOW

  • 功能:用于返回当前的日期和时间。
  • 语法
sql 复制代码
NOW();
  • 示例

    -- 获取当前的日期和时间
    SELECT NOW();

2.DATE_FORMAT

  • 功能:用于将日期或时间格式化为指定的字符串。

  • 语法

    DATE_FORMAT(date, format);

  • 示例

sql 复制代码
-- 将 order_date 列的值格式化为 'YYYY-MM-DD' 的字符串
SELECT DATE_FORMAT(order_date, '%Y-%m-%d') FROM orders;

3.YEAR

  • 功能:用于返回日期中的年份。
  • 语法
sql 复制代码
YEAR(date);
  • 示例
sql 复制代码
-- 提取 order_date 列中的年份
SELECT YEAR(order_date) FROM orders;

4.MONTH

  • 功能:用于返回日期中的月份。
  • 语法
sql 复制代码
MONTH(date);
  • 示例
sql 复制代码
-- 提取 order_date 列中的月份
SELECT MONTH(order_date) FROM orders;

5.DAY

  • 功能:用于返回日期中的天数。
  • 语法
sql 复制代码
DAY(date);
  • 示例
sql 复制代码
-- 提取 order_date 列中的天数
SELECT DAY(order_date) FROM orders;

6.4. 条件函数

条件函数用于根据条件返回不同的值。常见的条件函数有 CASEIF(部分数据库支持)。

1.CASE

  • 功能 :用于根据不同的条件返回不同的值,类似于编程语言中的 if-else 语句。
  • 语法
sql 复制代码
-- 简单 CASE 函数
CASE expression
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ...
    ELSE default_result
END;

-- 搜索 CASE 函数
CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE default_result
END;
  • 示例
sql 复制代码
-- 简单 CASE 函数示例
SELECT 
    product_id,
    price,
    CASE category
        WHEN '电子产品' THEN '高利润'
        WHEN '日用品' THEN '低利润'
        ELSE '未知利润'
    END AS profit_level
FROM 
    products;

-- 搜索 CASE 函数示例
SELECT 
    employee_id,
    salary,
    CASE
        WHEN salary < 5000 THEN '低薪'
        WHEN salary >= 5000 AND salary < 10000 THEN '中等薪资'
        WHEN salary >= 10000 THEN '高薪'
        ELSE '未知'
    END AS salary_level
FROM 
    employees;

2.IF

  • 功能:用于根据条件返回不同的值。
  • 语法
sql 复制代码
IF(condition, value_if_true, value_if_false);
  • 示例
sql 复制代码
-- 如果 score 大于等于 60,则返回 '及格',否则返回 '不及格'
SELECT 
    student_id,
    score,
    IF(score >= 60, '及格', '不及格') AS result
FROM 
    scores;

6.5. 数学函数

数学函数用于进行数学计算。常见的数学函数有 ROUNDCEILFLOORABS

1.ROUND

  • 功能:用于对数值进行四舍五入。
  • 语法
sql 复制代码
ROUND(number, decimal_places);
  • 示例
sql 复制代码
-- 将 price 列的值四舍五入到小数点后 2 位
SELECT ROUND(price, 2) FROM products;

2.CEIL

  • 功能:用于返回大于或等于指定数值的最小整数。
  • 语法
sql 复制代码
CEIL(number);
  • 示例
sql 复制代码
-- 返回 3.2 的最小整数
SELECT CEIL(3.2);  -- 4

3.FLOOR

  • 功能:用于返回小于或等于指定数值的最大整数。
  • 语法
sql 复制代码
FLOOR(number);
  • 示例
sql 复制代码
-- 返回 3.8 的最大整数
SELECT FLOOR(3.8); --3

4.ABS

  • 功能:用于返回指定数值的绝对值。
  • 语法
sql 复制代码
ABS(number);
  • 示例
sql 复制代码
-- 返回 -5 的绝对值
SELECT ABS(-5); --5

7.sql执行顺序

在 SQL 中,一个完整的查询语句通常包含多个子句,这些子句在执行时有特定的顺序。以下是 SQL 查询语句中主要子句的执行顺序:

1. FROM

  • 作用:FROM 子句用于指定要查询数据的表或视图。它是 SQL 查询执行的起点,数据库系统首先会根据 FROM 子句中指定的表或视图来确定数据的来源。
  • 示例
sql 复制代码
SELECT *
FROM employees;

在这个例子中,数据库会先找到 employees 表,以此作为数据的来源。

2. JOIN

  • 作用:如果查询中使用了 JOIN 操作,它会在 FROM 之后执行。JOIN 用于将多个表中的数据根据指定的条件进行连接,组合成一个结果集。
  • 示例
sql 复制代码
SELECT *
FROM employees
JOIN departments ON employees.department_id = departments.department_id;

这里数据库会根据 employees 表和 departments 表的 department_id 字段进行连接操作。

3. WHERE

  • 作用:WHERE 子句用于过滤数据,它会对 FROM 和 JOIN 操作后得到的结果集进行筛选,只保留满足指定条件的行。
  • 示例
sql 复制代码
SELECT *
FROM employees
WHERE salary > 5000;

数据库会从 employees 表中筛选出 salary 大于 5000 的记录。

4. GROUP BY

  • 作用:GROUP BY 子句用于将结果集按照指定的列进行分组。分组后可以对每个组进行聚合操作。
  • 示例
sql 复制代码
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

数据库会将 employees 表中的记录按照 department_id 进行分组,然后计算每个组的平均工资。

5. HAVING

  • 作用:HAVING 子句用于对分组后的结果进行过滤,它和 WHERE 子句类似,但 WHERE 是在分组前过滤行,而 HAVING 是在分组后过滤组。
  • 示例
sql 复制代码
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 6000;

这里会筛选出平均工资大于 6000 的部门组。

6. SELECT

  • 作用:SELECT 子句用于指定要返回的列。在前面的操作完成后,数据库会根据 SELECT 子句的要求从结果集中选择相应的列。
  • 示例
sql 复制代码
SELECT employee_id, first_name, last_name
FROM employees;

数据库会从 employees 表中选择 employee_idfirst_namelast_name 列。

7. DISTINCT

  • 作用:如果使用了 DISTINCT 关键字,它会在 SELECT 之后执行,用于去除结果集中的重复行。
  • 示例
sql 复制代码
SELECT DISTINCT department_id
FROM employees;

这里会返回 employees 表中不同的 department_id 值。

8. ORDER BY

  • 作用:ORDER BY 子句用于对结果集进行排序,可以按照指定的列升序或降序排列。
  • 示例
sql 复制代码
SELECT *
FROM employees
ORDER BY salary DESC;

数据库会将 employees 表的记录按照 salary 列降序排列。

9. LIMIT/OFFSET(不同数据库中名称可能不同)

  • 作用:LIMIT 用于限制返回结果集的行数,OFFSET 用于指定从哪一行开始返回结果。这两个子句通常用于分页查询。
  • 示例
sql 复制代码
SELECT *
FROM employees
LIMIT 10 OFFSET 20;

这里会从第 21 行开始返回 10 条记录。

总结一下,SQL 查询的执行顺序大致为:FROM -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT/OFFSET 。理解这个执行顺序有助于编写更高效和准确的 SQL 查询。

相关推荐
不辉放弃2 分钟前
SQL 外键(Foreign Key)详细讲解
数据库·sql·oracle
Direct_Yang1 小时前
MySQL安装实战分享
数据库·mysql
山海青风1 小时前
微信小程序实战案例 - 餐馆点餐系统 阶段 3 - 下单 & 云数据库
数据库·微信小程序·小程序·腾讯云
L73S373 小时前
MySQL数据类型
mysql·考研·学习方法
Arbori_262154 小时前
Oracle 排除交集数据 MINUS
数据库·oracle
yzhSWJ4 小时前
MySQL 中查询 VARCHAR 类型 JSON 数据的
mysql·adb·json
java1234_小锋7 小时前
MySQL中有哪几种锁?
数据库·mysql
Charlie__ZS8 小时前
Redis-事务
数据库·redis·缓存
Charlie__ZS8 小时前
Redis-数据类型
数据库·redis·缓存