SQL经典题目练习

本文详细介绍了SQL语法规则,包括SELECT、FROM、WHERE、DISTINCT、INSERTINTO、UPDATE、DELETE等基本操作,以及ORDERBY、GROUPBY、HAVING、LIKE、BETWEEN和子查询的使用示例,同时提到了Navicat建表注意事项和多表联合查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目标:

提示:SQL语法规则

  • SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。

  • SQL语句以分号结尾。

  • SQL不区分大小写,意味着update与UPDATE相同。

  • 一周掌握 Java 入门知识


数据库表:

数据库通常包含一个或多个表。每个表都用一个名称标识(例如,“Customers"或"Orders”)。该表包含带有数据(行)的记录。
 在本教程中,我们将使用著名的Northwind示例数据库(包括MSAccess和MSSQLServer)。

下面是选自 “Customers” 表的数据:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountryAgeSalary
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany21125
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico421500
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico312000
4Around the HornThomas Hardy120 Hanover Sq.LondonWA1 1DPUK17700
5Berglunds snabbköpChristina BerglundBerguvsvägen 8LuleåS-958 22Sweden635600

上面的表包含五条记录(每一条对应一个客户)和九个列(CustomerID、CustomerName、ContactName、Address、City、PostalCode 和 Country,Age,Salary )。

  • 基本语法:SELECT和FROM
    SELECT column_name(s) FROM table_name

实例:
从 "Customers" 表中选取 "City" 列

select City from Customer;

从 "Customers" 表中选取 "CustomerName" 和 "City" 列

select CustomerName,City from Customer;

从 "Customers" 表中选取所有列
select * from Customer;

  • 基本语法:DISTINCT 去除重复值
    SELECT DISTINCT column_name(s)
    FROM table_name;

实例:
从 "Customers" 表筛选出所有County且去重
select distinct Country from Customer;

  • 基本语法:WHERE 语法 ,用于提取满足指定标准的记录
    SELECT column_name(s)
    FROM table_name
    WHERE condition;

实例:
从"Customers"表中选择其国家为"Mexico"的所有客户
select Country from Customer
where Country=‘Mexico’;

  • 如果是数值字段,则不要使用引号
    从"Customers"表中选择CustomerID = 1的所有客户
    select CustomerID from Customer
    where CustomerID = 1;

  • 基本语法:SQL AND & OR 运算符,用于提取满足多个指定标准的记录

  • And语法:
    SELECT column_name(s)
    FROM table_name
    WHERE condition1 AND condition2 AND condition3 …;

  • Or 语法:
    SELECT column_name(s)
    FROM table_name
    WHERE condition1 OR condition2 OR condition3 …;

  • Not 语法:
    SELECT column_name(s)
    FROM table_name
    WHERE NOT condition;

实例:
从 "Customers" 表中选择其国家为 "Germany" 、其城市为"Berlin" 的所有客户
select Country,City from Customer
where Country = ‘Germany’ and City =‘Berlin’;

从 "Customers" 表中选择城市为“Berlin”或“Germany”的“Customers”的所有字段
select Country,City from Customer
where Country = ‘Germany’ or City =‘Berlin’;

从 "Customers" 表中选择国家不是 "Germany"的"Customers"的所有字段
select Country from Customer
where not Country = ‘Germany’;

  • SQL ORDER BY 关键字,ORDER BY 关键字用于按升序或降序对结果集进行排序。ORDER BY 关键字默认情况下按升序排序记录。如果需要按降序对记录进行排序,可以使用DESC关键字。
    SELECT column_name(s)
    FROM table_name
    ORDER BY column_name(s) ASC|DESC;

从"Customers" 表中选择所有客户,按 "Country" 升序排列,并按 "CustomerName" 列降序排列
select * from Customer
order by Country asc,CustomerName desc;

  • SQL INSERT INTO 语法,用于向表中插入新的数据行。
    INSERT INTO 语句可以用两种形式编写。
  • 第一个表单没有指定要插入数据的列的名称,只提供要插入的值,即可添加一行新的数据:
    INSERT INTO table_name (column1, column2, column3, …)
    VALUES (value1, value2, value3, …);
  • 第二种,如果要为表中的所有列添加值,则不需要在SQL查询中指定列名称。但是,请确保值的顺序与表中的列顺序相同。INSERT INTO语法如下所示:
    INSERT INTO table_name
    VALUES (value1, value2, value3, …);

在"Customers"表中插入一个新顾客的信息,('Cardinal','Tom B. Erichsen','Skagen 21','Stavanger','4006','Norway')
insert into Customer(CustomerName, ContactName, Address, City, PostalCode, Country)
value(‘Cardinal’,‘Tom B. Erichsen’,‘Skagen 21’,‘Stavanger’,‘4006’,‘Norway’);

  • SQL UPDATE 语句,用于更新表中已存在的记录。
    UPDATE table_name
    SET column1 = value1, column2 = value2, …
    WHERE condition;
    把第一个客户(CustomerID = 1),ContactName更新为Alfred Schmidt和“City更新为Frankfurt”
    update Customer
    set ContactName=‘Alfred Schmidt’,City=‘Frankfurt’
    where CustomerID =1;

把国家/地区为"Mexico"的所有记录的联系人姓名更新为“Juan”
update Customer
set CustomerName=‘Juan’
where Country=‘Mexico’;

  • SQL DELETE 语句,用于删除表中现有记录
    DELETE FROM table_name
    WHERE condition;

从"Customers" 表中删除客户“Alfreds Futterkiste”
delete from Customer
where CustomerName=‘Alfreds Futterkiste’;

  • SQL LIKE 语法,用于搜索列中的指定模式,有两个通配符与LIKE运算符一起使用:
    % - 百分号表示零个,一个或多个字符
    _ - 下划线表示单个字符
    ELECT column1, column2, …
    FROM table_name
    WHERE columnN LIKE pattern;
LIKE 运算符描述
WHERE CustomerName LIKE ‘a%’查找以“a”开头的任何值
WHERE CustomerName LIKE ‘%a’查找以“a”结尾的任何值
WHERE CustomerName LIKE ‘%or%’在任何位置查找任何具有“or”的值
WHERE CustomerName LIKE ‘_r%’在第二个位置查找任何具有“r”的值
WHERE CustomerName LIKE ‘a_%_%’查找以“a”开头且长度至少为3个字符的值
WHERE ContactName LIKE ‘a%o’找到以"a"开头,以"o"结尾的值

选择以“a”开头的CustomerName的所有客户
select CustomerName
from Customer
where CustomerName like ‘a%’

  • SQL BETWEEN 运算符,选取介于两个值之间的数据范围内的值
    SELECT column_name(s)
    FROM table_name
    WHERE column_name BETWEEN value1 AND value2;

筛选年龄在20到50之间顾客信息
select Age
from Customer
where Age between 20 and 50;

  • SQL 子查询
    子查询(Sub Query)或者说内查询(Inner Query),也可以称作嵌套查询(Nested Query),是一种嵌套在其他 SQL 查询的 WHERE 子句中的查询。子查询用于为主查询返回其所需数据,或者对检索数据进行进一步的限制。
     使用子查询必须遵循以下几个规则:
  • 子查询必须括在圆括号中
  • 子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较
  • 子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用
  • 返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符
  • SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。
  • 子查询不能直接用在聚合函数中。
  • BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中
    SELECT column_name [, column_name ]
    FROM table1 [, table2 ]
    WHERE column_name OPERATOR
    (SELECT column_name [, column_name ]
    FROM table1 [, table2 ]
    [WHERE])
    查询和Antonio Moreno Taquería 顾客同一个城市/地区的其他人的年纪
    select Age
    from Customer
    where Country =
    (select Country
    from Customer
    where CustomerName=‘Antonio Moreno Taquería’ );

将 CUSTOMERS 表中所有 AGE 大于或者等于 27 的客户的 Salary 字段都变为了原来的 0.25 倍
Update Customer
set Salary=Salary *0.25
where Age in(
select Age
from Customer
where Age> = 27);

  • SQL Group By,通常用于配合聚合函数(如 COUNT()、MAX() 等),根据一个或多个列对结果集进行分组,HAVING 子句的作用:筛选满足条件的组,即在分组后过滤数据,条件中经常包含聚组函数,使用 HAVING 条件过滤出特定的组。
    HAVING​ 子句使你能够指定过滤条件,从而控制查询结果中哪些组可以出现在最终结果里面。
    ​ WHERE ​子句对被选择的列施加条件,而 ​HAVING ​子句则对 ​GROUP BY​ 子句所产生的组施加条件。
    SELECT column1, column2
    FROM table1, table2
    WHERE [ conditions ]
    GROUP BY column1, column2
    HAVING [ conditions ]
    ORDER BY column1, column2

查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩
SELECT Student.StudentID, Student.Name,r.sc – 第二步进行Student表和新表r进行拼接
FROM Student
JOIN

(SELECT StudentID,AVG(score) as sc – 第一步,先查询平均成绩>=60的StudentID
FROM Score
GROUP BY StudentID
HAVING AVG(score)>=60 )as r

WHERE Student.StudentID = r.StudentID;


相关参考

  • Navicat的建表:https://zhuanlan.zhihu.com/p/386161906
  • 创建的时候没有选择字符编码,导致输入中文的时候出现报错
    https://blog.51cto.com/vmuu/4781365
  • 多表联合查询 join 的详细解说:https://zhuanlan.zhihu.com/p/68136613
  • Group by 的详细解说:https://www.cnblogs.com/rainman/archive/2013/05/01/3053703.html
  • 经典50题参考1:https://cloud.tencent.com/developer/article/2055149
  • 经典50题参考2:https://zhuanlan.zhihu.com/p/72223558

学习产出:

百度网盘:
链接:https://pan.baidu.com/s/18MrdbNkURXOfM1XolyNRZw?pwd=Cent
提取码:Cent

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值