SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的一种标准计算机语言。SQL最初由IBM在20世纪70年代开发,并且自1986年以来,它已经被美国国家标准协会(ANSI)和国际标准化组织(ISO)作为标准发布。
SQL的主要用途包括:
- 数据查询:通过
SELECT
语句从数据库中检索数据。 - 数据更新:使用
INSERT
、UPDATE
和DELETE
语句来添加、修改或移除数据库中的数据。 - 数据定义:利用
CREATE
、ALTER
和DROP
等语句创建、修改或删除数据库对象,如表、索引、视图等。 - 数据控制:使用
GRANT
和REVOKE
等语句管理对数据库的访问权限。 - 事务控制:通过
COMMIT
、ROLLBACK
和SAVEPOINT
等语句管理事务,以确保数据的一致性和完整性。
SQL是一种声明式语言,用户指定想要的数据,而不是具体的操作步骤。这意味着编写SQL语句时,你只需说明要执行什么操作,而具体的实现细节则由数据库管理系统(DBMS)负责处理。
此外,SQL还支持复杂查询,例如连接多个表、聚合函数(如SUM()
、COUNT()
)、子查询、以及全文搜索等功能。尽管SQL是关系型数据库的标准语言,但不同的数据库系统可能会有自己特有的扩展和方言。因此,在学习SQL时,除了掌握标准语法外,了解特定数据库系统的特性也是很重要的。
SQL语法统一模板
sql
SELECT
column1,
column2,
-- 可以选择多个列或者使用 * 来选择所有列
-- 可以使用 AS 来给列起别名
function(column_name) AS alias_name
FROM
table_name
-- 如果需要,可以加入一个或多个表进行连接
JOIN another_table
ON table_name.common_column = another_table.common_column
-- 可以使用 WHERE 子句来过滤结果
WHERE
condition1 AND/OR condition2
-- 可以使用 GROUP BY 子句来对结果进行分组
GROUP BY
column1,
column2
-- 可以使用 HAVING 子句来对分组后的结果进行过滤
HAVING
group_condition
-- 可以使用 ORDER BY 子句来对结果进行排序
ORDER BY
column1 ASC, -- 升序排序
column2 DESC -- 降序排序
-- 如果需要,可以使用 LIMIT 子句来限制返回的行数
LIMIT
row_count OFFSET offset_value;
mysql执行查询代码的顺序
SQL查询的执行顺序与您编写查询的顺序不完全相同。以下是SQL查询通常的执行顺序:
- FROM/JOIN:确定查询的数据来源,以及如何通过JOIN子句连接不同的表。
- WHERE :基于指定的条件过滤
FROM
或JOIN
子句返回的行。 - GROUP BY:将过滤后的结果分组。
- HAVING:对分组后的结果进行进一步过滤,通常基于聚合函数。
- SELECT:选择要显示的列。
- DISTINCT:如果使用了DISTINCT关键字,则在此时去除重复的行。
- ORDER BY:根据指定的列对结果进行排序。
- LIMIT/OFFSET :如果使用了LIMIT或OFFSET子句,则在此时对排序后的结果进行分页。
以下是这个顺序的一个简化的例子:
sql
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;
实际的执行顺序是:
- FROM table1 JOIN table2 ON table1.id = table2.id
- WHERE condition
- GROUP BY column1, column2
- HAVING condition
- SELECT column1, column2, AGGREGATE_FUNCTION(column3)
- ORDER BY column1
- 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
ASC 和DESC 是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
关键字是应用于所有列的组合,而不是单独的每一列。这意味着返回的结果集中 column1
和 column2
的组合必须是唯一的。
在SQL中,DISTINCT
关键字用于去除查询结果中的重复行,只返回唯一的记录。当你想要从数据库表中检索不同的(唯一的)值时,DISTINCT
非常有用。
这里是一个使用DISTINCT
关键字的基本例子:
sql
SELECT DISTINCT column_name FROM table_name;
这个查询将从table_name
表中选取column_name
列的唯一值。
如果你想要对多个列使用DISTINCT
,可以这样做:
sql
SELECT DISTINCT column1, column2 FROM table_name;
这个查询将返回column1
和column2
组合的唯一值。换句话说,如果column1
和column2
的值在多行中是相同的,那么这些行将被合并为一条记录在结果集中显示。
请注意,使用DISTINCT
可能会影响查询的性能,因为它需要数据库系统做额外的工作来识别和消除重复的行。因此,在处理大量数据时应该谨慎使用。
为列和表取别名
在SQL中,使用AS
关键字来为列或表重命名是一个常见的做法,它提高了查询的可读性。然而,在某些情况下,你可以省略AS
关键字,直接在列名后面写上新的别名。
以下是不使用AS
关键字进行重命名的示例:
sql
SELECT column_name new_alias FROM table_name;
在这个查询中,column_name
被重命名为new_alias
,而没有使用AS
。
同样的规则也适用于表的重命名:
sql
SELECT t.column_name FROM table_name t;
在这个例子中,table_name
被重命名为t
,之后可以通过t
来引用表。
虽然省略AS
是可行的,但是使用AS
可以增加查询的可读性和清晰度,特别是在复杂的查询或涉及多个表和列的别名时。因此,即使不是强制性的,许多开发者和数据库管理员仍然倾向于使用AS
。
=和is !=和is not
在SQL中,=
和 IS
通常用于比较操作,但它们在用法和上下文上有所不同。
-
=
(等于)运算符:- 用于比较两个值是否相等。
- 可以用于比较数字、字符串或日期等数据类型。
- 当比较的是 NULL 值时,使用
=
可能不会得到期望的结果,因为 NULL 与任何值(包括另一个 NULL)的比较结果都是未知的(在 SQL 中表示为 UNKNOWN)。
示例:
sqlSELECT * FROM table_name WHERE column_name = 'value';
-
IS
关键字:- 通常用于与
NULL
值进行比较。 IS NULL
用于检查值是否为 NULL。IS NOT NULL
用于检查值是否不为 NULL。- 不能用于非 NULL 值的比较。
示例:
sqlSELECT * FROM table_name WHERE column_name IS NULL;
以下是两者之间的主要区别:
- 通常用于与
- 当比较的值可能包含 NULL 时,应使用
IS
。例如,要找出某列值为 NULL 的记录,应该使用IS NULL
而不是column_name = NULL
,因为后者不会返回任何结果。 - 对于非 NULL 值的比较,通常使用
=
。
错误的使用例子:
sql
-- 这不会返回任何包含 NULL 的行
SELECT * FROM table_name WHERE column_name = NULL;
正确的使用例子:
sql
-- 这会返回所有包含 NULL 的行
SELECT * FROM table_name WHERE column_name IS NULL;
总结来说,=
和 IS
在处理 NULL 值时有着明显的不同,而对于非 NULL 值的比较,则通常使用 =
。
字符匹配
ps:以上图片转自:https://blog.nowcoder.net/n/459173fa716f41478e98509dd98c4747,水印自动加的,不知道怎么去掉,有知道的朋友麻烦告诉我