【关系型数据库SQL】MySql数据库基础学习(一)
目录
数据库基本概念
关系型数据库
非关系型数据库
对比总结表
MySql基础
MySQL简介
MySQL特点
MySQL分类
MySql的安装
连接MySQL
SQL语言介绍
SQL 能做什么?
SQL 标准
SQL语言分类
创建删除数据库
MySQL中的数据类型
整数类型
浮点类型
字符类型
日期类型
二进制数据(BLOB)
创建表和删除表
修改表
修改表名:
修改列名
修改列类型
添加新列
删除指定列
MySQL中的约束
添加主键约束
删除主键约束
添加外键约束
删除外键约束
编辑
添加唯一性约束
删除唯一性约束
添加非空约束
删除非空约束
创建表时添加约束
Select基本查询数据操作
MySQL中使用列别名
MySQL中使用表别名
除去相同的行
查询中的行选择
查询中的算时表达式
MySQL中的比较条件
其他比较条件
BETWEEN条件
IN条件
LIKE条件
NULL条件
逻辑条件
MySQL中的优先规则
ORDER_BY排序
综合小练习:
数据库基本概念
数据库基本概念主要包括:数据,数据库,数据库管理系统,数据库应用程序,数据库管理员等几个方面
数据
数据(Data)是指对客观事物进行描述并可以鉴别的符号,这些符号是可识别的、抽象的。它不仅指狭义上的数字,而是有多种表现形式:字母、文字、文本、图形、音频、视频等。
数据库
数据库是数据管理的有效技术,是由一批数据构成的有序集合,这些数据被存放在结构化的数据表里。数据表之间相互关联,反映客观事物间的本质联系。
数据库管理系统
数据库管理系统(Database Management System,DBMS)是用来定义和管理数据的软件。
数据库应用程序
数据库应用程序(Database Application System,DBAS)是在数据库管理系统基础上,使用数据库管理系统的语法,开发的直接面对最终用户的应用程序。
数据库管理员
数据库管理员(Database Administrator,DBA)是指对数据库管理系统进行操作的人员,其主要负责数据库的运营和维护。
关系型数据库
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。可以采用结构化查询语言(SQL)对数据库进行操作。
核心特征:
- 以表的形式存储数据: 数据被存储在由行和列组成的二维表中。
- 行: 代表一条记录(例如,一个特定用户的所有信息)。
- 列: 代表一个字段或属性(例如,用户的姓名、年龄、邮箱)。
- 预定义的模式: 在存入数据之前,必须严格定义表的结构(即有哪些列,每列的数据类型是什么,如整数、字符串、日期等)。结构一旦定义,不易更改。
- SQL: 使用结构化查询语言 进行数据的操作和查询。SQL是强大且标准化的语言,适合执行复杂的连接查询和事务操作。
- ACID 事务: 强调事务的四大特性,保证数据的可靠性和一致性。
- A - 原子性: 事务中的所有操作要么全部完成,要么全部不完成。
- C - 一致性: 事务必须使数据库从一个一致性状态变换到另一个一致性状态。
- I - 隔离性: 并发执行的事务之间互不干扰。
- D - 持久性: 事务完成后,对数据的修改是永久性的。
- 表与表之间的关系: 通过主键和外键来建立表与表之间的关联(如一对一、一对多、多对多),这也是“关系型”名称的由来。
常见代表:
- MySQL: 最流行的开源关系型数据库,广泛应用于Web应用。
- PostgreSQL: 功能强大的开源数据库,支持更复杂的数据类型和操作。
- Oracle Database: 大型商业数据库,常用于大型企业级应用。
- Microsoft SQL Server: 微软的商业数据库产品。
- SQLite: 轻量级的文件数据库,常用于移动应用和桌面应用。
优点:
- 易于维护:都是使用表结构,格式一致;
- 使用方便:SQL语言通用,可用于复杂查询;
- 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
- 读写性能比较差,尤其是海量数据的高效率读写;
- 固定的表结构,灵活度稍欠;
- 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
非关系型数据库
非关系型数据库也称之为NoSQL数据库,是一种数据结构化存储方法的集合,可以是文档或者键值对等。
核心特征:
- 无固定模式: 不需要预先定义结构。每条记录可以有完全不同的结构字段,非常灵活,适合快速迭代和变化的需求。
- 不使用SQL: 通常有自己特有的查询语法或API。
- 分布式设计: 通常为分布式、水平扩展而设计,能更容易地处理海量数据和高并发请求。
- 淡化ACID: 通常遵循 BASE 理论,强调可用性和性能,在某些方面放宽了对一致性的严格要求。
- Basically Available(基本可用)
- Soft state(软状态)
- Eventual consistency(最终一致性)
- 多种数据模型: 根据不同的应用场景,采用了不同的数据存储方式。
主要类型和代表:
- 文档型数据库: 将数据存储为类似JSON的文档。
- 代表:MongoDB, CouchDB
- 适用场景: 内容管理系统、用户配置文件、日志数据。
- 键值型数据库: 通过简单的“键”来存取“值”。
- 代表:Redis, Amazon DynamoDB
- 适用场景: 会话存储、缓存、购物车、配置信息。
- 列族数据库: 将数据存储在列族中,适合大量写入和分析。
- 代表:Apache Cassandra, HBase
- 适用场景: 日志记录、时间序列数据、大数据分析。
- 图数据库: 使用图结构(节点、边、属性)来存储数据,专注于数据之间的关系。
- 代表:Neo4j, Amazon Neptune
- 适用场景: 社交网络、推荐系统、欺诈检测、知识图谱。
优点:
- 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
- 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
- 高扩展性;
- 成本低:nosql数据库部署简单,基本都是开源软件。
缺点:
- 不提供sql支持,学习和使用成本较高;
- 无事务处理;
- 数据结构相对复杂,复杂查询方面稍欠。
对比总结表
特性 | 关系型数据库 | 非关系型数据库 |
---|---|---|
数据模型 | 基于表,结构固定 | 多样(文档、键值、图、列族),灵活 |
模式 | 严格,需预定义 | 灵活或无模式,可动态添加字段 |
查询语言 | SQL | 因数据库而异,无统一标准 |
扩展性 | 通常垂直扩展(升级服务器硬件) | 通常水平扩展(增加更多服务器节点) |
事务 | 强ACID,保证强一致性 | 通常遵循BASE,追求最终一致性 |
主要优势 | 结构化数据、复杂查询、数据完整性 | 大数据量、高吞吐、高可扩展性、灵活结构 |
适用场景 | 会计系统、传统ERP/CRM、需要复杂事务的系统 | 社交媒体、物联网、内容管理、实时推荐、缓存 |
MySql基础
MySQL简介
MySQL 是当前世界上最流行、应用最广泛的开源关系型数据库管理系统(RDBMS)之一。它由瑞典公司 MySQL AB 开发,后来被 Sun Microsystems 收购,最终 Sun 又被 Oracle(甲骨文)收购,所以现在它属于 Oracle 旗下产品。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL特点
- 开源且免费:社区版(MySQL Community Server)是免费使用的,这也是其能够快速普及的重要原因。同时也提供付费的企业版,提供额外的功能和技术支持。
- 关系型数据库:严格遵守关系型数据库的原则,使用表、行、列的结构化方式来存储数据,支持 SQL(结构化查询语言)进行数据操作和管理。
- 高性能:以其快速的读取速度、稳定性和易用性而闻名。经过多年的优化,能够处理大量数据和高并发访问。
- 跨平台:可以在多种操作系统上运行,包括 Linux、Windows、macOS 等。
- 可靠性高:支持 ACID 事务(原子性、一致性、隔离性、持久性),确保了数据的完整性和一致性,适合处理重要数据。
- 易于使用:安装、配置和学习曲线相对平缓,拥有丰富的文档和庞大的社区支持。
- 强大的生态系统:拥有大量的图形化管理工具(如 MySQL Workbench、phpMyAdmin)、连接驱动和第三方集成。
MySQL分类
Mysql主要分为社区版和企业版。
社区版是完全开源免费的,社区版也支持多种数据类型和标准的SQL查询语言,能够对数据进行各种查询、增加、删除、修改等操作,所以一般情况下社区版就可以满足开发需求了。
企业版是收费的。即使在开发中需要用到一些付费的附加功能,价格相对于昂贵的 Oracle、DB2等也是有很大优势的。对数据库可靠性要求比较高的企业可以选择企业版。
MySql的安装
MySQL的官网地址:mysql.com
①:先进入官网:
②:找到下载区域
③:下载mysql指定版本
④:配置Mysql Install,安装Mysql
上述方法比较复杂,细节没有处理到位容易配置失败,我们还有其他方法安装MySQL,那就是通过小皮面板集成工具来安装。
小皮面板官网:https://m.xp.cn/
下载好后,直接启动MySQL5.7就行【注意,安装路径不要带有空格和中文】
如果出现启动失败的情况,大概率是你的电脑安装过MySQL数据库,此时需要卸载之前安装的MySQL数据库:
停止MySQL服务
卸载 MySQL 程序:进入控制面板,找到并卸载MySQL,如果有多个 MySQL 相关组件,逐一卸载(例如 MySQL Server、MySQL Workbench等)
删除残留文件
- 打开 MySQL 的安装目录,默认路径通常为
C:\Program Files\MySQL
或C:\Program Files (x86)\MySQL
,删除整个 MySQL 文件夹- 打开 MySQL 的数据目录,默认路径为
C:\ProgramData\MySQL
(ProgramData 是隐藏文件夹,需启用“显示隐藏文件”),删除 MySQL 文件夹卸载MySQL并删除残留文件后,小皮即可正常启动MySQL
连接MySQL
之前我们安装的叫做MySQL服务端,要想使用MySQL服务,我们需要使用一个客户端连接MySQL服务端进行使用,我们先来介绍使用MySQL自带的客户端连接MySQL:
找到MySQL的安装路径:
小皮安装路径\MySQL5.7.26\bin
在该路径输入cmd进入命令窗口
登录MySQL
mysql -u 用户名 -p 密码
查看MySQL中的所有数据库
show databases;
使用Navicat连接MySQL数据库
Navicat图形界面 | 功能全面的数据库管理工具
Navicat是一款功能强大的多连接数据库管理工具(GUI),旨在简化数据库的管理与开发工作。它支持多种主流数据库和云服务,并提供直观的图形界面,使得专业开发人员和初学者都能高效安全地进行数据操作。
核心功能
- 多数据库支持:可连接和管理多种数据库系统,包括MySQL、Oracle、PostgreSQL、SQLite、SQL Server、MariaDB、MongoDB以及Redis等。
- 跨平台与云兼容:支持Windows、macOS和Linux操作系统,并能与多种云数据库服务兼容,如阿里云、腾讯云、华为云、Amazon RDS、Microsoft Azure等。
- 数据操作与管理:
- SQL开发:提供强大的SQL编辑器,支持代码补全、语法高亮、错误检查和脚本调试。
- 数据传输与同步:支持在不同数据库之间迁移数据,并进行数据同步和结构同步。
- 导入与导出:支持多种格式的数据导入导出,如CSV、Excel、JSON等。
- 备份与还原:提供数据库备份和恢复功能,确保数据安全。
- 高级工具:
- 数据建模:通过Navicat Data Modeler工具进行概念、逻辑和物理数据模型设计,支持正向和逆向工程。
- 任务自动化:支持创建计划任务,自动运行SQL脚本和批处理作业。
- 报表创建:Navicat Report Viewer可用于浏览和分享报表文件。
点击测试连接后,如果连接成功,直接点击确定就可以了,若连接失败,则应该是在配置MySQL时端口号或者用户名密码没有匹配成功。
SQL语言介绍
结构化查询语言(Structured Query Language)简称 SQL(发音:sequal['si:kwəl]),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL 能做什么?
- SQL 面向数据库执行查询
- SQL 可在数据库中插入新的记录
- SQL 可更新数据库中的数据
- SQL 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表
- SQL 可在数据库中创建存储过程
- SQL 可在数据库中创建视图
- SQL 可以设置表、存储过程和视图的权限
SQL 标准
SQL 是 1986 年 10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了 SQL 正式国际标准。1989 年 4 月,ISO 提出了具有完整性特征的 SQL89 标准,1992 年 11 月又公布了 SQL92 标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。在 1999 年推出 99 版标准。最新版本为 SQL2016 版。比较有代表性的几个版本:SQL86、SQL92、SQL99。
SQL语言分类
-
数据查询语言(DQL:Data Query Language)其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。关键字 SELECT 是 DQL(也是所有 SQL)用得最多的动词。
- SELECT
- FROM
- WHERE
- ORDER BY
- HAVING
-
数据操作语言(DML:Data Manipulation Language)其语句包括动词 INSERT,UPDATE 和 DELETE。它们分别用于添加,修改和删除表中的行。
- INSERT:添加数据
- UPDATE:更新数据
- DELETE:删除数据
-
数据定义语言(DDL:Data Definition Language)定义数据库对象语言,其语句包括动词 CREATE 和 DROP 等。
- CREATE:创建数据库对象
- ALTER:修改数据库对象
- DROP:删除数据库对象
-
数据控制语言(DCL:Data Control Language)它的语句通过 GRANT 或 REVOKE 获得许可,确定用户对数据库对象的访问。
- GRANT:授予用户某种权限
- REVOKE:回收授予的某种权限
-
事务控制语言(TCL :Transaction Control Language)它的语句能确保被 DML 语句影响的表的所有行及时得以更新。
- COMMIT:提交事务
- ROLLBACK:回滚事务
- SAVEPOINT:设置回滚点
注意:数据操纵语言DML(insert、update、delete)针对表中的数据 ;而数据定义语言DDL(create、alter、drop)针对数据库对象,比如数据库database、表table、索引index、视图view、存储过程procedure、触发器trigger;
SQL语言语法:SQL语句不区分大小写,关键字建议大写。SQL语句可以单行或多行书写,以分号结尾。
创建删除数据库
方法一:使用DDL语句创建数据库
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符编码;
示例:创建一个名为test的数据库,并查看该数据库,以及该数据库的编码:
//创建数据库:
create database test default character set utf8;
//查看数据库:
show databases;
//查看数据库编码:
select schema_name,default_character_set_name from information_schema.schemata
where schema_name = 'test';
方法二:使用Navicat创建数据库
删除数据库
方法一:使用DDL语句删除数据库
DROP DATABASE 数据库名称;
方法二:使用Navicat工具删除数据库
MySQL中的数据类型
整数类型
MySQL数据类型 | 含义(有符号) |
---|---|
tinyint(m) | 1个字节 范围(-128~127) |
smallint(m) | 2个字节 范围(-32768~32767) |
mediumint(m) | 3个字节 范围(-8388608~8388607) |
int(m) | 4个字节 范围(-2147483648~2147483647) |
bigint(m) | 8个字节 范围(+-9.22*10的18次方) |
数值类型中的长度 m 是指显示长度,并不表示存储长度,只有字段指定 zerofill 时有用
例如: int(3) ,如果实际值是 2 ,如果列指定了 zerofill ,查询结果就是 002 ,左边用 0 来 填充
浮点类型
MySQL数据类型 | 含义 |
---|---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
字符类型
MySQL数据类型 | 含义 |
---|---|
char(n) | 固定长度,最多255个字符 |
tinytext | 可变长度,最多255个字符 |
varchar(n) | 可变长度,最多65535个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
char和varchar:
- char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定长。
- varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
- text不设置长度, 当不知道属性的最大长度时,适合用text。
按照查询速度: char最快, varchar次之,text最慢。
字符串型使用建议:经常变化的字段用varchar;知道固定长度的用char;尽量用varchar;超过255字符的只能用varchar或者text;能用varchar的地方不用text
日期类型
MySQL数据类型 | 含义 |
---|---|
date | 日期 YYYY-MM-DD |
time | 时间 HH:MM:SS |
datetime | 日期时间 YYYY-MM-DD HH:MM:SS |
timestamp | 时间戳YYYYMMDD HHMMSS |
二进制数据(BLOB)
- BLOB和TEXT存储方式不同,TEXT以文本方式存储,英文存储区分大小写,而Blob是以二进制方式存储,不分大小写。
- BLOB存储的数据只能整体读出。
- TEXT可以指定字符集,BLOB不用指定字符集。
创建表和删除表
方法一:使用DDL语句创建表
CREATE TABLE 表名(列名 类型,列名 类型......);// 示例:创建一个 employees 表包含雇员 ID ,雇员名字,雇员薪水。
create table employees(employee_id int,employee_name varchar(10),salary float(8,2));
// 查看已创建的表。
show tables;
方法二:使用Navicat工具创建表
删除表
方法一:使用DDL语句删除表
DROP TABLE 表名;
// 示例:删除 employees 表。
drop table employees;
方法二:使用Navicat工具删除表
修改表
修改表名:
ALTER TABLE 旧表名 RENAME 新表名;
// 示例一:创建一个 employees 表包含雇员 ID ,雇员名字,雇员薪水。
create table employees(employee_id int,employee_name varchar(10),salary float(8,2));
// 示例二:将 employees 表名修改为 emp。
alter table employees rename emp;
修改列名
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 类型;
// 示例:将 emp 表中的 employee_name 修改为 name。
alter table emp change column employee_name name varchar(20);
修改列类型
ALTER TABLE 表名 MODIFY 列名 新类型;
// 示例:将 emp 表中的 name 的长度指定为 40。
alter table emp modify name varchar(40);
添加新列
ALTER TABLE 表名 ADD COLUMN 新列名 类型;
// 示例:在 emp 表中添加佣金列,列名为 commission_pct。
alter table emp add column commission_pct float(4,2);
删除指定列
ALTER TABLE 表名 DROP COLUMN 列名;
// 示例:删除 emp 表中的 commission_pct。
alter table emp drop column commission_pct;
MySQL中的约束
约束概述:数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。
-
主键约束(Primary Key) PK
主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键。 主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息。例如,学生信息表中的学号是唯一的。
-
外键约束(Foreign Key) FK
外键约束经常和主键约束一起使用,用来确保数据的一致性。
-
唯一性约束(Unique)
唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。与主键约束不同的是,唯一约束在一个表中可以有多个,并且设置唯一约束的列是允许有空值的。
-
非空约束(Not Null)
非空约束用来约束表中的字段不能为空。
-
检查约束(Check)
检查约束也叫用户自定义约束,是用来检查数据表中,字段值是否有效的一个手段,但目前 MySQL 数据库不支持检查约束。
添加主键约束
单一主键:使用一个表作为主键列,当该列的值有重复时,则违反唯一约束。
联合主键:使用多个列作为主键列,当多个列的值都相同时,则违反唯一约束。
修改表以添加主键约束:使用DLL语句添加主键约束
ALTER TABLE 表名 ADD PRIMARY KEY(列名)
// 示例:将 emp 表中的 employee_id 修改为主键。
alter table emp add primary key(employee_id);
主键自增长:MySQL中的自动增长类型要求:
一个表中只能有一个列为自动增长;
自动增长的列的类型必须时整数类型;
自动增长只能添加到具备主键约束的与唯一性约束的列上;
删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然后再删除约束。
alter table 表名 modify 主键 类型 auto_increment;
// 示例:将 emp 表中的 employee_id 主键修改为自增。
alter table emp modify employee_id int auto_increment;
删除主键约束
使用DDL语句删除:
ALTER TABLE 表名 DROP PRIMARY KEY;
注意:删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后在删除 主键。
------------------------------------------------------------------------------
// 示例:删除emp表中的 employee_id 主键约束。去掉自动增长:
alter table emp modify employee_id int;
// 删除主键:
alter table emp drop primary key;
添加外键约束
使用DDL语句添加外键约束:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY( 列 名 ) REFERENCES 参照的表名(参照的列名);// 示例一:创建 departments 表包含 department_id 、department_name ,location_id。
create table departments(department_id int,department_name varchar(30),location_id int);
// 示例二:修改departments表,向department_id列添加主键约束与自动递增。
alter table departments add primary key(department_id);
alter table departments modify department_id int auto_increment;
// 示例三:修改 emp 表,添加 dept_id 列。
alter table emp add column dept_id int;
// 示例四:向 emp 表中的 dept_id 列添加外键约束。
alter table emp add constraint emp_fk foreign key(dept_id) references departments(department_id);
删除外键约束
使用DDL语句删除外键约束:
ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
// 示例:删除 dept_id 的外键约束。
alter table emp drop foreign key emp_fk;
添加唯一性约束
使用DDL语句添加唯一性约束:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名);
// 示例:向 emp 表中的 name 添加唯一约束。
alter table emp add constraint emp_uk unique(name);
删除唯一性约束
ALTER TABLE 表名 DROP KEY 约束名;
// 示例:删除 name 的唯一约束。
alter table emp drop key emp_uk;
添加非空约束
ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL;
// 示例:向 emp 表中的 salary 添加非空约束。
alter table emp modify salary float(8,2) not NULL;
删除非空约束
ALTER TABLE 表名 MODIFY 列名 类型 NULL;
// 示例:删除emp表中salary 的非空约束。
alter table emp modify salary float(8,2) NULL;
创建表时添加约束
查询表中的约束信息:SHOW KEYS FROM 表名;
示例:创建 depts 表包含 department_id 该列为主键且自动增长,department_name 列不 允许重复location_id 列不允含有空值。
create table depts(department_id int primary key auto_increment,department_name varchar(30) unique,location_id int not null);
Select基本查询数据操作
SELECT 语句从数据库中返回信息。使用一个 SELECT 语句,可以做下面的事:
-
列选择:能够使用 SELECT 语句的列选择功能选择表中的列,这些列是想
要用查询返回的。当查询时,能够返回列中的数据。
-
行选择:能够使用 SELECT 语句的行选择功能选择表中的行,这些行是想
要用查询返回的。能够使用不同的标准限制看见的行。
-
连接:能够使用 SELECT 语句的连接功能来集合数据,这些数据被存储在不
同的表中,在它们之间可以创建连接,查询出我们所关心的数据。
基本 SELECT 语句
在最简单的形式中,SELECT 语句必须包含下面的内容:
-
一个 SELECT 子句,指定被显示的列
-
一个 FROM 子句,指定表,该表包含 SELECT 子句中的字段列表
在语法中:
语句 | 含义 |
---|---|
SELECT | 是一个或多个字段的列表 |
* | 选择所有的列 |
DISTINCT | 禁止重复 |
column | expression | 选择指定的字段或表达式 |
alias | 给所选择的列不同的标题 |
FROM table | 指定包含列的表 |
假设有一个departments表:
查询 departments 表中的所有数据
select * from departments
查询departments表中所有部门名称
select department_name from departments;
查询雇员的年薪,并显示他们的雇员ID,名字
select employees_id,last_name, 12*salary from employees;
计算 employees 表中的员工全年薪水加 100 以后的薪水是多少,并显示他们的员工ID与名字
select employees_id,last_name, 12*salary+100 from employees;
计算 employees 表中的员工薪水加 100 以后的全年薪水是多少,并显示他们的员工ID与名字
select employees_id,last_name, 12*(salary+100) from employees;
MySQL中使用列别名
SELECT 列名 AS 列别名 FROM 表名 WHERE 条件;
// 示例:查询 employees 表将雇员 last_name 列定义别名为 name。
select last_name as name from employees;
select last_name name from employees;
MySQL中使用表别名
SELECT 表别名.列名 FROM 表名 as 表别名 WHERE 条件;
// 示例:查询 employees 表为表定义别名为emp,将雇员 last_name 列定义别名为 name。
select emp.last_name name from employees emp;
除去相同的行
SELECT DISTINCT 列名 FROM 表名;
// 示例:查询 employees 表,显示唯一的部门 ID。
select distinct department_id from employees;
查询中的行选择
用 WHERE 子句限制从查询返回的行。一个 WHERE 子句包含一个必须满足的条件,WHERE 子句紧跟着 FROM 子句。如果条件是 true,返回满足条件的行。
在语法中:
WHERE 限制查询满足条件的行
condition 由列名、表达式、常数和比较操作组成
SELECT * | 投影列 FROM 表名 WHERE 选择条件;
//示例:查询 departments 表中部门 ID 为 90 的部门名称与工作地点 ID。
select department_name,location_id from departments where department_id =4;
查询中的算时表达式
如果算术表达式包含有一个以上的运算,乘法和除法先计算。如果在一个表达式中的运算符优先级相同,计算从左到右进行。可以用圆括号强制其中的表达式先计算。
计算 employees 表中的员工全年薪水加 100 以后的薪水是多少,并显示他们的员工ID与名字
select employees_id,last_name, 12*salary+100 from employees;
计算 employees 表中的员工薪水加 100 以后的全年薪水是多少,并显示他们的员工ID与名字
select employees_id,last_name, 12*(salary+100) from employees;
MySQL中的比较条件
比较条件包括:>,≥,<,≤,=,<>(不等于,!=也可以)
// 示例一:查询 employees 表中员工薪水大于等于 3000 的员工的姓名与薪水。
select last_name,salary from employees where salary >= 3000;
// 示例二:查询 employees 表中员工薪水不等于 5000 的员工的姓名与薪水。
select last_name,salary from employees where salary<>5000;
其他比较条件
BETWEEN条件
可以用 BETWEEN 范围条件显示基于一个值范围的行。指定的范围包含一个下限和一个上限。
示例:查询 employees 表,薪水在 3000-8000 之间的雇员ID、名字与薪水。
select employee_id,last_name,salary from employees where salary between 3000 and 8000;
IN条件
使用IN成员条件测试在列表中的值
示例:查询 employees 表,找出薪水是 5000,6000,8000 的雇员ID、名字与薪水。
select employee_id,last_name,salary from employees where salary in(5000,6000,8000);
LIKE条件
LIKE条件可以执行有效搜索串值的通配符搜索
搜索条件既可以包括文字也可以包括数字:
% 表示0个或多个字符
_ 表示一个字符
示例:查询 employees 中雇员名字第二个字母是 e 的雇员名字。
select last_name from employees where last_name like '_e%';
NULL条件
NULL 条件,包括 IS NULL 条件和 IS NOT NULL 条件。
IS NULL 条件用于空值测试。空值的意思是难以获得的、未指定的、未知的或者不适用的。因此,你不能用 = ,因为 null 不能等于或不等于任何值。
示例一:找出 emloyees 表中那些没有佣金的雇员雇员ID、名字与佣金。
select employee_id,last_name,commission_pct from employees where commission_pct is null;
示例二:找出 employees 表中那些有佣金的雇员ID、名字与佣金。
select employee_id,last_name,commission_pct from employees where commission_pct is not null;
逻辑条件
逻辑条件组合两个比较条件的结果来产生一个基于这些条件的单个的结果,或者逆
转一个单个条件的结果。当所有条件的结果为真时,返回行。
SQL 的三个逻辑运算符是:
- AND
- OR
- NOT
可以在 WHERE 子句中用 AND 和 OR 运算符使用多个条件。
// 示例一:查询 employees 表中雇员薪水是 8000 的并且名字中含有e 的雇员名字与薪水。
select last_name,salary from employees where salary = 8000 and last_name like '%e%';
// 示例二:查询 employees 表中雇员薪水是 8000 的或者名字中含有e 的雇员名字与薪水。
select last_name,salary from employees where salary = 8000 or last_name like '%e%';
// 示例三:查询 employees 表中雇员名字中不包含 u 的雇员的名字。
select last_name from employees where last_name not like '%u%';
MySQL中的优先规则
FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
例子:
SELECT department, COUNT(*) as emp_count
FROM employees
WHERE hire_date > '2020-01-01'
GROUP BY department
HAVING emp_count > 5
ORDER BY emp_count DESC
LIMIT 10;
执行顺序解析:
- FROM employees:从
employees
表中读取数据。 - WHERE hire_date > '2020-01-01':筛选出 2020 年 1 月 1 日之后入职的员工。
- GROUP BY department:按部门进行分组。
- HAVING emp_count > 5:筛选出员工数量大于 5 的部门。
- SELECT department, COUNT(*) as emp_count:选择部门和对应的员工数量。
- ORDER BY emp_count DESC:按员工数量降序排序。
- LIMIT 10:只返回前 10 条记录。
常见运算符的优先级从高到低如下(越靠上优先级越高,越先计算):
优先级 | 运算符类别 | 示例 | 说明 |
---|---|---|---|
1 | 括号 () | (a + b) * c | 最高优先级,强制优先计算括号内的内容 |
2 | 单目运算符 | +a , -b , NOT cond | 如正负号、逻辑非 |
3 | 乘 * 、除 / 、取模 % | a * b , c / d , e % 2 | 乘除模优先级相同,从左到右 |
4 | 加 + 、减 - | a + b , c - d | 加减优先级相同,从左到右 |
5 | 比较运算符 | > , < , >= , <= , = , != , <> | 用于 WHERE 或 HAVING,但在 SELECT 表达式中也适用 |
6 | 逻辑运算符(部分) | AND | 在复杂条件中 |
7 | 逻辑运算符 | OR | 优先级最低之一 |
8 | CASE WHEN 表达式 | CASE WHEN ... THEN ... END | 通常作为一个整体表达式 |
在 SELECT 子句中,字段的计算顺序遵循标准运算符优先级规则,其中括号优先级最高,乘除高于加减,AND 高于 OR,使用括号可以明确控制任何复杂的计算逻辑。
ORDER_BY排序
在一个不明确的查询结果中排序返回的行。ORDER BY 子句用于排序。如果使用了 ORDER BY 子句,它必须位于 SQL 语句的最后。
示例一:查询 employees 表中的所有雇员,显示他们的ID、名字与薪水,并按薪水升序排序。
select employee_id,last_name,salary from employees order by salary;
select employee_id,last_name,salary from employees order by salary asc;
示例二:查询 employees 表中的所有雇员,显示他们的ID与名字,并按雇员名字降序排序。
select employee_id,last_name from employees order by last_name desc;
使用别名排序
示例:显示雇员ID,名字。计算雇员的年薪,年薪列别名为annsal,并对该列进行升序排序,
select employee_id,last_name ,12*salary annsal from employees order by annsal;
多列排序
示例:以升叙排序显示 DEPARTMENT_ID 列,同时以降序排序显示 SALARY 列。
select department_id,salary from employees order by department_id asc ,salary desc;
综合小练习:
1.创建一个查询,显示收入超过 12,000 的雇员的名字和薪水。
select
LAST_NAME,SALARY
from employees
WHERE SALARY > 12000;
2.创建一个查询,显示雇员号为 176 的雇员的名字和部门号。
SELECT
LAST_NAME,DEPARTMENT_ID
from employees
where EMPLOYEE_ID = 176;
3.显示所有薪水不在 5000 和 12000 之间的雇员的名字和薪水。
select
LAST_NAME,SALARY
from employees
where salary not BETWEEN 5000 and 12000;
4.显示所有在部门 20 和 50 中的雇员的名字和部门号,并以名字按字母顺序排序。
LAST_NAME,DEPARTMENT_ID
FROM employees
WHERE DEPARTMENT_ID IN (20,50)
ORDER BY LAST_NAME asc;
5.列出收入在 5,000 和 12,000 之间,并且在部门 20 或50 工作的雇员的名字和薪水。将列标题分别显示为 Employee 和 Monthly Salary
SELECT
LAST_NAME Employee,SALARY 'Monthly Salary'
FROM employees
WHERE SALARY BETWEEN 5000 and 12000
AND
DEPARTMENT_ID in(20,50);
6.显示所有没有主管经理的雇员的名字和工作岗位。
SELECT
LAST_NAME,JOB_ID
FROM employees
WHERE MANAGER_ID is null;
7.显示所有有佣金的雇员的名字、薪水和佣金。以薪水和佣金的降序排序数据。
SELECT
LAST_NAME,SALARY,COMMISSION_PCT
from employees
where COMMISSION_PCT is not NULL
ORDER BY SALARY DESC , COMMISSION_PCT desc;
8.显示所有名字中有一个 a 和一个 e 的雇员的名字。
SELECT
LAST_NAME
from employees
where LAST_NAME LIKE '%a%'
AND
LAST_NAME LIKE '%e%';
9.显示所有工作岗位是销售代表(SA_REP)或者普通职员(ST_CLERK),并且薪水不等于 2,500、3,500 或 7,000 的雇员的名字、工作岗位和薪水。
SELECT
LAST_NAME,JOB_ID,SALARY
from employees
WHERE
JOB_ID in('SA_REP','ST_CLIERK')
AND
SALARY not IN(2500,3500,7000)