当前位置: 首页 > news >正文

掌握数据库与SQL

数据库是存储和管理数据的地方,SQL(Structured Query Language)是和数据库打交道的语言。就像在图书馆里管理书籍,SQL就是你查找、借阅、分类这些书籍的指令。接下来,我给你一个循序渐进的方案,让你一步步掌握数据库和SQL,准备好接收知识的“快递”了吧?

1. 数据库基础概念:先搞清楚什么是数据库

掌握数据库和SQL,首先得对数据库的基本概念有个清晰的认识。数据库并不仅仅是一个存放数据的“仓库”,它能帮助你高效地存储、检索、修改和管理数据。

1.1 数据库是什么?

数据库就是一个系统化的存储和管理数据的工具,它可以组织、存储和检索大量的数据。就像是一个高度有序的图书馆,数据按一定的规则存放,便于快速查询。

  • 关系型数据库:以表格的形式组织数据(比如MySQL、PostgreSQL)。关系型数据库是由“表”组成的,表与表之间可以通过关系(如外键)进行连接。
  • 非关系型数据库(NoSQL):数据结构灵活,不依赖表结构(比如MongoDB)。这种数据库通常用于处理大数据和非结构化数据,比如文档、社交网络数据等。
1.2 表、行、列的基本概念
  • 表(Table):就像Excel表格一样,一张表包含了某种数据的集合。比如,有一张表可能存储了所有的“用户”信息。
  • 列(Column):表的每一列代表一种属性,比如“姓名”、“年龄”。
  • 行(Row):表的每一行代表一条记录,比如一名用户的信息。
1.3 主键与外键
  • 主键(Primary Key):表中的一列或多列用来唯一标识每一行数据。比如“用户ID”就是主键,确保每个用户都能被唯一识别。
  • 外键(Foreign Key):用来建立表与表之间的关系。比如“订单表”中的“用户ID”列是外键,它指向“用户表”的主键,以表示订单属于哪个用户。

2. SQL基础:数据库的沟通语言

SQL是与数据库“交流”的语言,它分为几类不同的命令:数据查询、数据修改、数据定义和权限管理。别担心,SQL虽然看起来像“外星语言”,但它其实非常人性化、简洁易懂。

2.1 基础的SQL语句
  • SELECT:查询数据的命令,相当于说“帮我找到这些数据”。

    SELECT name, age FROM users;
    

    上面的语句查询了“users”表中的“name”和“age”列。

  • INSERT:插入数据,相当于“在数据库里增加一条记录”。

    INSERT INTO users (name, age) VALUES ('Alice', 30);
    

    这条语句在“users”表中插入了一条新记录,名字为Alice,年龄为30。

  • UPDATE:更新数据,相当于“修改一条记录”。

    UPDATE users SET age = 31 WHERE name = 'Alice';
    

    这条语句把名字为Alice的用户年龄更新为31岁。

  • DELETE:删除数据,相当于“从数据库里移除一条记录”。

    DELETE FROM users WHERE name = 'Alice';
    

    这条语句会删除名字为Alice的用户。

2.2 过滤数据:WHERE条件

WHERE语句可以根据条件筛选数据,比如查询某个用户,或者查找符合特定条件的记录。

SELECT * FROM users WHERE age > 25;

这条语句查询了“users”表中所有年龄大于25的用户。*表示查询所有列。

2.3 排序和分页
  • ORDER BY:排序,类似于“先按年龄排一下”。

    SELECT * FROM users ORDER BY age DESC;
    

    按照年龄降序排序。

  • LIMIT:分页,获取部分数据,比如“只取前10条”。

    SELECT * FROM users LIMIT 10;
    

3. 高级SQL:让查询更智能

掌握了基础的增删改查,你已经能和数据库“对话”了。接下来我们提升一下,学点更高阶的SQL操作。

3.1 JOIN:跨表查询的神技

数据库的表之间往往会有关系,比如用户表和订单表之间的关系。这时候我们就要用JOIN来进行跨表查询。JOIN是SQL中的“魔术”,能够把多个表“拼接”起来查询。

  • INNER JOIN:查询两个表中共同的数据。比如想知道某个用户的订单详情:

    SELECT users.name, orders.order_id
    FROM users
    INNER JOIN orders ON users.user_id = orders.user_id;
    

    这条语句会返回用户名字和他们的订单ID。

  • LEFT JOIN:返回左表所有记录,哪怕右表没有匹配的记录。比如我们想找出所有用户,即使某些用户没有订单:

    SELECT users.name, orders.order_id
    FROM users
    LEFT JOIN orders ON users.user_id = orders.user_id;
    
3.2 GROUP BY 和聚合函数

有时候你想要对数据进行分组和汇总,GROUP BY和聚合函数可以帮你做到这一点。

  • COUNT:计数,统计有多少个记录。

    SELECT COUNT(*) FROM users;
    

    这条语句统计了“users”表中的总记录数。

  • SUM、AVG:计算总和、平均值。比如我们想知道所有订单的总金额和平均金额:

    SELECT SUM(order_total), AVG(order_total) FROM orders;
    
  • GROUP BY:按某个字段分组,比如我们想知道每个用户有多少订单:

    SELECT user_id, COUNT(order_id)
    FROM orders
    GROUP BY user_id;
    
3.3 子查询:让查询更灵活

有时候你需要一个查询的结果作为另一个查询的条件,这时候就需要子查询。

SELECT name FROM users WHERE user_id IN (SELECT user_id FROM orders WHERE order_total > 100
);

这条语句会返回那些订单总额超过100的用户名字。

4. 数据库设计:构建合理的数据库结构

当你掌握了SQL,接下来就是学习如何设计合理的数据库结构。数据库设计得好,查询效率高、数据一致性强,设计不好会导致性能问题和数据不一致。

4.1 规范化与反规范化
  • 规范化(Normalization):将数据拆分到多个表中,减少冗余数据。比如,我们把用户信息放在“users”表,订单信息放在“orders”表,通过user_id进行关联。
  • 反规范化(Denormalization):为了提高性能,有时候我们会适当冗余一些数据。比如在订单表中冗余存储用户的名字,这样可以减少跨表查询的开销。
4.2 索引(Index)

索引就像是书的目录,它能加快查询速度。没有索引时,数据库需要扫描整个表才能找到数据,而有了索引就能快速定位到目标。

CREATE INDEX idx_users_name ON users(name);

这条语句创建了一个基于name列的索引,之后查询用户名字时会变得更快。

4.3 事务(Transaction)

事务是保证数据库操作要么全部成功、要么全部回滚的机制,它可以确保数据的完整性。比如转账操作,必须保证从一个账户扣款后,另一个账户也必须入账,否则就要回滚。

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;

这段事务确保了从用户1账户中转账到用户2账户的操作是原子性的。

5. SQL性能优化

SQL写得好不好,直接影响查询效率。接下来给你几个常见的SQL优化技巧:

  • 使用索引:对常用查询字段建立索引,避免全表扫描。
  • *避免SELECT 只查询你需要的列,不要贪心去查询所有列。
  • 合理设计表结构:尽量减少冗余

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Mysql基础练习题 1729.求关注者的数量 (力扣)
  • 统计上升四元组
  • The component ‘GridItem‘ can only have a single child component.
  • 基于YOLOv8的风力涡轮机表面损坏检测系统
  • Mysql高级篇(中)——SQL性能分析
  • ROS CDK魔法书:建立你的游戏王国(TypeScript篇)
  • 【conda】Conda 环境迁移指南:如何更改 envs_dirs 和 pkgs_dirs 以及跨盘迁移
  • RAG与LLM原理及实践(15)---RAG Python 前端构建技术Flask
  • Linux 访问控制列表(Access Control List)
  • Rancher 与 Kubernetes(K8s)的关系
  • 运维学习————Zabbix监控框架(1)
  • 【笔记】第一章 金属在单向静拉伸载荷下的力学性能
  • Mac视频vedio转成gif图
  • 【PPT学习笔记】使用PPT制作动画/手书/视频等作品的适配性和可能性?
  • 网络工程师学习笔记——无线通信网(二)
  • ----------
  • 「译」Node.js Streams 基础
  • 【Leetcode】104. 二叉树的最大深度
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Debian下无root权限使用Python访问Oracle
  • input的行数自动增减
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • webpack+react项目初体验——记录我的webpack环境配置
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 浏览器缓存机制分析
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 使用API自动生成工具优化前端工作流
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 正则与JS中的正则
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 从如何停掉 Promise 链说起
  • #162 (Div. 2)
  • #WEB前端(HTML属性)
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (含笔试题)深度解析数据在内存中的存储
  • (三) diretfbrc详解
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)visual stdio 书签功能介绍
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .cfg\.dat\.mak(持续补充)
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 发送邮件
  • .NET 中创建支持集合初始化器的类型
  • .NET连接数据库方式
  • @GetMapping和@RequestMapping的区别
  • [000-01-022].第03节:RabbitMQ环境搭建
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [android] 请求码和结果码的作用
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [AR Foundation] 人脸检测的流程