SQL 语法基础:从入门到实践
引言
在开发高德地图商场数据爬虫项目时,我们需要使用 SQL 来操作 MySQL 数据库。SQL(Structured Query Language)是用于管理关系型数据库的标准语言。本文将介绍 SQL 的基础语法,帮助你快速掌握数据库操作。
一、SQL 基础概念
1.1 SQL 分类
- DDL(数据定义语言):创建、修改、删除数据库对象
- DML(数据操作语言):增删改查数据
- DCL(数据控制语言):管理用户权限
- TCL(事务控制语言):管理事务
1.2 常用数据类型
- 数值类型:INT、DECIMAL、FLOAT
- 字符串类型:VARCHAR、CHAR、TEXT
- 日期时间:DATETIME、TIMESTAMP
- 布尔类型:BOOLEAN
二、数据库操作
2.1 创建数据库
CREATE DATABASE mall_crawler
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
2.2 使用数据库
USE mall_crawler;
2.3 删除数据库
DROP DATABASE mall_crawler;
三、表操作
3.1 创建表
CREATE TABLE mall_info (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
mall_id VARCHAR(64) NOT NULL,
name VARCHAR(255) NOT NULL,
address VARCHAR(512),
phone VARCHAR(64),
business_hours VARCHAR(255),
rating DECIMAL(2,1),
latitude DECIMAL(10,6),
longitude DECIMAL(10,6),
city VARCHAR(64),
district VARCHAR(64),
category VARCHAR(64),
description TEXT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_mall_id (mall_id),
KEY idx_city (city),
KEY idx_district (district)
);
3.2 修改表
-- 添加列
ALTER TABLE mall_info ADD COLUMN status TINYINT DEFAULT 1;
-- 修改列
ALTER TABLE mall_info MODIFY COLUMN phone VARCHAR(32);
-- 删除列
ALTER TABLE mall_info DROP COLUMN status;
3.3 删除表
DROP TABLE mall_info;
四、数据操作
4.1 插入数据
-- 单条插入
INSERT INTO mall_info (mall_id, name, address, city)
VALUES ('123456', '万达广场', '北京市朝阳区', '北京');
-- 批量插入
INSERT INTO mall_info (mall_id, name, address, city)
VALUES
('123457', '大悦城', '北京市朝阳区', '北京'),
('123458', '王府井', '北京市东城区', '北京');
4.2 更新数据
-- 更新单条记录
UPDATE mall_info
SET address = '北京市朝阳区建国路88号'
WHERE mall_id = '123456';
-- 批量更新
UPDATE mall_info
SET status = 0
WHERE city = '北京';
4.3 删除数据
-- 删除单条记录
DELETE FROM mall_info WHERE mall_id = '123456';
-- 批量删除
DELETE FROM mall_info WHERE city = '北京';
-- 清空表
TRUNCATE TABLE mall_info;
4.4 查询数据
-- 基本查询
SELECT * FROM mall_info;
-- 条件查询
SELECT name, address, phone
FROM mall_info
WHERE city = '北京' AND rating >= 4.5;
-- 排序
SELECT * FROM mall_info
ORDER BY rating DESC, create_time DESC;
-- 分页
SELECT * FROM mall_info
LIMIT 10 OFFSET 0;
-- 分组统计
SELECT city, COUNT(*) as mall_count, AVG(rating) as avg_rating
FROM mall_info
GROUP BY city
HAVING mall_count > 10;
-- 多表关联
SELECT m.name, m.address, d.district_name
FROM mall_info m
JOIN district_info d ON m.district = d.district_code;
五、高级查询
5.1 子查询
-- 使用子查询
SELECT * FROM mall_info
WHERE rating > (SELECT AVG(rating) FROM mall_info);
-- IN子查询
SELECT * FROM mall_info
WHERE city IN (SELECT city FROM city_info WHERE province = '北京');
5.2 联合查询
-- UNION
SELECT name, address FROM mall_info
UNION
SELECT name, address FROM historical_mall_info;
5.3 窗口函数
-- 排名
SELECT
name,
rating,
RANK() OVER (ORDER BY rating DESC) as rank
FROM mall_info;
六、索引使用
6.1 创建索引
-- 创建普通索引
CREATE INDEX idx_name ON mall_info(name);
-- 创建唯一索引
CREATE UNIQUE INDEX uk_phone ON mall_info(phone);
-- 创建联合索引
CREATE INDEX idx_city_district ON mall_info(city, district);
6.2 删除索引
DROP INDEX idx_name ON mall_info;
七、事务处理
7.1 事务示例
-- 开始事务
START TRANSACTION;
-- 执行操作
UPDATE mall_info SET status = 0 WHERE city = '北京';
INSERT INTO mall_log (mall_id, operation) VALUES ('123456', 'UPDATE');
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
八、性能优化建议
8.1 查询优化
- 使用合适的索引
- 避免使用 SELECT *
- 使用 EXPLAIN 分析查询
- 优化 WHERE 条件
- 合理使用 JOIN
8.2 索引优化
- 遵循最左前缀原则
- 避免冗余索引
- 考虑索引的选择性
- 注意索引的维护成本
结语
SQL 是数据库操作的基础,掌握 SQL 语法对于开发数据库应用至关重要。本文介绍了 SQL 的基础语法和常用操作,希望能帮助你更好地使用 MySQL 数据库。在实际开发中,建议根据具体需求选择合适的 SQL 语句,并注意查询性能的优化。