sql的使用
MySQL、PostgreSQL关系型和MongoDB 和 Redis非关系型数据库
一、前期准备
在安装和使用数据库之前,确保你的 CentOS 7 系统具备以下条件:
- 系统安装了基本的开发工具:如
gcc
、make
等。 - 有权限使用
sudo
命令。 - 有良好的网络环境以下载软件包。
你可以通过以下命令确保系统软件包是最新的:
sudo yum update -y
二、关系型数据库
1. MySQL
MySQL 是最流行的开源关系型数据库之一,广泛应用于Web应用、ERP系统等场景。接下来详细讲解如何在 CentOS 7上安装、配置、使用以及开发中的 SQL 示例。
1.1 CentOS 7 安装 MySQL
-
安装 MySQL 官方源:
CentOS 7 默认的 yum 源中没有 MySQL,因此需要先下载安装 MySQL 官方源。sudo yum install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
-
安装 MySQL:
sudo yum install mysql-server -y
-
启动 MySQL 并设置为开机自启:
sudo systemctl start mysqld sudo systemctl enable mysqld
-
设置初始 root 密码:
MySQL 安装完成后会生成一个初始密码,使用以下命令查看:sudo grep 'temporary password' /var/log/mysqld.log
使用这个密码登录并强制修改:
mysql -u root -p ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
1.2 MySQL 开发使用
-
创建数据库:
CREATE DATABASE testdb;
-
创建表:
USE testdb; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), email VARCHAR(50), password VARCHAR(255) );
-
插入数据:
INSERT INTO users (username, email, password) VALUES ('user1', 'user1@example.com', 'pass123');
-
查询数据:
SELECT * FROM users;
-
高级操作:复杂查询与事务:
- 联合查询:
SELECT u.username, o.order_id FROM users u JOIN orders o ON u.id = o.user_id;
- 事务操作:
START TRANSACTION; UPDATE users SET password='newpass' WHERE username='user1'; COMMIT;
- 联合查询:
MySQL 多表查询
MySQL 多表查询是关系型数据库中一个非常重要的功能,它允许开发者从多个相关表中获取数据。MySQL 提供了多种方式来进行多表查询,常见的有 连接查询(JOIN) 和 子查询(Subquery)。掌握这些技巧是数据库设计与查询优化中的核心技能。
以下是 MySQL 多表查询的总结,涵盖了常用的连接类型、子查询以及实际应用中的查询示例。
一、连接查询(JOIN)
1.1 INNER JOIN(内连接)
内连接是最常见的连接查询,它只返回两个表中匹配条件的数据。如果某一行在其中一个表中不存在对应的匹配行,那么该行将不会出现在结果集中。
语法:
SELECT columns
FROM table1
INNER JOIN table2 ON table1.column = table2.column;
示例:
假设有两个表:
orders
表(存储订单信息)customers
表(存储客户信息)
我们希望查询每个订单对应的客户信息:
SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
此查询返回订单和客户的匹配结果,仅显示那些在 orders
表中有订单,并且在 customers
表中有对应客户的记录。
1.2 LEFT JOIN(左连接)
左连接返回左表中的所有行,即使右表中没有匹配的数据,右表中的数据为空(NULL
)。
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column;
示例:
我们希望查询所有订单,包括那些没有匹配到客户的订单:
SELECT orders.order_id, customers.customer_name, orders.order_date
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id;
此查询会显示所有订单,即使某些订单的客户信息缺失。
1.3 RIGHT JOIN(右连接)
右连接与左连接相反,它返回右表中的所有行,即使左表中没有匹配的数据。
语法:
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
示例:
我们希望查询所有客户,包括那些没有下订单的客户:
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
此查询会显示所有客户信息,包含那些没有订单的客户。
1.4 FULL JOIN(全连接)
全连接返回两个表中的所有行,不论是否匹配。MySQL 本身不直接支持 FULL JOIN
,但可以通过使用 UNION
结合 LEFT JOIN
和 RIGHT JOIN
来实现全连接。
语法:
SELECT columns
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT columns
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
示例:
返回所有客户和订单,不论是否有匹配关系:
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
UNION
SELECT customers.customer_name, orders.order_id, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
1.5 CROSS JOIN(交叉连接)
交叉连接会返回两个表的笛卡尔积,即每一个表中的行都和另一个表中的每一行进行组合,不考虑是否有匹配条件。
语法:
SELECT columns
FROM table1
CROSS JOIN table2;
示例:
查询所有产品与所有订单的组合:
SELECT products.product_name, orders.order_id
FROM products
CROSS JOIN orders;
此查询返回所有产品和订单的每一种组合。
二、子查询(Subquery)
2.1 单行子查询
单行子查询返回一行数据,常用于条件判断。
语法:
SELECT columns
FROM table
WHERE column = (SELECT value FROM other_table WHERE condition);
示例:
查询下单次数最多的客户信息:
SELECT *
FROM customers
WHERE customer_id = (SELECT customer_id
FROM orders
GROUP BY customer_id
ORDER BY COUNT(*) DESC LIMIT 1);
2.2 多行子查询
多行子查询返回多行数据,常与 IN
、ANY
、ALL
等关键字一起使用。
语法:
SELECT columns
FROM table
WHERE column IN (SELECT column FROM other_table WHERE condition);
示例:
查询下过订单的所有客户信息:
SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders);
2.3 相关子查询
相关子查询是指子查询依赖于外部查询的值。与普通子查询不同,它在外部查询的每一行执行一次。
语法:
SELECT columns
FROM table1 AS t1
WHERE column = (SELECT value FROM table2 AS t2 WHERE t1.column = t2.column);
示例:
查询订单金额大于所有该客户历史订单平均金额的订单:
SELECT order_id, order_total
FROM orders AS o1
WHERE order_total > (SELECT AVG(order_total)
FROM orders AS o2
WHERE o1.customer_id = o2.customer_id);
三、联合查询(UNION)
UNION 用于合并两个或多个 SELECT
查询的结果。每个查询的列数和数据类型必须匹配。
语法:
SELECT columns FROM table1
UNION
SELECT columns FROM table2;
示例:
查询所有客户和供应商的名称(假设有 customers
和 suppliers
表):
SELECT customer_name AS name FROM customers
UNION
SELECT supplier_name AS name FROM suppliers;
注意:
UNION
默认去重,可以使用UNION ALL
显示所有结果,包括重复项。
四、总结
- 内连接(INNER JOIN) 是最常用的多表查询方式,只返回两个表之间匹配的数据。用于查找共有信息。
- 左连接(LEFT JOIN) 和 右连接(RIGHT JOIN) 用于在查询中保留一方表的所有数据,即使另一方没有匹配数据。
- 全连接(FULL JOIN) 可以通过
UNION
来模拟,它返回两个表中的所有数据,不论是否有匹配项。 - 交叉连接(CROSS JOIN) 用于生成笛卡尔积,慎用。
- 子查询(Subquery) 用于嵌套查询,单行子查询和多行子查询在复杂查询中非常有用。
- 联合查询(UNION) 合并多个查询的结果集,但需要保证各查询的列数和类型相同。
通过理解这些查询方式,开发者能够轻松地处理多表数据操作,实现复杂业务逻辑。
1.3 PC 上的 MySQL 安装
在 PC(Windows 或 macOS)上安装 MySQL,可以通过 MySQL 官网下载合适版本:
- MySQL 官方下载页面
下载完成后按照安装向导安装,并根据需求设置用户名和密码。
2. PostgreSQL
PostgreSQL 是一个高扩展性和标准化的关系型数据库,支持复杂的数据类型和查询,常用于金融、GIS等高要求的数据处理场景。
2.1 CentOS 7 安装 PostgreSQL
-
添加 PostgreSQL 仓库:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-centos10-10-2.noarch.rpm
-
安装 PostgreSQL:
sudo yum install -y postgresql10-server postgresql10
-
初始化数据库并启动:
sudo /usr/pgsql-10/bin/postgresql-10-setup initdb sudo systemctl start postgresql-10 sudo systemctl enable postgresql-10
2.2 PostgreSQL 开发使用
-
创建用户和数据库:
sudo -u postgres psql
在
psql
中:CREATE USER devuser WITH PASSWORD 'devpassword'; CREATE DATABASE devdb OWNER devuser; GRANT ALL PRIVILEGES ON DATABASE devdb TO devuser;
-
表和数据操作:
\c devdb; CREATE TABLE products ( id SERIAL PRIMARY KEY, name VARCHAR(100), price NUMERIC(12, 2) ); INSERT INTO products (name, price) VALUES ('Laptop', 999.99); SELECT * FROM products;
-
高级操作:复杂查询与函数:
- 窗口函数:
SELECT name, price, RANK() OVER (ORDER BY price DESC) FROM products;
- 自定义函数:
CREATE FUNCTION calculate_discount(price NUMERIC) RETURNS NUMERIC AS $$ BEGIN RETURN price * 0.9; END; $$ LANGUAGE plpgsql;
- 窗口函数:
- MySQL 和 PostgreSQL 是关系型数据库,适合复杂事务和查询的场景。MySQL 更加简便,PostgreSQL 更加标准化和强大
三、非关系型数据库
1. MongoDB
MongoDB 是一种文档型的 NoSQL 数据库,使用 JSON 风格的 BSON 文档存储数据,常用于海量数据存储和实时分析场景。
1.1 CentOS 7 安装 MongoDB
-
添加 MongoDB 仓库:
cat <<EOF | sudo tee /etc/yum.repos.d/mongodb-org-4.4.repo [mongodb-org-4.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/4.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc EOF
-
安装 MongoDB:
sudo yum install -y mongodb-org
-
启动 MongoDB:
sudo systemctl start mongod sudo systemctl enable mongod
1.2 MongoDB 开发使用
-
连接 MongoDB:
mongo
-
创建数据库与集合:
use mydb; db.createCollection("users"); db.users.insert({ name: "Alice", age: 25, email: "alice@example.com" });
-
查询数据:
db.users.find();
-
高级操作:索引与聚合:
- 创建索引:
db.users.createIndex({ email: 1 });
- 聚合操作:
db.users.aggregate([ { $match: { age: { $gt: 20 } } }, { $group: { _id: null, avgAge: { $avg: "$age" } } } ]);
- 创建索引:
2. Redis
Redis 是一种基于内存的键值存储数据库,广泛用于缓存、消息队列等需要高性能的场景。
2.1 CentOS 7 安装 Redis
-
安装 EPEL 仓库:
sudo yum install epel-release -y
-
安装 Redis:
sudo yum install redis -y
-
启动 Redis:
sudo systemctl start redis sudo systemctl enable redis
2.2 Redis 开发使用
-
连接 Redis:
redis-cli
-
基本操作:
SET user:1 "Alice" GET user:1
-
高级操作:集合与发布订阅:
- 集合操作:
SADD myset "item1" "item2" "item3" SMEMBERS myset
- 发布订阅:
SUBSCRIBE mychannel PUBLISH mychannel "Hello, Redis!"
- 集合操作:
连接工具
在 CentOS 7 环境中,安装好 MySQL、PostgreSQL、MongoDB 和 Redis 后,可以使用图形化界面工具和命令行工具连接和管理数据库。以下是常用的数据库连接工具介绍,以及它们在不同操作系统下的安装方式。
1. MySQL
常用连接工具
- MySQL Workbench: 官方提供的图形化管理工具,支持查询、设计和管理 MySQL 数据库。
- DBeaver: 一款跨平台数据库管理工具,支持多种数据库,包括 MySQL。
- HeidiSQL: 轻量级的 MySQL 图形化管理工具。
安装和使用
-
MySQL Workbench:
- Windows 和 macOS 可以直接从 MySQL Workbench 官方网站 下载并安装。
- CentOS 安装:
sudo yum install mysql-workbench
-
DBeaver:
- DBeaver 在 官方页面 提供下载包,支持多平台。
- CentOS 安装:
- 下载 DBeaver 的 RPM 包:
wget https://dbeaver.io/files/dbeaver-ce-latest-stable.x86_64.rpm
- 安装 DBeaver:
sudo yum install -y ./dbeaver-ce-latest-stable.x86_64.rpm
- 下载 DBeaver 的 RPM 包:
-
HeidiSQL(仅支持 Windows):
- HeidiSQL 官方网站 提供下载,Windows 用户可以直接安装并连接 MySQL。
连接示例
- 打开 MySQL Workbench 或 DBeaver。
- 选择 “New Connection”。
- 输入以下连接信息:
- Host:
localhost
(或远程服务器的 IP 地址) - Port:
3306
- Username:
root
- Password: 你设置的密码
- Database:
mydb
(可选)
- Host:
2. PostgreSQL
常用连接工具
- pgAdmin: 官方提供的图形化管理工具,支持查询、设计和管理 PostgreSQL 数据库。
- DBeaver: 同样支持 PostgreSQL。
安装和使用
-
pgAdmin:
- Windows 和 macOS 用户可以从 pgAdmin 官方网站 下载。
- CentOS 安装:
- 安装 EPEL 仓库:
sudo yum install -y epel-release
- 安装 pgAdmin 4:
sudo yum install -y pgadmin4
- 安装 EPEL 仓库:
-
DBeaver:如上所述,DBeaver 支持 PostgreSQL。
连接示例
- 打开 pgAdmin 或 DBeaver。
- 创建一个新连接,输入以下信息:
- Host:
localhost
(或远程服务器的 IP 地址) - Port:
5432
- Username:
postgres
(或创建的用户) - Password: 对应用户密码
- Database:
mydb
(可选)
- Host:
3. MongoDB
常用连接工具
- MongoDB Compass: MongoDB 官方提供的图形化工具,支持管理和查询 MongoDB 数据。
- Robo 3T: 轻量级的 MongoDB 管理工具。
安装和使用
-
MongoDB Compass:
- 从 MongoDB 官方网站 下载适用于你的系统的 Compass 版本。
- CentOS 安装:
- 下载 MongoDB Compass:
wget https://downloads.mongodb.com/compass/mongodb-compass-1.33.1.x86_64.rpm
- 安装 Compass:
sudo yum install -y ./mongodb-compass-1.33.1.x86_64.rpm
- 下载 MongoDB Compass:
-
Robo 3T:
- 可以从 Robo 3T 官方网站 下载适合平台的版本。
连接示例
- 打开 MongoDB Compass 或 Robo 3T。
- 输入以下连接信息:
- Host:
localhost
- Port:
27017
- Authentication: 使用你设置的用户名和密码(如果启用了身份验证)
- Database:
mydb
(可选)
- Host:
4. Redis
常用连接工具
- RedisInsight: Redis 官方提供的图形化管理工具,支持 Redis 查询和数据管理。
- Another Redis Desktop Manager (RDM): 跨平台的 Redis 管理工具。
安装和使用
-
RedisInsight:
- 从 RedisInsight 官方网站 下载并安装适合平台的版本。
-
Another Redis Desktop Manager (RDM):
- 从 RDM 官方网站 下载适合的平台安装包。
连接示例
- 打开 RedisInsight 或 RDM。
- 新建一个 Redis 连接,输入以下信息:
- Host:
localhost
(或远程 Redis 服务器的 IP 地址) - Port:
6379
- Password: 如果 Redis 设置了密码,请填写,否则留空。
- Host:
总结
- MySQL:可使用 MySQL Workbench、DBeaver、HeidiSQL 等工具。
- PostgreSQL:可使用 pgAdmin、DBeaver 等工具。
- MongoDB:可使用 MongoDB Compass、Robo 3T 等工具。
- Redis:可使用 RedisInsight、RDM 等工具。
这些工具提供了方便的图形界面,帮助开发者可视化管理数据库,执行查询,并进行调试和优化。
Elasticsearch
Elasticsearch 是一款开源的分布式搜索引擎,专为全文搜索、结构化数据搜索和分析而设计。它属于 NoSQL 数据库范畴,但其主要用途是搜索和分析大规模的文本和数据。Elasticsearch 具有高扩展性、实时搜索和分布式架构等特点,被广泛应用于日志分析、搜索引擎、推荐系统等场景。
以下是 Elasticsearch 从安装到开发的全流程总结,适用于 CentOS 7 服务器和本地开发环境。
一、Elasticsearch 概述
1. 特性:
- 全文搜索:能够在海量文档中进行快速的全文搜索。
- 分布式架构:内置分片和副本机制,可以轻松扩展到数千个节点。
- 实时分析:通过 Kibana、Logstash 等工具进行实时的数据分析。
- 多租户支持:可以处理多种类型的数据,并针对不同的数据类型进行索引和查询。
2. 典型使用场景:
- 日志分析:通过 Elasticsearch、Logstash 和 Kibana(即 ELK Stack)构建实时日志分析平台。
- 全文检索:在大型文档集内进行关键词搜索,如电子商务网站的产品搜索。
- 监控与报警:与 Beats 或其他数据采集工具结合,用于监控系统的各类指标数据并触发报警。
二、Elasticsearch 安装(CentOS 7)
1. 添加 Elasticsearch 仓库
首先,确保 CentOS 7 已经安装 wget
,并添加 Elasticsearch 的 yum 源。
sudo yum install -y wget
sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-x86_64.rpm
sudo rpm --install elasticsearch-7.10.0-x86_64.rpm
2. 配置 Elasticsearch
Elasticsearch 的配置文件位于 /etc/elasticsearch/elasticsearch.yml
,你可以通过编辑该文件进行设置:
sudo vi /etc/elasticsearch/elasticsearch.yml
一些重要的配置项:
- 集群名称:定义集群的名字,如
cluster.name: my-cluster
。 - 节点名称:配置节点的名称,如
node.name: node-1
。 - 网络绑定:配置 Elasticsearch 可以监听的地址,如
network.host: 0.0.0.0
以允许外部访问。
3. 启动和设置自启
sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch
4. 验证 Elasticsearch 运行状态
你可以通过 HTTP 请求验证 Elasticsearch 是否成功启动:
curl -X GET "localhost:9200/"
若一切正常,将返回 Elasticsearch 的基本信息,如版本号等。
三、Elasticsearch 核心概念
1. 索引(Index)
- Elasticsearch 中的数据存储在索引(类似于关系型数据库中的数据库)中。
- 每个索引都有多个文档,并且每个文档都有一组字段,类似于关系型数据库的表和行。
2. 文档(Document)
- 文档是 Elasticsearch 中最基本的数据单位,每个文档可以理解为一条 JSON 格式的数据。
3. 分片与副本(Shard & Replica)
- 分片:数据被水平切分到多个分片中,使得 Elasticsearch 能够水平扩展。
- 副本:每个分片有多个副本,以确保数据的高可用性。
四、Elasticsearch 开发使用
1. 插入数据(Indexing)
可以通过 POST
请求将文档插入 Elasticsearch 索引。
curl -X POST "localhost:9200/my_index/_doc/1" -H 'Content-Type: application/json' -d'
{
"name": "Alice",
"age": 30,
"city": "New York"
}'
该命令会在 my_index
索引中插入一条文档,ID 为 1。
2. 查询数据(Searching)
使用 GET
请求来查询数据。
-
简单查询:
curl -X GET "localhost:9200/my_index/_search?q=name:Alice"
-
复杂查询:
使用POST
请求可以进行更复杂的查询,如多字段匹配:curl -X POST "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d' { "query": { "bool": { "must": [ { "match": { "name": "Alice" } }, { "range": { "age": { "gte": 25 } } } ] } } }'
3. 更新数据(Updating)
使用 POST
请求可以更新已有文档中的数据。
curl -X POST "localhost:9200/my_index/_update/1" -H 'Content-Type: application/json' -d'
{
"doc": {
"age": 31
}
}'
4. 删除数据(Deleting)
使用 DELETE
请求可以删除索引或文档。
-
删除文档:
curl -X DELETE "localhost:9200/my_index/_doc/1"
-
删除整个索引:
curl -X DELETE "localhost:9200/my_index"
五、Elasticsearch 高级操作
1. 索引映射(Index Mapping)
在 Elasticsearch 中,映射(mapping)定义了字段的数据类型以及如何处理这些字段。例如,可以将 age
字段设置为整数类型。
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"city": { "type": "keyword" }
}
}
}'
2. 聚合查询(Aggregation)
Elasticsearch 强大的聚合功能允许对数据进行分组和统计。以下示例展示了按城市进行分组,并计算每个城市的用户数量。
curl -X POST "localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"group_by_city": {
"terms": { "field": "city.keyword" }
}
}
}'
3. 分片与集群管理
在生产环境中,Elasticsearch 通常运行在集群模式下,多个节点组成集群。通过分片和副本配置,可以管理和扩展集群容量。
-
查看分片状态:
curl -X GET "localhost:9200/_cat/shards"
-
动态调整副本数:
curl -X PUT "localhost:9200/my_index/_settings" -H 'Content-Type: application/json' -d' { "index": { "number_of_replicas": 2 } }'
六、Elasticsearch 可视化工具:Kibana
为了更方便地管理和分析 Elasticsearch 中的数据,可以使用 Kibana,它是 Elastic Stack 的一部分,主要用于数据可视化。
1. 安装 Kibana
sudo yum install kibana -y
sudo systemctl start kibana
sudo systemctl enable kibana
Kibana 启动后,默认通过 http://localhost:5601
访问。你可以通过 Kibana 的图形界面来进行数据分析和可视化。
七、总结
- Elasticsearch 是一种非常适合全文搜索和实时数据分析的分布式搜索引擎,特别适合处理大规模的非结构化数据。
- 它支持分布式架构、实时搜索、高扩展性等特点,是构建搜索引擎和日志分析系统的理想选择。
- 通过结合 Kibana 和 Logstash 等工具,能够轻松构建一个功能强大的数据处理与分析平台。