掌握Sql基本知识

一、概述

关系数据库的基本操作就是增删改查,即CRUD:Create、Retrieve、Update、Delete。

而对于增、删、改、查,对应的SQL语句分别是:

  • INSERT:插入新记录;
  • UPDATE:更新已有记录;
  • DELETE:删除已有记录;
  • SELECT: 查询已有记录。

二、sql基本用法。

1. SELECT

(1)基本查询

sql 复制代码
SELECT * FROM <表名>

使用SELECT * FROM students时,SELECT是关键字,表示将要执行一个查询,*表示"所有列",FROM表示将要从哪个表查询。

(2)条件查询

sql 复制代码
SELECT * FROM <表名> WHERE <条件表达式>;

在基础查询上加一个条件表达式,来达到准确查询,条件表达式有AND OR NOT 三种,AND,要同时满足两边条件;OR,只满足其中一个条件就好;NOT不符合该条件就能查询到

(3)投影查询

使用SELECT * FROM <表名> WHERE <条件>可以选出表中的若干条记录。我们注意到返回的二维表结构和原表是相同的,即结果集的所有列与原表的所有列都一一对应。

如果我们只希望返回某些列的数据,而不是所有列的数据,我们可以用SELECT 列1, 列2, 列3 FROM ...,让结果集仅包含指定列。这种操作称为投影查询。

SQL 复制代码
SELECT id, score, name FROM students;

使用SELECT 列1, 列2, 列3 FROM ...时,还可以给每一列起个别名,这样,结果集的列名就可以与原表的列名不同。它的语法是SELECT 列1 别名1, 列2 别名2, 列3 别名3 FROM ...

例如,以下SELECT语句将列名score重命名为points,而idname列名保持不变:

SQL 复制代码
SELECT id, score points, name FROM students;

后面也可以加条件进行查询

SQL 复制代码
SELECT id, score points, name FROM students WHERE gender = 'M';

(4)排序

我们使用SELECT查询时,细心的读者可能注意到,查询结果集通常是按照id排序的,也就是根据主键排序。这也是大部分数据库的做法。如果我们要根据其他条件排序怎么办?可以加上ORDER BY子句。例如按照成绩从低到高进行排序:

SQL 复制代码
SELECT id, name, gender, score FROM students ORDER BY score;

如果要反过来,按照成绩从高到底排序,我们可以加上DESC表示"倒序":

SQL 复制代码
SELECT id, name, gender, score FROM students ORDER BY score DESC;

如果score列有相同的数据,要进一步排序,可以继续添加列名。例如,使用ORDER BY score DESC, gender表示先按score列倒序,如果有相同分数的,再按gender列排序:

SQL 复制代码
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;

如果有WHERE子句,那么ORDER BY子句要放到WHERE子句后面。

SQL 复制代码
SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;

(5)分页查询

使用SELECT查询时,如果结果集数据量很大,比如几万行数据,放在一个页面显示的话数据量太大,不如分页显示,每次显示100条。

要实现分页功能,实际上就是从结果集中显示第1-100条记录作为第1页,显示第101-200条记录作为第2页,以此类推。

因此,分页实际上就是从结果集中"截取"出第M~N条记录。这个查询可以通过LIMIT <N-M> OFFSET <M>子句实现。

我们把结果集分页,每页3条记录。要获取第1页的记录,可以使用LIMIT 3 OFFSET 0

SQL 复制代码
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0;

(6)聚合查询

如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗?

这个方法当然可以,但是比较弱智。对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。

仍然以查询students表一共有多少条记录为例,我们可以使用SQL内置的COUNT()函数查询:

SQL 复制代码
SELECT COUNT(*) FROM students;

COUNT(*)COUNT(id)实际上是一样的效果。另外注意,聚合查询同样可以使用WHERE条件,因此我们可以方便地统计出有多少男生、多少女生、多少80分以上的学生等:

除了COUNT()函数外,SQL还提供了如下聚合函数:

函数 说明
SUM 计算某一列的合计值,该列必须为数值类型
AVG 计算某一列的平均值,该列必须为数值类型
MAX 计算某一列的最大值
MIN 计算某一列的最小值

注意,MAX()MIN()函数并不限于数值类型。如果是字符类型,MAX()MIN()会返回排序最后和排序最前的字符。

如下,计算分数平均值

sql 复制代码
SELECT AVG(score) average FROM students WHERE gender='M'

要特别注意:如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()AVG()MAX()MIN()会返回NULL

(7)多表查询

SELECT查询不但可以从一张表查询数据,还可以从多张表同时查询数据。查询多张表的语法是:SELECT * FROM <表1> <表2>

注意,多表查询时,要使用表名.列名这样的方式来引用列和设置别名,这样就避免了结果集的列名重复问题。但是,用表名.列名这种方式列举两个表的所有列实在是很麻烦,所以SQL还允许给表设置一个别名,让我们在投影查询中引用起来稍微简洁一点:

sql 复制代码
SELECT
    s.id sid,
    s.name,
    s.gender,
    s.score,
    c.id cid,
    c.name cname
FROM students s, classes c;

(8)连接查询

连接查询是另一种类型的多表查询。连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地"连接"在主表结果集上。

连接查询有四种:

  1. 内连接:INNER JOIN
  2. 左外连接:LEFT OUTER JOIN
  3. 右外连接:RIGHT OUTER JOIN
  4. 全外连接: FULL OUTER JOIN

内联接如:

sql 复制代码
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
FROM students s
INNER JOIN classes c
ON s.class_id = c.id;

后面的on是连接的条件。

四种连接的差别是:

INNER JOIN是选出两张表都存在的记录;LEFT OUTER JOIN是选出左表存在的记录;RIGHT OUTER JOIN是选出左表存在的记录;FULL OUTER JOIN是选出左右表存在的记录;

2.INSERT

当我们需要向数据库表中插入一条新记录时,就必须使用INSERT语句。 INSERT语句的基本语法是:

sql 复制代码
INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);

我们向students表插入一条新记录,先列举出需要插入的字段名称,然后在VALUES子句中依次写出对应字段的值:

例如简单的学生表:

sql 复制代码
        INSERT INTO students (name,gender,score) VALUES ('小明','男',80);

填写字段的顺序可以与学生表的排序不一致,但是VALUES后面的值必须与前面的字段一一对应。

还有的就是,表的自增字段可以不用写,还有默认值的字段,也可以不用写。

这个插入数据也可以一次性插入多条。如下:

sql 复制代码
INSERT INTO students (name,gender,score) VALUES ('小明','男',80) ,('小红','女',85);

3.UPDATE

如果要更新数据库表中的记录,我们就必须使用UPDATE语句。

UPDATE语句的基本语法是:

SQL 复制代码
UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;

例如:

sql 复制代码
UPDATE students SET name='大牛', score=66 WHERE id=1;

后面这个WHERE是个条件,满足条件就能修改。

所以修改数据时,要注意条件WHERE,不写会把表中的所有记录会被更新,所以,在执行UPDATE语句时要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用UPDATE更新。

4.DELETE

如果要删除数据库表中的记录,我们可以使用DELETE语句。

DELETE语句的基本语法是:

SQL 复制代码
    DELETE FEOM <表名> WHERE ...;

例如:我们想删除students表中id=1的记录,就需要这么写:

sql 复制代码
DELETE FROM students WHERE id=1;

后面这个WHERE条件跟更新的也是一样,也要注意,不写的话会把整个表的所有记录删除。最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用UPDATE更新。

相关推荐
Csvn20 小时前
📊 SQL 入门 Day 12: 窗口函数基础
后端·sql
安_21 小时前
MySQL SQL 调优完整指南
数据库·sql·mysql
我命由我123451 天前
SQLite 数据库参数数量超限导致的崩溃问题:SQLiteException: too many SQL variables
java·数据库·sql·java-ee·sqlite·android-studio·android runtime
Lethehong1 天前
【金仓数据库征文】AI 直连国产数据库——KES MCP Server 自然语言查库与 SQL 调优实战
数据库·人工智能·sql·金仓数据库征文
阿里云大数据AI技术1 天前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
jnrjian2 天前
psql 执行多个 sql 文件
数据库·sql
long3162 天前
PostgreSQL 学习资料大全:从入门到精通
java·数据库·sql·postgresql
阳光九叶草LXGZXJ2 天前
达梦数据库-报错-11-cmd 13 validate error
linux·运维·数据库·sql·学习
染指11102 天前
72.高级RAG-sql检索器
python·sql·mysql·llama·llamaindex·高级rag
long3162 天前
PostgreSQL 学习资料 · 入门 / 练习 / 精通 / 扩展
java·数据结构·数据库·spring boot·sql·postgresql·数据库开发