2023年8月3日发(作者:)

SQL语法(超级详细)⼀、基本概念数据库术语数据库(database) - 保存有组织的数据的容器(通常是⼀个⽂件或⼀组⽂件)。数据表(table) - 某种特定类型数据的结构化清单。模式(schema) - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。列(column) - 表中的⼀个字段。所有表都是由⼀个或多个列组成的。⾏(row) - 表中的⼀个记录。主键(primary key) - ⼀列(或⼀组列),其值能够唯⼀标识表中每⼀⾏。SQL 语法SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从⽽称为 ANSI SQL。各个 DBMS 都有⾃⼰的实现,如 PL/SQL、Transact-SQL 等。SQL 语法结构SQL 语法结构包括:⼦句 - 是语句和查询的组成成分。(在某些情况下,这些都是可选的。)表达式 - 可以产⽣任何标量值,或由列和⾏的数据库表谓词 - 给需要评估的 SQL 三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。查询 - 基于特定条件检索数据。这是 SQL 的⼀个重要组成部分。语句 - 可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断。SQL 语法要点SQL 语句不区分⼤⼩写,但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置。例如:SELECT 与 select 、Select 是相同的。多条 SQL 语句必须以分号(;)分隔。处理 SQL 语句时,所有空格都被忽略。SQL 语句可以写成⼀⾏,也可以分写为多⾏。-- ⼀⾏ SQL 语句UPDATE user SET username='robot', password='robot' WHERE username = 'root';-- 多⾏ SQL 语句UPDATE userSET username='robot', password='robot'WHERE username = 'root';SQL ⽀持三种注释## 注释1-- 注释2/* 注释3 */SQL 分类数据定义语⾔(DDL)数据定义语⾔(Data Definition Language,DDL)是 SQL 语⾔集中负责数据结构定义与数据库对象定义的语⾔。DDL 的主要功能是定义数据库对象。DDL 的核⼼指令是 CREATE、ALTER、DROP。数据操纵语⾔(DML)数据操纵语⾔(Data Manipulation Language, DML)是⽤于数据库操作,对数据库其中的对象和数据运⾏访问⼯作的编程语句。DML 的主要功能是 访问数据,因此其语法都是以读写数据库为主。DML 的核⼼指令是 INSERT、UPDATE、DELETE、SELECT。这四个指令合称 CRUD(Create, Read, Update, Delete),即增删改查。事务控制语⾔(TCL)事务控制语⾔ (Transaction Control Language, TCL) ⽤于管理数据库中的事务。这些⽤于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。TCL 的核⼼指令是 COMMIT、ROLLBACK。数据控制语⾔(DCL)数据控制语⾔ (Data Control Language, DCL) 是⼀种可对数据访问权进⾏控制的指令,它可以控制特定⽤户账户对数据表、查看表、预存程序、⽤户⾃定义函数等数据库对象的控制权。DCL 的核⼼指令是 GRANT、REVOKE。DCL 以控制⽤户的访问权限为主,因此其指令作法并不复杂,可利⽤ DCL 控制的权限有:CONNECT、SELECT、INSERT、UPDATE、DELETE、EXECUTE、USAGE、REFERENCES。根据不同的 DBMS 以及不同的安全性实体,其⽀持的权限控制也有所不同。(以下为 DML 语句⽤法)⼆、增删改查增删改查,⼜称为 CRUD,数据库基本操作中的基本操作。插⼊数据INSERT INTO 语句⽤于向表中插⼊新记录。插⼊完整的⾏INSERT INTO userVALUES (10, 'root', 'root', 'xxxx@');插⼊⾏的⼀部分INSERT INTO user(username, password, email)VALUES ('admin', 'admin', 'xxxx@');插⼊查询出来的数据INSERT INTO user(username)SELECT nameFROM account;更新数据UPDATE 语句⽤于更新表中的记录。UPDATE userSET username='robot', password='robot'WHERE username = 'root';删除数据DELETE 语句⽤于删除表中的记录。TRUNCATE TABLE 可以清空表,也就是删除所有⾏。删除表中的指定数据DELETE FROM userWHERE username = 'robot';清空表中的数据TRUNCATE TABLE user;查询数据SELECT 语句⽤于从数据库中查询数据。DISTINCT ⽤于返回唯⼀不同的值。它作⽤于所有列,也就是说所有列的值都相同才算相同。LIMIT限制返回的⾏数。可以有两个参数,第⼀个参数为起始⾏,从 0 开始;第⼆个参数为返回的总⾏数。ASC :升序(默认)DESC :降序查询单列SELECT prod_nameFROM products;查询多列SELECT prod_id, prod_name, prod_priceFROM products;查询所有列ELECT *FROM products;查询不同的值SELECT DISTINCTvend_id FROM products;限制查询结果-- 返回前 5 ⾏SELECT * FROM mytable LIMIT 5;SELECT * FROM mytable LIMIT 0, 5;-- 返回第 3 ~ 5 ⾏SELECT * FROM mytable LIMIT 2, 3;三、⼦查询⼦查询是嵌套在较⼤查询中的 SQL 查询。⼦查询也称为内部查询或内部选择,⽽包含⼦查询的语句也称为外部查询或外部选择。⼦查询可以嵌套在 SELECT,INSERT,UPDATE 或 DELETE 语句内或另⼀个⼦查询中。⼦查询通常会在另⼀个 SELECT 语句的 WHERE ⼦句中添加。您可以使⽤⽐较运算符,如 >,<,或 =。⽐较运算符也可以是多⾏运算符,如IN,ANY 或 ALL。⼦查询必须被圆括号 () 括起来。内部查询⾸先在其⽗查询之前执⾏,以便可以将内部查询的结果传递给外部查询。执⾏过程可以参考下图:⼦查询的⼦查询SELECT cust_name, cust_contactFROM customersWHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'RGAN01'));WHEREWHERE ⼦句⽤于过滤记录,即缩⼩访问数据的范围。WHERE 后跟⼀个返回 true 或 false 的条件。WHERE 可以与 SELECT,UPDATE 和 DELETE ⼀起使⽤。可以在 WHERE ⼦句中使⽤的操作符运算符=<>><>=<=BETWEENLIKEIN描述等于不等于。注释:在 SQL 的⼀些版本中,该操作符可被写成 !=⼤于⼩于⼤于等于⼩于等于在某个范围内搜索某种模式指定针对某个列的多个可能值SELECT 语句中的 WHERE ⼦句SELECT * FROM CustomersWHERE cust_name = 'Kids Place';UPDATE 语句中的 WHERE ⼦句UPDATE CustomersSET cust_name = 'Jack Jones'WHERE cust_name = 'Kids Place';DELETE 语句中的 WHERE ⼦句DELETE FROM CustomersWHERE cust_name = 'Kids Place';IN 和 BETWEENIN 操作符在 WHERE ⼦句中使⽤,作⽤是在指定的⼏个特定值中任选⼀个值。BETWEEN 操作符在 WHERE ⼦句中使⽤,作⽤是选取介于某个范围内的值。IN ⽰例SELECT *FROM productsWHERE vend_id IN ('DLL01', 'BRS01');BETWEEN ⽰例SELECT *FROM productsWHERE prod_price BETWEEN 3 AND 5;AND、OR、NOTAND、OR、NOT 是⽤于对过滤条件的逻辑处理指令。AND 优先级⾼于 OR,为了明确处理顺序,可以使⽤ ()。AND 操作符表⽰左右条件都要满⾜。OR 操作符表⽰左右条件满⾜任意⼀个即可。NOT 操作符⽤于否定⼀个条件。AND ⽰例SELECT prod_id, prod_name, prod_priceFROM productsWHERE vend_id = 'DLL01' AND prod_price <= 4;OR ⽰例SELECT prod_id, prod_name, prod_priceFROM productsWHERE vend_id = 'DLL01' OR vend_id = 'BRS01';NOT ⽰例SELECT *FROM productsWHERE prod_price NOT BETWEEN 3 AND 5;LIKELIKE 操作符在 WHERE ⼦句中使⽤,作⽤是确定字符串是否匹配模式。只有字段是⽂本值时才使⽤ LIKE。LIKE ⽀持两个通配符匹配选项:% 和 _。不要滥⽤通配符,通配符位于开头处匹配会⾮常慢。% 表⽰任何字符出现任意次数。_ 表⽰任何字符出现⼀次。% ⽰例SELECT prod_id, prod_name, prod_priceFROM productsWHERE prod_name LIKE '%bean bag%';_ ⽰例SELECT prod_id, prod_name, prod_priceFROM productsWHERE prod_name LIKE '__ inch teddy bear';四、连接和组合连接(JOIN)如果⼀个 JOIN ⾄少有⼀个公共字段并且它们之间存在关系,则该 JOIN 可以在两个或多个表上⼯作。连接⽤于连接多个表,使⽤ JOIN 关键字,并且条件语句使⽤ ON ⽽不是 WHERE。JOIN 保持基表(结构和数据)不变。JOIN 有两种连接类型:内连接和外连接。内连接⼜称等值连接,使⽤ INNERJOIN关键字。在没有条件语句的情况下返回笛卡尔积。⾃连接可以看成内连接的⼀种,只是连接的表是⾃⾝⽽已。⾃然连接是把同名列通过 = 测试连接起来的,同名列可以有多个。内连接 vs ⾃然连接内连接提供连接的列,⽽⾃然连接⾃动连接所有同名列。外连接返回⼀个表中的所有⾏,并且仅返回来⾃次表中满⾜连接条件的那些⾏,即两个表中的列是相等的。外连接分为左外连接、右外连接、全外连接(Mysql 不⽀持)。左外连接就是保留左表没有关联的⾏。右外连接就是保留右表没有关联的⾏。连接 vs ⼦查询连接可以替换⼦查询,并且⽐⼦查询的效率⼀般会更快。 内连接(INNER JOIN)SELECT vend_name, prod_name, prod_priceFROM vendors INNER JOIN productsON _id = _id;⾃连接SELECT _id, _name, _contactFROM customers c1, customers c2WHERE _name = _nameAND _contact = 'Jim Jones';⾃然连接(NATURAL JOIN)SELECT *FROM ProductsNATURAL JOIN Customers;左连接(LEFT JOIN)SELECT _id, _numFROM customers LEFT JOIN ordersON _id = _id;右连接(RIGHT JOIN)SELECT _id, _numFROM customers RIGHT JOIN ordersON _id = _id;组合(UNION)UNION 运算符将两个或更多查询的结果组合起来,并⽣成⼀个结果集,其中包含来⾃ UNION 中参与查询的提取⾏。UNION基本规则所有查询的列数和列顺序必须相同。每个查询中涉及表的列的数据类型必须相同或兼容。通常返回的列名取⾃第⼀个查询。默认会去除相同⾏,如果需要保留相同⾏,使⽤ UNION ALL。只能包含⼀个 ORDER BY ⼦句,并且必须位于语句的最后。应⽤场景在⼀个查询中从不同的表返回结构数据。对⼀个表执⾏多个查询,按⼀个查询返回数据。组合查询SELECT cust_name, cust_contact, cust_emailFROM customersWHERE cust_state IN ('IL', 'IN', 'MI')UNIONSELECT cust_name, cust_contact, cust_emailFROM customersWHERE cust_name = 'Fun4All';JOIN vs UNIONJOIN vs UNIONJOIN 中连接表的列可能不同,但在 UNION 中,所有查询的列数和列顺序必须相同。UNION 将查询之后的⾏放在⼀起(垂直放置),但 JOIN 将查询之后的列放在⼀起(⽔平放置),即它构成⼀个笛卡尔积。五、函数

2023年8月3日发(作者:)

SQL语法(超级详细)⼀、基本概念数据库术语数据库(database) - 保存有组织的数据的容器(通常是⼀个⽂件或⼀组⽂件)。数据表(table) - 某种特定类型数据的结构化清单。模式(schema) - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。列(column) - 表中的⼀个字段。所有表都是由⼀个或多个列组成的。⾏(row) - 表中的⼀个记录。主键(primary key) - ⼀列(或⼀组列),其值能够唯⼀标识表中每⼀⾏。SQL 语法SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从⽽称为 ANSI SQL。各个 DBMS 都有⾃⼰的实现,如 PL/SQL、Transact-SQL 等。SQL 语法结构SQL 语法结构包括:⼦句 - 是语句和查询的组成成分。(在某些情况下,这些都是可选的。)表达式 - 可以产⽣任何标量值,或由列和⾏的数据库表谓词 - 给需要评估的 SQL 三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。查询 - 基于特定条件检索数据。这是 SQL 的⼀个重要组成部分。语句 - 可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断。SQL 语法要点SQL 语句不区分⼤⼩写,但是数据库表名、列名和值是否区分,依赖于具体的 DBMS 以及配置。例如:SELECT 与 select 、Select 是相同的。多条 SQL 语句必须以分号(;)分隔。处理 SQL 语句时,所有空格都被忽略。SQL 语句可以写成⼀⾏,也可以分写为多⾏。-- ⼀⾏ SQL 语句UPDATE user SET username='robot', password='robot' WHERE username = 'root';-- 多⾏ SQL 语句UPDATE userSET username='robot', password='robot'WHERE username = 'root';SQL ⽀持三种注释## 注释1-- 注释2/* 注释3 */SQL 分类数据定义语⾔(DDL)数据定义语⾔(Data Definition Language,DDL)是 SQL 语⾔集中负责数据结构定义与数据库对象定义的语⾔。DDL 的主要功能是定义数据库对象。DDL 的核⼼指令是 CREATE、ALTER、DROP。数据操纵语⾔(DML)数据操纵语⾔(Data Manipulation Language, DML)是⽤于数据库操作,对数据库其中的对象和数据运⾏访问⼯作的编程语句。DML 的主要功能是 访问数据,因此其语法都是以读写数据库为主。DML 的核⼼指令是 INSERT、UPDATE、DELETE、SELECT。这四个指令合称 CRUD(Create, Read, Update, Delete),即增删改查。事务控制语⾔(TCL)事务控制语⾔ (Transaction Control Language, TCL) ⽤于管理数据库中的事务。这些⽤于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。TCL 的核⼼指令是 COMMIT、ROLLBACK。数据控制语⾔(DCL)数据控制语⾔ (Data Control Language, DCL) 是⼀种可对数据访问权进⾏控制的指令,它可以控制特定⽤户账户对数据表、查看表、预存程序、⽤户⾃定义函数等数据库对象的控制权。DCL 的核⼼指令是 GRANT、REVOKE。DCL 以控制⽤户的访问权限为主,因此其指令作法并不复杂,可利⽤ DCL 控制的权限有:CONNECT、SELECT、INSERT、UPDATE、DELETE、EXECUTE、USAGE、REFERENCES。根据不同的 DBMS 以及不同的安全性实体,其⽀持的权限控制也有所不同。(以下为 DML 语句⽤法)⼆、增删改查增删改查,⼜称为 CRUD,数据库基本操作中的基本操作。插⼊数据INSERT INTO 语句⽤于向表中插⼊新记录。插⼊完整的⾏INSERT INTO userVALUES (10, 'root', 'root', 'xxxx@');插⼊⾏的⼀部分INSERT INTO user(username, password, email)VALUES ('admin', 'admin', 'xxxx@');插⼊查询出来的数据INSERT INTO user(username)SELECT nameFROM account;更新数据UPDATE 语句⽤于更新表中的记录。UPDATE userSET username='robot', password='robot'WHERE username = 'root';删除数据DELETE 语句⽤于删除表中的记录。TRUNCATE TABLE 可以清空表,也就是删除所有⾏。删除表中的指定数据DELETE FROM userWHERE username = 'robot';清空表中的数据TRUNCATE TABLE user;查询数据SELECT 语句⽤于从数据库中查询数据。DISTINCT ⽤于返回唯⼀不同的值。它作⽤于所有列,也就是说所有列的值都相同才算相同。LIMIT限制返回的⾏数。可以有两个参数,第⼀个参数为起始⾏,从 0 开始;第⼆个参数为返回的总⾏数。ASC :升序(默认)DESC :降序查询单列SELECT prod_nameFROM products;查询多列SELECT prod_id, prod_name, prod_priceFROM products;查询所有列ELECT *FROM products;查询不同的值SELECT DISTINCTvend_id FROM products;限制查询结果-- 返回前 5 ⾏SELECT * FROM mytable LIMIT 5;SELECT * FROM mytable LIMIT 0, 5;-- 返回第 3 ~ 5 ⾏SELECT * FROM mytable LIMIT 2, 3;三、⼦查询⼦查询是嵌套在较⼤查询中的 SQL 查询。⼦查询也称为内部查询或内部选择,⽽包含⼦查询的语句也称为外部查询或外部选择。⼦查询可以嵌套在 SELECT,INSERT,UPDATE 或 DELETE 语句内或另⼀个⼦查询中。⼦查询通常会在另⼀个 SELECT 语句的 WHERE ⼦句中添加。您可以使⽤⽐较运算符,如 >,<,或 =。⽐较运算符也可以是多⾏运算符,如IN,ANY 或 ALL。⼦查询必须被圆括号 () 括起来。内部查询⾸先在其⽗查询之前执⾏,以便可以将内部查询的结果传递给外部查询。执⾏过程可以参考下图:⼦查询的⼦查询SELECT cust_name, cust_contactFROM customersWHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'RGAN01'));WHEREWHERE ⼦句⽤于过滤记录,即缩⼩访问数据的范围。WHERE 后跟⼀个返回 true 或 false 的条件。WHERE 可以与 SELECT,UPDATE 和 DELETE ⼀起使⽤。可以在 WHERE ⼦句中使⽤的操作符运算符=<>><>=<=BETWEENLIKEIN描述等于不等于。注释:在 SQL 的⼀些版本中,该操作符可被写成 !=⼤于⼩于⼤于等于⼩于等于在某个范围内搜索某种模式指定针对某个列的多个可能值SELECT 语句中的 WHERE ⼦句SELECT * FROM CustomersWHERE cust_name = 'Kids Place';UPDATE 语句中的 WHERE ⼦句UPDATE CustomersSET cust_name = 'Jack Jones'WHERE cust_name = 'Kids Place';DELETE 语句中的 WHERE ⼦句DELETE FROM CustomersWHERE cust_name = 'Kids Place';IN 和 BETWEENIN 操作符在 WHERE ⼦句中使⽤,作⽤是在指定的⼏个特定值中任选⼀个值。BETWEEN 操作符在 WHERE ⼦句中使⽤,作⽤是选取介于某个范围内的值。IN ⽰例SELECT *FROM productsWHERE vend_id IN ('DLL01', 'BRS01');BETWEEN ⽰例SELECT *FROM productsWHERE prod_price BETWEEN 3 AND 5;AND、OR、NOTAND、OR、NOT 是⽤于对过滤条件的逻辑处理指令。AND 优先级⾼于 OR,为了明确处理顺序,可以使⽤ ()。AND 操作符表⽰左右条件都要满⾜。OR 操作符表⽰左右条件满⾜任意⼀个即可。NOT 操作符⽤于否定⼀个条件。AND ⽰例SELECT prod_id, prod_name, prod_priceFROM productsWHERE vend_id = 'DLL01' AND prod_price <= 4;OR ⽰例SELECT prod_id, prod_name, prod_priceFROM productsWHERE vend_id = 'DLL01' OR vend_id = 'BRS01';NOT ⽰例SELECT *FROM productsWHERE prod_price NOT BETWEEN 3 AND 5;LIKELIKE 操作符在 WHERE ⼦句中使⽤,作⽤是确定字符串是否匹配模式。只有字段是⽂本值时才使⽤ LIKE。LIKE ⽀持两个通配符匹配选项:% 和 _。不要滥⽤通配符,通配符位于开头处匹配会⾮常慢。% 表⽰任何字符出现任意次数。_ 表⽰任何字符出现⼀次。% ⽰例SELECT prod_id, prod_name, prod_priceFROM productsWHERE prod_name LIKE '%bean bag%';_ ⽰例SELECT prod_id, prod_name, prod_priceFROM productsWHERE prod_name LIKE '__ inch teddy bear';四、连接和组合连接(JOIN)如果⼀个 JOIN ⾄少有⼀个公共字段并且它们之间存在关系,则该 JOIN 可以在两个或多个表上⼯作。连接⽤于连接多个表,使⽤ JOIN 关键字,并且条件语句使⽤ ON ⽽不是 WHERE。JOIN 保持基表(结构和数据)不变。JOIN 有两种连接类型:内连接和外连接。内连接⼜称等值连接,使⽤ INNERJOIN关键字。在没有条件语句的情况下返回笛卡尔积。⾃连接可以看成内连接的⼀种,只是连接的表是⾃⾝⽽已。⾃然连接是把同名列通过 = 测试连接起来的,同名列可以有多个。内连接 vs ⾃然连接内连接提供连接的列,⽽⾃然连接⾃动连接所有同名列。外连接返回⼀个表中的所有⾏,并且仅返回来⾃次表中满⾜连接条件的那些⾏,即两个表中的列是相等的。外连接分为左外连接、右外连接、全外连接(Mysql 不⽀持)。左外连接就是保留左表没有关联的⾏。右外连接就是保留右表没有关联的⾏。连接 vs ⼦查询连接可以替换⼦查询,并且⽐⼦查询的效率⼀般会更快。 内连接(INNER JOIN)SELECT vend_name, prod_name, prod_priceFROM vendors INNER JOIN productsON _id = _id;⾃连接SELECT _id, _name, _contactFROM customers c1, customers c2WHERE _name = _nameAND _contact = 'Jim Jones';⾃然连接(NATURAL JOIN)SELECT *FROM ProductsNATURAL JOIN Customers;左连接(LEFT JOIN)SELECT _id, _numFROM customers LEFT JOIN ordersON _id = _id;右连接(RIGHT JOIN)SELECT _id, _numFROM customers RIGHT JOIN ordersON _id = _id;组合(UNION)UNION 运算符将两个或更多查询的结果组合起来,并⽣成⼀个结果集,其中包含来⾃ UNION 中参与查询的提取⾏。UNION基本规则所有查询的列数和列顺序必须相同。每个查询中涉及表的列的数据类型必须相同或兼容。通常返回的列名取⾃第⼀个查询。默认会去除相同⾏,如果需要保留相同⾏,使⽤ UNION ALL。只能包含⼀个 ORDER BY ⼦句,并且必须位于语句的最后。应⽤场景在⼀个查询中从不同的表返回结构数据。对⼀个表执⾏多个查询,按⼀个查询返回数据。组合查询SELECT cust_name, cust_contact, cust_emailFROM customersWHERE cust_state IN ('IL', 'IN', 'MI')UNIONSELECT cust_name, cust_contact, cust_emailFROM customersWHERE cust_name = 'Fun4All';JOIN vs UNIONJOIN vs UNIONJOIN 中连接表的列可能不同,但在 UNION 中,所有查询的列数和列顺序必须相同。UNION 将查询之后的⾏放在⼀起(垂直放置),但 JOIN 将查询之后的列放在⼀起(⽔平放置),即它构成⼀个笛卡尔积。五、函数