1 数据库简介
1.1 简介
数据库(DataBase,DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
数据库软件应该为数据库管理系统,数据库是通过数据库管理系统创建和操作的。
数据库:存储、维护和管理数据的集合。
- 关系型数据库(RDBMS):关系型数据库使用表格(表)来组织和管理数据,其中数据之间的关系由键(key)建立。常见的关系型数据库包括 MySQL、Oracle、Microsoft SQL Server、PostgreSQL等。
- 非关系型数据库(NoSQL):非关系型数据库以键值对、文档、列族、图形等形式储存数据,而不像关系型数据库使用表格。非关系型数据库适用于大数据和分布式环境,具有高可扩展性和高性能特点。常见的非关系型数据库包括 MongoDB、Cassandra、Redis、Elasticsearch等。
innoDB
1.2 常见数据库
- 排名
目前互联网上常见的数据库管理软件有Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、Informix这几种。以下是2021年DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:(查看数据库最新排名: https://db-engines.com/en/ranking)
- 常见数据库系统介绍
- Oracle
1979 年,Oracle 2 诞生,它是第一个商用的 RDBMS(关系型数据库管理系统)。随着 Oracle 软件的名气越来越大,公司也改名叫 Oracle 公司。2007年,总计85亿美金收购BEA Systems。2009年,总计74亿美金收购SUN。此前的2008年,SUN以10亿美金收购MySQL。意味着Oracle同时拥有了MySQL 的管理权,至此 Oracle 在数据库领域中成为绝对的领导者。2013年,甲骨文超越IBM,成为继Microsoft后全球第二大软件公司。如今 Oracle 的年收入达到了 400 亿美金,足以证明商用(收费)数据库软件的价值。
- SQL Server
SQL Server 是微软开发的大型商业数据库,诞生于 1989 年。C#、.net等语言常使用,与WinNT完全集成,也可以很好地与Microsoft BackOffice产品集成。
- DB2
IBM公司的数据库产品,收费的。常应用在银行系统中。
- PostgreSQL
PostgreSQL 的稳定性极强,最符合SQL标准,开放源码,具备商业级DBMS质量。PG对数据量大的文本以及SQL处理较快
- SQLite
嵌入式的小型数据库,应用在手机端。 零配置,SQlite3不用安装,不用配置,不用启动,关闭或者配置数据库实例。当系统崩溃后不用做任何恢复操作,再下次使用数据库的时候自动恢复。
- informix
IBM公司出品,取自Information 和Unix的结合,它是第一个被移植到Linux上的商业数据库产品。仅运行于unix/linux平台,命令行操作。 性能较高,支持集群,适应于安全性要求极高的系统,尤其是银行,证券系统的应用
JSON(JavaScript Object Notation)数据库是一种使用 JSON 格式存储和组织数据的数据库。它将数据以类似于 JavaScript 对象的形式进行存储,以键值对的方式表示。JSON 数据库适用于存储和查询半结构化和非结构化数据。
- 常见的 JSON 数据库包括:
- MongoDB:MongoDB 是一种面向文档的数据库,使用 JSON 风格的文档存储数据。它支持复杂的查询、索引和数据复制等功能。
- CouchDB:CouchDB 是一种面向文档的数据库,使用 JSON 格式存储数据,并通过 RESTful API 进行访问和查询。
- OrientDB:OrientDB 是一种多模型数据库,支持图形、文档和对象等多种数据模型,其中文档模型使用 JSON 存储数据。
1.3 MySQL介绍
1.3.1 概述
-
MySQL是一个 开放源代码的关系型数据库管理系统 ,由瑞典MySQL AB(创始人MichaelWidenius)公司1995年开发,迅速成为开源数据库的 No.1。
-
2008被 Sun 收购(10亿美金),2009年Sun被 Oracle 收购。 MariaDB 应运而生。(MySQL 的创造者担心 MySQL 有闭源的风险,因此创建了 MySQL 的分支项目 MariaDB)
-
MySQL6.x 版本之后分为 社区版 和 商业版 。
-
MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
-
MySQL是开源的,所以你不需要支付额外的费用。
-
MySQL是可以定制的,采用了 GPL(GNU General Public License) 协议,你可以修改源码来开发自己的MySQL系统。
-
MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持 4GB ,64位系统支持最大的表文件为 8TB 。可以处理拥有上千万条记录的大型数据库。
-
MySQL使用 标准的SQL数据语言形式。
-
MySQL可以允许运行于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP和Ruby等
1.3.2 MySQL的版本
-
MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。
-
MySQL Enterprise Edition 企业版本,需付费,不能在线下载,可以试用30天。提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
-
MySQL Cluster 集群版,开源免费。用于架设集群服务器,可将几个MySQL Server封装成一个Server。需要在社区版或企业版的基础上使用。
-
MySQL Cluster CGE 高级集群版,需付费。
1.3.3 关于MySQL8.0
MySQL从5.7版本直接跳跃发布了8.0版本 ,可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强,开发者对MySQL的源代码进行了重构,最突出的一点是多MySQL Optimizer优化器进行了改进。不仅在速度上得到了改善,还为用户带来了更好的性能和更棒的体验。
-
开放源代码,使用成本低。
-
性能卓越,服务稳定。
-
软件体积小,使用简单,并且易于维护。
-
历史悠久,社区用户非常活跃,遇到问题可以寻求帮助。
-
许多互联网公司在用,经过了时间的验证。
1.3.4 Oracle vs MySQL
-
Oracle 更适合大型跨国企业的使用,因为他们对费用不敏感,但是对性能要求以及安全性有更高的要求。
-
MySQL 由于其体积小、速度快、总体拥有成本低,可处理上千万条记录的大型数据库,尤其是开放源码这一特点,使得很多互联网公司、中小型网站选择了MySQL作为网站数据库(Facebook,Twitter,YouTube,阿里巴巴/蚂蚁金服,去哪儿,美团外卖,腾讯)。
1.3.5 MySQL连接数据库并在命令行导入.sql文件
在命令行中将 SQL 文件导入到 MySQL 的步骤:
-
打开命令行终端。
-
使用下面的命令连接到 MySQL 数据库:
mysql -u username -p
其中:
-u username
指定数据库用户名-p
提示输入密码(如果设置了密码)
-
连接成功后,进入 MySQL 的命令行界面。
-
在 MySQL 命令行中,使用以下命令选择要导入数据的数据库:
USE database_name;
其中
database_name
是要导入数据的数据库名称。 -
使用以下命令导入 SQL 文件:
SOURCE /path/to/file.sql;
其中
/path/to/file.sql
是要导入的 SQL 文件的路径。请根据实际情况提供正确的文件路径。 -
等待导入操作完成。
1.4 关系型数据库基本概念
一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。表具有一些特性,这些特性定义了数据在表中如何存储,类似Java和Python中 “类”的设计。
1.4.1 表、记录、字段
- E-R(entity-relationship,实体-联系)模型中有三个主要概念是: 实体集 、 属性 、 联系集 。
- 一个实体集(class)对应于数据库中的一个表(table),一个实体(instance)则对应于数据库表中的一行(row),也称为一条记录(record)。一个属性(attribute)对应于数据库表中的一列(column),也称为一个字段(field)。
ORM思想 (Object Relational Mapping)体现:
-
数据库中的一个表 <—> Java或Python中的一个类
-
表中的一条数据 <—> 类中的一个对象(或实体)
-
表中的一个列 <----> 类中的一个字段、属性(field)
1.4.2 表的关联关系
-
表与表之间的数据记录有关系(relationship)。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示
三种:一对一,一对多,多对多
1.4.2.1 一对一 one-to-one
-
共享主键(Shared Primary Key)方式:
- 将两个实体分别放在两个表中,并且这两个表的主键相同。其中一个表的主键既是该表的主键,同时也是另一个表的外键。
- 这种方式建立的表结构简单,查询效率高,但可能存在冗余数据。
示例SQL语句:
CREATE TABLE 主表名 ( 共享主键 数据类型 PRIMARY KEY ); CREATE TABLE 从表名 ( 共享主键 数据类型 PRIMARY KEY, -- 其他从表字段 FOREIGN KEY (共享主键) REFERENCES 主表名(共享主键) );
-
单独主键(Separate Primary Key)方式:
- 将两个实体分别放在两个表中,每个表都有自己的主键,然后在一个表中添加一个外键列来引用另一个表的主键。
- 这种方式建立的表结构更规范,没有冗余数据,但在查询时需要进行关联操作。
示例SQL语句:
CREATE TABLE 主表名 ( 主键名 数据类型 PRIMARY KEY ); CREATE TABLE 从表名 ( 从表主键名 数据类型 PRIMARY KEY, 外键名 数据类型, -- 其他从表字段 FOREIGN KEY (外键名) REFERENCES 主表名(主键名) );
实现 :在任意一方加入外键,关联另一方的主键,并且设置外键为唯一的UNIQUE
create table user(
id int auto_increment primary key comment '主键ID',
name varchar(10) comment '姓名',
age int comment '年龄',
gender char(1) comment '1:男 ,2:女',
phone char(11) comment '手机号'
)
create table edu(
id int auto_increment primary key comment '主键ID',
degree varchar(20) comment '学历',
......,
userid int unique comment '用户ID',
constraint fk_userid foreign key (userid) references user(id)
)
1.4.2.2 一对多 one-to-many
-
常见实例场景: 客户表和订单表 , 分类表和商品表 , 部门表和员工表 。
-
举例:
-
员工表:编号、姓名、…、所属部门— 从表
-
部门表:编号、名称、简介— 主表
-
-
一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
create table dept(
id int auto_increment comment '部门ID' primary key,
name varchar(10) comment '部门名称'
)
create table student(
id int auto_increment comment '学生ID' primary key,
name varchar(10) comment '学生名字',
dept_id int,
foreign key (dept_id) references dept(id)
)
1.4.2.3 多对多 many-to-many
要表示多对多关系,必须创建第三个中间表,该表通常称为 联接表 ,它将多对多关系划分为两个一对多关系。将这两个表的主键都插入到第三个表中。
举例:
create table student(
id int auto_increment primary key comment '学生ID',
name varchar(10),
no varchar(10)
)
create table course(
id int auto_increment primary key comment '课程ID',
name varchar(10)
)
create table student_course(
id int auto_increment primary key,
studentid int not null comment '学生ID',
courseid int not null comment '课程ID',
constraint fk_courseid foreign key (courseid) references course(id),
constraint fk_studentid foreign key (studentid) references student(id)
)
2 MySQL 环境搭建
版本:MySQL8.0.22
2.1 安装
- 下载压缩包:访问地址:https://dev.mysql.com/downloads/mysql/
- 配置环境变量
下载后解压,将解压文件下的bin路径添加到环境变量
- MySQL配置文件
在mysql文件夹下找到my.ini或my-default.ini,如果没有.ini结尾的文件,直接创建该文件。新增内容为如下,注意basedir和datadir是我自己的路径位置,自定义。记得新增一个文件Data文件夹
[mysqld]
#设置3306端口
port=3306
# 设置mysql的安装目录
basedir=D:\DFRT\mysql-8.0.22-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\DFRT\mysql-8.0.22-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
- 安装mysql
在mysql安装目录中打开bin文件夹,运行cmd,执行初始化数据库命令:
mysqld --initialize --console
root用户的初始化密码
**注意:**要是你不小心关掉cmd,或者没记住,那也没事,删掉初始化的 datadir 目录,再执行一遍初始化命令,又会重新生成的。
- 安装服务
在mysql安装目录的bin下执行命令
mysql --install [服务名]
’
mysqld --install mysql8
如果提示以下错误,使用管理员身份执行:
安装后使用net start mysql8启动服务,使用net stop mysql8停止服务
- 连接数据库
mysql -h 主机名 -p 端口号 -u 用户名 -p 密码
实战:
mysql -u root -p
修改账户密码:
alter user 'root'@'localhost' identified with mysql_native_password BY '123456';
注意:命令行分号一定有
- 退出数据库
quit
exit
- 版本查看
c:\>mysql --version
或
mysql>select version()
查看所有数据库
mysql>show databases;
2.2 卸载
2.3 MySQL图形化管理工具
2.3.1 Navicat
Navicat MySQL是一个强大的MySQL数据库服务器管理和开发工具。它可以与任何3.21或以上版本的MySQL一起工作,支持触发器、存储过程、函数、事件、视图、管理用户等,对于新手来说易学易用。其精心设计的图形用户界面(GUI)可以让用户用一种安全简便的方式来快速方便地创建、组织、访问和共享信息。Navicat支持中文,有免费版本提供。 下载地址:http://www.navicat.com/
2.3.2 SQLyog
SQLyog 是业界著名的 Webyog 公司出品的一款简洁高效、功能强大的图形化 MySQL 数据库管理工具。这款工具是使用C++语言开发的。该工具可以方便地创建数据库、表、视图和索引等,还可以方便地进行插入、更新和删除等操作,同时可以方便地进行数据库、数据表的备份和还原。该工具不仅可以通过SQL文件进行大量文件的导入和导出,还可以导入和导出XML、HTML和CSV等多种格式的数据。 下载地址:http://www.webyog.com/,读者也可以搜索中文版的下载地址。
3 SQL语言
3.1 概述
SQL:Structure Query Language(结构化查询语言),SQL被美国国家标准局(ANSI)确定为关系型
数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。
各数据库厂商都支持ISO的SQL标准,普通话
各数据库厂商在标准的基础上做了自己的扩展,方言
SQL 是一种标准化的语言,它允许你在数据库上执行操作,如创建项目,查询内容,更新内容,并删除条目等操作。
Create, Read, Update, and Delete 通常称为CRUD操作。
3.2 SQL语句分类
- DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等。主要的语句关键字包括 CREATE 、 DROP 、 ALTER 等。
- DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据)增删改。主要的语句关键字包括 INSERT 、 DELETE 、 UPDATE 、 SELECT 等 SELECT是SQL语言的基础,最为重要
- DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别。主要的语句关键字包括 GRANT 、 REVOKE 、 COMMIT 、 ROLLBACK 、 SAVEPOINT 等
- DQL(Data Query Language):数据查询语言,用来查询记录(数据)查询。因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类:DQL(数据查询语言)。
- TCL(Transaction Control Language) 单独将 COMMIT 、 ROLLBACK 取出来称为TCL
3.3 SQL语言的规则与规范
- SQL可以卸载一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
- 每条命令以 ; 或 \g 或 \G 结束
- 关键字不能被缩写也不能分行
- 关于标点符号
- 必须使用英文状态下的半角输入方式
- 字符串型和日期时间类型的数据可以使用单引号(’ ')表示
- 列的别名,尽量使用双引号(" "),而且不建议省略as
- MySQL 在 Windows 环境下是大小写不敏感
- MySQL 在 Linux 环境下是大小写敏感
- 数据库名、表名、表的别名、变量名是严格区分大小写的
- 关键字、函数名、字段名、字段的别名是忽略大小写的。
- 推荐采用统一的书写规范:
- 数据库名、表名、表别名、字段名、字段别名等都小写
- SQL 关键字、函数名、绑定变量等都大写
- 注释:
#单行注释(MySQL特有)
-- 注释文字(--后面必须要有一个空格)
/*多行注释*/
- 命名规约
- 数据库、表名不得超过30个字符,变量名限制为29个
- 必须只能包含 A–Z, a–z, 0–9, _共63个字符
- 数据库名、表名、字段名等对象名中间不要包含空格
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名。
- 数据类型在一个表里是整数,那在另一个表里可不能为其他类型
4. select语句
4.1 导入SQL文件
mysql> source d:\mysqldb.sql
4.2 常用的语法
- 语法
-
判断是否为空使用
is null
-
select * from departments;
一般不建议使用 *
- 别名
使用**表别名(Table Alias)和列别名(Column Alias)**来为表和列提供更简洁或易读的名称。这对于复杂的查询或多个表连接非常有用
注意:一旦起了别名就必须使用别名
#表别名
SELECT alias.column FROM tablename AS alias;
SELECT alias.column FROM tablename alias;
#列别名
SELECT column AS alias FROM tablename;
SELECT column alias from tablename;
SELECT e.last_name AS employee_name, d.department_name AS dept_name FROM employees AS e JOIN departments AS d ON e.deptid = d.id;
- 去除重复行
- 去除department_id 中重复的数据 关键字DISTINCT
SELECT DISTINCT department_id FROM employees;
-
多列去除,只对department_id生效,对salary无效
从
employees
表中选择不重复的department_id
和salary
列的数据。这将返回每个不同的department_id
和对应的salary
值
SELECT DISTINCT department_id,salary FROM employees;
DISTINCT 需要放到所有列名的前面,如果写成 SELECT salary, DISTINCT department_id FROM employees 会报错。
DISTINCT 其实是对后面所有列名的组合进行去重,你能看到最后的结果是 74 条,因为这 74 个部门id不同,都有 salary 这个属性值。如果你想要看都有哪些不同的部门(department_id),只需要写 DISTINCT department_id 即可,后面不需要再加其他的列名了。
- 着重号
- 当表中的字段、表名与保留字、数据库系统或常用方法冲突时使用。
- SQL语句中使用``将名字包住。
- null值
-
所有运算符或列值遇到null结果均为null
-
空值不等于空字符串,一个空字符串长度是0,每个空值长度是空,MySQL中空值占用空间
- 查询常数
- 对于常数的查询就是在查询结果中添加一列固定的常数列,这一列取值是我们执行的,而不是从数据表中动态去除的
- 例如:我们对employees数据表中的员工姓名进行查询,同时增加一列字段corporation,这个字段固定值为"MySQL"可以这样写
SELECT 'MySQL' as corporation, last_name FROM employees;
- 显示表的结构
DESC employees;或 DESCRIBE employees
- 各个字段的含义
- Field:字段名称。
- Type:字段类型
- Null:是否可以为null。
- Key:该列是否已编制索引。PRI表示该列是表主键的一部分;UNI表示该列是UNIQUE索引的一部分;MUL表示在列中某个给定值允许出现多次。
- Default:该列是否有默认值,如果有,那么值是多少。
- Extra:表示可以获取的与给定列有关的附加信息,例如AUTO_INCREMENT等。
- 过滤条件
SELECT 字段1,字段2
FROM 表名
WHERE 过滤条件
4.3 数据类型
数据类型 | 描述 |
---|---|
INT | 从-231到231-1的整型数据。存储大小为 4个字节 |
CHAR(size) | 定长字符数据。若未指定,默认为1个字符,最大长度255 |
VARCHAR(size) | 可变长字符数据,根据字符串实际长度保存,必须指定长度 |
FLOAT(M,D) | 单精度,占用4个字节,M=整数位+小数位,D=小数位。D<=M<=255,0<=D<=30, 默认M+D<=6 |
DOUBLE(M,D) | 双精度,占用8个字节,D<=M<=255,0<=D<=30,默认M+D<=15 |
DECIMAL(M,D) | 高精度小数,占用M+2个字节,D<=M<=65,0<=D<=30,最大取值范围与 |
DATE | 日期型数据,格式’YYYY-MM-DD’ |
BLOB | 二进制形式的长文本数据,最大可达4G |
TEXT | 长文本数据,最大可达4G |
5. 运算符
5.1 算数运算符
- 加运算符
Select A + B
- 减运算符
Select A - B
- 乘运算符
Select A * B
- 除运算符
Select A / B
- 模运算符
Select A mod B
5.2 比较运算符
- 比较运算符用来对表达式左边的操作数和右边的操作数进行比较,为真返回1,为假返回0,其他情况返回null
- 常用作select查询语句的条件来使用,返回符合条件的结果记录
运算符 | 名称 | 作用 | 示例 |
---|---|---|---|
= | 等于 | 值,字符串或表达式是否相等 | select C from table where A = B |
<=> | 安全等于 | 安全地判断值,字符串或表达式是否相等 | select C from table where A <=> B |
!= | 不等于 | 值、字符串、表达式是否不相等 | select C from table where A != B |
< | 小于 | 前面的值、字符串、表达式是否小于后面 | |
<= | 小于等于 | 前面的值、字符串、表达式是否小于等于后面 | |
> | 大于 | 前面的值、字符串、表达式是否大于后面 | |
>= | 大于等于 | 前面的值、字符串、表达式是否大于等于后面 | |
ISNULL | 为空运算符 | 值、字符串、表达式是否为空 | select b from table where a is null |
ISNOTNULL | 不为空运算符 | 值、字符串、表达式是否不为空 | |
BETWEEN AND | 两值之间的运算符 | 判断一个值是否在两个值之间 | where c between 12 and 18 |
IN | 属于运算符 | 判断一个值是否为列表中的任意一个值 | where c in(a,b) |
NOTE IN | 不属于运算符 | 判断一个值是否不是列表中的任意一个值 | |
LIKE | 模糊匹配运算符 | 判断一个值是否符合模糊匹配规则 | where name LIKE ‘%li%’ |
REGEXP | 正则表达式运算符 | 判断一个值是否符合正则表达式规则 | |
RLIKKE | 正则表达式运算符 | 判断一个值是否符合正则表达式规则 |
#工资大于10000的员工
SELECT * FROM employees WHERE salary > 10000
#查询department_id是90和60的员工
SELECT * FROM employees WHERE department_id IN (90, 60);
#模糊查询
SELECT * FROM employees WHERE first_name LIKE '%ex%' #是否区分大小写,看操作系统或者字符集
SELECT * FROM employees WHERE first_name like binary '%ex%' # 区分大小写
5.3 逻辑运算符
运算符 | 作用 | 示例 |
---|---|---|
NOT或! | 逻辑非 | select NOT A |
AND | 逻辑与 | select A AND B |
OR | 逻辑或 | SELECT A OR B |
XOR | 逻辑异或 | SELECT A XOR B |
案例
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary
>=10000 AND job_id LIKE %MAN%';
#查询基本薪资不在9000-12000之间的员工编号和基本薪资
SELECT employee_id,salary FROM employees WHERE NOT (salary >= 9000 AND
salary <= 12000);
SELECT employee_id,salary FROM employees WHERE salary <9000 OR salary >
12000;
SELECT employee_id,salary FROM employees WHERE salary NOT BETWEEN 9000 AND
12000;
#正则运算符
SELECT * FROM employees WHERE first_name REGEXP '^A';
5.4 位运算符
运算符 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
~ | 按位取反 |
>> | 按位右移 |
<< | 按位左移 |
案例
mysql> SELECT 1 & 10, 20 & 30;
+--------+---------+
| 1 & 10 | 20 & 30 |
+--------+---------+
| 0 | 20 |
+--------+---------+
1 row in set (0.00 sec)
1的二进制数为0001,10的二进制数为1010,所以1 & 10的结果为0000,对应的十进制数为0。20的二进制数为10100,30的二进制数为11110,所以20 & 30的结果为10100,对应的十进制数为20。
6. 排序与分页
6.1 排序数据
- 使用ORDER BY进行排序
- ASC升序
- DESC降序
- ORDER BY子句在SELECT语句的结尾。
案例
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY
hire_date ;
SELECT last_name, job_id, department_id, hire_date FROM employees ORDER BY
hire_date DESC ;
SELECT employee_id, last_name, salary*12 annsal FROM employees ORDER BY
annsal;
#多列排序
SELECT last_name, department_id, salary FROM employees ORDER BY
department_id, salary DESC;
6.2 分页(优化面试题)
- 对数据进行分页查看
- MySQL中使用
LIMIT
实现分页,LIMIT [位置偏移量],一页行数
--前10条记录:
SELECT * FROM 表名 LIMIT 0,10;
或者
SELECT * FROM 表名 LIMIT 10;
--第11至20条记录:
SELECT * FROM 表名 LIMIT 10,10;
--第21至30条记录:
SELECT * FROM 表名 LIMIT 20,10;
**注:**MySQL 8.0中可以使用“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和 “LIMIT4,3;”返回的结果相同。
*分页显示公式:(当前页数-1)每页条数,每页条数
SELECT * FROM table LIMIT(PageNo - 1)*PageSize,PageSize;
分页查询优化
在进行分页查询时,可以采取一些优化策略以提高查询性能。以下是一些常用的分页查询优化方法:
- 使用索引:确保分页查询的字段上创建了索引,以加快查询速度。通常情况下,需要在用于排序和过滤的列上创建索引,例如ORDER BY和WHERE子句中使用的列。
- 避免全表扫描:尽量避免在分页查询中执行全表扫描操作,因为它会消耗大量的资源和时间。通过合理地使用索引和优化查询条件,限制返回结果的数量,可以有效地避免全表扫描。
- 使用覆盖索引:如果只需要查询部分列的数据,可以考虑创建覆盖索引。覆盖索引只包含查询所需的列,可以减少IO操作和内存消耗,从而提高查询效率。
- 合理设置分页参数:根据实际需求设置合适的分页参数,包括每页返回的记录数量和当前页的偏移量。不宜设置过大或过小的值,要根据数据量和用户需求来选择。
- 使用缓存:对于经常被访问的分页查询结果,可以考虑使用缓存技术,将查询结果缓存起来,减少数据库访问次数,提高响应速度。
- 分页查询结果集的批量加载:在大数据量情况下,可以考虑将分页查询结果集进行批量加载,而不是一次性加载全部结果。例如,可以根据滚动窗口或滑动窗口的方式,逐步加载结果。
- 使用优化器提示:根据具体数据库的优化器特性,可以使用一些优化器提示语句,如SQL_CALC_FOUND_ROWS和STRAIGHT_JOIN等,来提供给优化器更准确的信息,从而得到更好的查询执行计划。
除了以上的优化策略,还可以考虑数据库服务器硬件的优化、调整查询缓存大小以及并发连接数等因素,以进一步提高分页查询的性能。但需要注意的是,不同的数据库系统可能有各自的优化方法和工具,具体的优化方案需要根据实际情况和数据库系统来选择和实施。
7. 关联查询
- 也称为多表查询,指两个或多个表一起完成查询操作
- 前提:两表之间有关联字段
7.1 笛卡尔积(交叉连接)
- 笛卡尔乘积是一个数学运算。假设我有两个集合 X 和 Y,那么 X 和 Y 的笛卡尔积就是 X 和 Y 的所有可能组合,也就是说组合的个数为两个集合中元素个数的乘积。
#查询员工姓名和所在部门名称
SELECT last_name,department_name FROM employees,departments; #出现笛卡尔积
为了避免笛卡尔积,要在WHERE加入有效的连接条件,消除无效笛卡尔积
#案例:查询员工的姓名及其部门名称
SELECT last_name, department_name
FROM employees, departments
WHERE employees.department_id = departments.department_id;
7.2 多表关联的分类
7.2.1 等值连接和非等值连接
7.2.2 自连接和非自连接
- 自连接
当前表与自身连接查询,自连接必须使用表别名
例:管理者和工人都是员工
从 employees
表中选择每个员工的姓氏 (worker.last_name
) 和他们的经理的姓氏 (manager.last_name
),并在它们之间加上 ' works for '
字符串
-
非自连接
对两张不同但有关联的表的查询
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e , departments d
WHERE e.department_id = d.department_id;
7.2.3 内连接外连接
-
内连接: 查询两张表交集的部分
-
隐式内连接:
select 字段列表 from 表1,表2 where 条件;
select e.name,d.name from emp e,dept d where e.dept_id=d.id;
-
显示内连接:
select 字段列表 from 表1 [inner] join 表2 on 连接条件;
select e.name,d.name from emp e inner join dept d on e.dept_id=d.id
-
-
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。
-
左外连接,查询左表以及两表的交集数据(相当于查询左表的所有数据,包含交集)。连接条件中左边的表也称为 主表 ,右边的表称为 从表 。
select 字段列表 from 表1 left [outer] join 表2 on 条件;
eg :查询emp表的所有数据,和对应的部门信息
-
右外连接,查询右表以及两表的交集数据。连接条件中右边的表也称为 主表 ,左边的表称为 从表 。
select 字段列表 from 表1 right [outer] join 表2 on 条件;
-