欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > SQL刷题快速入门(一)

SQL刷题快速入门(一)

2025/1/10 8:06:18 来源:https://blog.csdn.net/qq_51907069/article/details/145017279  浏览:    关键词:SQL刷题快速入门(一)

SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的一种标准计算机语言。SQL最初由IBM在20世纪70年代开发,并且自1986年以来,它已经被美国国家标准协会(ANSI)和国际标准化组织(ISO)作为标准发布。

SQL的主要用途包括:

  • 数据查询:通过SELECT语句从数据库中检索数据。
  • 数据更新:使用INSERTUPDATEDELETE语句来添加、修改或移除数据库中的数据。
  • 数据定义:利用CREATEALTERDROP等语句创建、修改或删除数据库对象,如表、索引、视图等。
  • 数据控制:使用GRANTREVOKE等语句管理对数据库的访问权限。
  • 事务控制:通过COMMITROLLBACKSAVEPOINT等语句管理事务,以确保数据的一致性和完整性。

SQL是一种声明式语言,用户指定想要的数据,而不是具体的操作步骤。这意味着编写SQL语句时,你只需说明要执行什么操作,而具体的实现细节则由数据库管理系统(DBMS)负责处理。

此外,SQL还支持复杂查询,例如连接多个表、聚合函数(如SUM()COUNT())、子查询、以及全文搜索等功能。尽管SQL是关系型数据库的标准语言,但不同的数据库系统可能会有自己特有的扩展和方言。因此,在学习SQL时,除了掌握标准语法外,了解特定数据库系统的特性也是很重要的。

SQL语法统一模板

SELECTcolumn1,column2,-- 可以选择多个列或者使用 * 来选择所有列-- 可以使用 AS 来给列起别名function(column_name) AS alias_name
FROMtable_name
-- 如果需要,可以加入一个或多个表进行连接
JOIN another_tableON table_name.common_column = another_table.common_column
-- 可以使用 WHERE 子句来过滤结果
WHEREcondition1 AND/OR condition2
-- 可以使用 GROUP BY 子句来对结果进行分组
GROUP BYcolumn1,column2
-- 可以使用 HAVING 子句来对分组后的结果进行过滤
HAVINGgroup_condition
-- 可以使用 ORDER BY 子句来对结果进行排序
ORDER BYcolumn1 ASC, -- 升序排序column2 DESC -- 降序排序
-- 如果需要,可以使用 LIMIT 子句来限制返回的行数
LIMITrow_count OFFSET offset_value;

mysql执行查询代码的顺序

SQL查询的执行顺序与您编写查询的顺序不完全相同。以下是SQL查询通常的执行顺序:

  1. FROM/JOIN:确定查询的数据来源,以及如何通过JOIN子句连接不同的表。
  2. WHERE:基于指定的条件过滤FROMJOIN子句返回的行。
  3. GROUP BY:将过滤后的结果分组。
  4. HAVING:对分组后的结果进行进一步过滤,通常基于聚合函数。
  5. SELECT:选择要显示的列。
  6. DISTINCT:如果使用了DISTINCT关键字,则在此时去除重复的行。
  7. ORDER BY:根据指定的列对结果进行排序。
  8. LIMIT/OFFSET:如果使用了LIMIT或OFFSET子句,则在此时对排序后的结果进行分页。
    以下是这个顺序的一个简化的例子:
SELECT column1, column2, AGGREGATE_FUNCTION(column3)
FROM table1
JOIN table2 ON table1.id = table2.id
WHERE condition
GROUP BY column1, column2
HAVING condition
ORDER BY column1
LIMIT 10;

实际的执行顺序是:

  1. FROM table1 JOIN table2 ON table1.id = table2.id
  2. WHERE condition
  3. GROUP BY column1, column2
  4. HAVING condition
  5. SELECT column1, column2, AGGREGATE_FUNCTION(column3)
  6. ORDER BY column1
  7. LIMIT 10
    需要注意的是,虽然这是逻辑上的执行顺序,但实际上数据库优化器可能会根据查询的成本和数据库的内部机制来调整这个顺序以获得更好的性能。

不要把"date"写成"data" !!! 检查!!!

debug

ambiguous的意思是模糊不清的,如果说某一属性是模糊不清的,那么大概率是两个表有同一名称栏,这时候需要在属性前加上表名的前缀进行限制,例如t1.id

例如:

SQL_ERROR_INFO: “Column ‘device_id’ in field list is ambiguous”

这时就要检查device_id是不是同时出现在多个表中,要在查询语句中加上表名.device_id

排序ASC和DESC

ASCDESC是SQL中用于ORDER BY子句的排序关键字,它们的全称分别是:

  • ASC: Ascending(升序)
  • DESC: Descending(降序)
    这些关键字告诉数据库管理系统按照升序或降序来排列查询结果。升序意味着从小到大排序,而降序则相反,从大到小排序。

distinct

注意:

select distinct id, date from qpd 相当于同时对 id和 date进行修饰,无论id相同,date不同,或者date相同,id不同,都算作为唯一列,符合distinct 要求

在 SQL 中,当你使用 select distinct column1, column2, ... 语法时,distinct 关键字是应用于所有列的组合,而不是单独的每一列。这意味着返回的结果集中 column1column2 的组合必须是唯一的。

在SQL中,DISTINCT关键字用于去除查询结果中的重复行,只返回唯一的记录。当你想要从数据库表中检索不同的(唯一的)值时,DISTINCT非常有用。
这里是一个使用DISTINCT关键字的基本例子:

SELECT DISTINCT column_name FROM table_name;

这个查询将从table_name表中选取column_name列的唯一值。
如果你想要对多个列使用DISTINCT,可以这样做:

SELECT DISTINCT column1, column2 FROM table_name;

这个查询将返回column1column2组合的唯一值。换句话说,如果column1column2的值在多行中是相同的,那么这些行将被合并为一条记录在结果集中显示。
请注意,使用DISTINCT可能会影响查询的性能,因为它需要数据库系统做额外的工作来识别和消除重复的行。因此,在处理大量数据时应该谨慎使用。

为列和表取别名

在SQL中,使用AS关键字来为列或表重命名是一个常见的做法,它提高了查询的可读性。然而,在某些情况下,你可以省略AS关键字,直接在列名后面写上新的别名。
以下是不使用AS关键字进行重命名的示例:

SELECT column_name new_alias FROM table_name;

在这个查询中,column_name被重命名为new_alias,而没有使用AS
同样的规则也适用于表的重命名:

SELECT t.column_name FROM table_name t;

在这个例子中,table_name被重命名为t,之后可以通过t来引用表。
虽然省略AS是可行的,但是使用AS可以增加查询的可读性和清晰度,特别是在复杂的查询或涉及多个表和列的别名时。因此,即使不是强制性的,许多开发者和数据库管理员仍然倾向于使用AS

=和is !=和is not

在SQL中,=IS 通常用于比较操作,但它们在用法和上下文上有所不同。

  1. = (等于)运算符:

    • 用于比较两个值是否相等。
    • 可以用于比较数字、字符串或日期等数据类型。
    • 当比较的是 NULL 值时,使用 = 可能不会得到期望的结果,因为 NULL 与任何值(包括另一个 NULL)的比较结果都是未知的(在 SQL 中表示为 UNKNOWN)。
      示例:
    SELECT * FROM table_name WHERE column_name = 'value';
    
  2. IS 关键字:

    • 通常用于与 NULL 值进行比较。
    • IS NULL 用于检查值是否为 NULL。
    • IS NOT NULL 用于检查值是否不为 NULL。
    • 不能用于非 NULL 值的比较。
      示例:
    SELECT * FROM table_name WHERE column_name IS NULL;
    

    以下是两者之间的主要区别:

  • 当比较的值可能包含 NULL 时,应使用 IS。例如,要找出某列值为 NULL 的记录,应该使用 IS NULL 而不是 column_name = NULL,因为后者不会返回任何结果。
  • 对于非 NULL 值的比较,通常使用 =
    错误的使用例子:
-- 这不会返回任何包含 NULL 的行
SELECT * FROM table_name WHERE column_name = NULL;

正确的使用例子:

-- 这会返回所有包含 NULL 的行
SELECT * FROM table_name WHERE column_name IS NULL;

总结来说,=IS 在处理 NULL 值时有着明显的不同,而对于非 NULL 值的比较,则通常使用 =

字符匹配

在这里插入图片描述
ps:以上图片转自:https://blog.nowcoder.net/n/459173fa716f41478e98509dd98c4747,水印自动加的,不知道怎么去掉,有知道的朋友麻烦告诉我

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com