标签:存储 描述 block 大小写 定义数据 控制 子查询 集中 unknown
本文针对关系型数据库的一般语法。限于篇幅,本文侧重说明用法,不会展开讲解特性、原理。数据库(database)
?- 保存有组织的数据的容器(通常是一个文件或一组文件)。
数据表(table)
?- 某种特定类型数据的结构化清单。
模式(schema)
?- 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。
列(column)
?- 表中的一个字段。所有表都是由一个或多个列组成的。
行(row)
?- 表中的一个记录。
主键(primary key)
?- 一列(或一组列),其值能够唯一标识表中每一行。SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管理,从而称为 ANSI SQL。各个 DBMS 都有自己的实现,如 PL/SQL、Transact-SQL 等。
SQL 语法结构包括:
子句
?- 是语句和查询的组成成分。(在某些情况下,这些都是可选的。)
表达式
?- 可以产生任何标量值,或由列和行的数据库表
谓词
?- 给需要评估的 SQL 三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程。
查询
?- 基于特定条件检索数据。这是 SQL 的一个重要组成部分。
语句
?- 可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断。例如:SELECT
?与?select
?、Select
?是相同的。
多条 SQL 语句必须以分号(;
)分隔。
-- 一行 SQL 语句
UPDATE user SET username=‘robot‘, password=‘robot‘ WHERE username = ‘root‘;
-- 多行 SQL 语句
UPDATE user
SET username=‘robot‘, password=‘robot‘
WHERE username = ‘root‘;
## 注释1
-- 注释2
/* 注释3 */
数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。
DDL 的主要功能是定义数据库对象。
DDL 的核心指令是?CREATE
、ALTER
、DROP
。
数据操纵语言(Data Manipulation Language, DML)是用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句。
DML 的主要功能是?访问数据,因此其语法都是以读写数据库为主。
DML 的核心指令是?INSERT
、UPDATE
、DELETE
、SELECT
。这四个指令合称 CRUD(Create, Read, Update, Delete),即增删改查。
事务控制语言 (Transaction Control Language, TCL) 用于管理数据库中的事务。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。
TCL 的核心指令是?COMMIT
、ROLLBACK
。
数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。
DCL 的核心指令是?GRANT
、REVOKE
。
DCL 以控制用户的访问权限为主,因此其指令作法并不复杂,可利用 DCL 控制的权限有:CONNECT
、SELECT
、INSERT
、UPDATE
、DELETE
、EXECUTE
、USAGE
、REFERENCES
。
根据不同的 DBMS 以及不同的安全性实体,其支持的权限控制也有所不同。
(以下为 DML 语句用法)
增删改查,又称为 CRUD,数据库基本操作中的基本操作。
INSERT INTO
?语句用于向表中插入新记录。
插入完整的行
INSERT INTO user
VALUES (10, ‘root‘, ‘root‘, ‘xxxx@163.com‘);
插入行的一部分
INSERT INTO user(username, password, email)
VALUES (‘admin‘, ‘admin‘, ‘xxxx@163.com‘);
插入查询出来的数据
INSERT INTO user(username)
SELECT name
FROM account;
UPDATE
?语句用于更新表中的记录。
UPDATE user
SET username=‘robot‘, password=‘robot‘
WHERE username = ‘root‘;
DELETE
?语句用于删除表中的记录。TRUNCATE TABLE
?可以清空表,也就是删除所有行。
删除表中的指定数据
DELETE FROM user
WHERE username = ‘robot‘;
清空表中的数据
TRUNCATE TABLE user;
SELECT
?语句用于从数据库中查询数据。DISTINCT
?用于返回唯一不同的值。它作用于所有列,也就是说所有列的值都相同才算相同。LIMIT
?限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;第二个参数为返回的总行数。ASC
?:升序(默认)DESC
?:降序
查询单列
SELECT prod_name
FROM products;
查询多列
SELECT prod_id, prod_name, prod_price
FROM products;
查询所有列
ELECT *
FROM products;
查询不同的值
SELECT DISTINCT
vend_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_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
FROM orders
WHERE order_num IN (SELECT order_num
FROM orderitems
WHERE prod_id = ‘RGAN01‘));
WHERE
?子句用于过滤记录,即缩小访问数据的范围。
WHERE
?后跟一个返回?true
?或?false
?的条件。
WHERE
?可以与?SELECT
,UPDATE
?和?DELETE
?一起使用。
WHERE
?子句中使用的操作符运算符 | 描述 |
---|---|
= | 等于 |
<> | 不等于。注释:在 SQL 的一些版本中,该操作符可被写成 != |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
IN | 指定针对某个列的多个可能值 |
SELECT
?语句中的?WHERE
?子句
SELECT * FROM Customers
WHERE cust_name = ‘Kids Place‘;
UPDATE
?语句中的?WHERE
?子句
UPDATE Customers
SET cust_name = ‘Jack Jones‘
WHERE cust_name = ‘Kids Place‘;
DELETE
?语句中的?WHERE
?子句
DELETE FROM Customers
WHERE cust_name = ‘Kids Place‘;
IN
?操作符在?WHERE
?子句中使用,作用是在指定的几个特定值中任选一个值。
BETWEEN
?操作符在?WHERE
?子句中使用,作用是选取介于某个范围内的值。IN 示例
SELECT *
FROM products
WHERE vend_id IN (‘DLL01‘, ‘BRS01‘);
BETWEEN 示例
SELECT *
FROM products
WHERE prod_price BETWEEN 3 AND 5;
AND
、OR
、NOT
?是用于对过滤条件的逻辑处理指令。
AND
?优先级高于?OR
,为了明确处理顺序,可以使用?()
。
AND
?操作符表示左右条件都要满足。
OR
?操作符表示左右条件满足任意一个即可。
NOT
?操作符用于否定一个条件。AND 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = ‘DLL01‘ AND prod_price <= 4;
OR 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE vend_id = ‘DLL01‘ OR vend_id = ‘BRS01‘;
NOT 示例
SELECT *
FROM products
WHERE prod_price NOT BETWEEN 3 AND 5;
LIKE
?操作符在?WHERE
?子句中使用,作用是确定字符串是否匹配模式。
只有字段是文本值时才使用?LIKE
。
LIKE
?支持两个通配符匹配选项:%
?和?_
。
不要滥用通配符,通配符位于开头处匹配会非常慢。
%
?表示任何字符出现任意次数。
_
?表示任何字符出现一次。% 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE ‘%bean bag%‘;
_ 示例
SELECT prod_id, prod_name, prod_price
FROM products
WHERE prod_name LIKE ‘__ inch teddy bear‘;
- 如果一个?
JOIN
?至少有一个公共字段并且它们之间存在关系,则该?JOIN
?可以在两个或多个表上工作。- 连接用于连接多个表,使用?
JOIN
?关键字,并且条件语句使用?ON
?而不是?WHERE
。JOIN
?保持基表(结构和数据)不变。JOIN
?有两种连接类型:内连接和外连接。- 内连接又称等值连接,使用 INNER?
JOIN
?关键字。在没有条件语句的情况下返回笛卡尔积。- 自连接可以看成内连接的一种,只是连接的表是自身而已。
- 自然连接是把同名列通过 = 测试连接起来的,同名列可以有多个。
- 内连接 vs 自然连接
- 内连接提供连接的列,而自然连接自动连接所有同名列。
- 外连接返回一个表中的所有行,并且仅返回来自次表中满足连接条件的那些行,即两个表中的列是相等的。外连接分为左外连接、右外连接、全外连接(Mysql 不支持)。
- 左外连接就是保留左表没有关联的行。
- 右外连接就是保留右表没有关联的行。
- 连接 vs 子查询
- 连接可以替换子查询,并且比子查询的效率一般会更快。
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id;
SELECT c1.cust_id, c1.cust_name, c1.cust_contact
FROM customers c1, customers c2WHERE c1.cust_name = c2.cust_name
AND c2.cust_contact = ‘Jim Jones‘;
SELECT *
FROM Products
NATURAL JOIN Customers;
SELECT customers.cust_id, orders.order_num
FROM customers LEFT JOIN orders
ON customers.cust_id = orders.cust_id;
SELECT customers.cust_id, orders.order_num
FROM customers RIGHT JOIN orders
ON customers.cust_id = orders.cust_id;
UNION
?运算符将两个或更多查询的结果组合起来,并生成一个结果集,其中包含来自?UNION
?中参与查询的提取行。
UNION
?基本规则
所有查询的列数和列顺序必须相同。
每个查询中涉及表的列的数据类型必须相同或兼容。
通常返回的列名取自第一个查询。
默认会去除相同行,如果需要保留相同行,使用?UNION ALL
。
只能包含一个?ORDER BY
?子句,并且必须位于语句的最后。
应用场景
在一个查询中从不同的表返回结构数据。
组合查询
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_state IN (‘IL‘, ‘IN‘, ‘MI‘)
UNION
SELECT cust_name, cust_contact, cust_email
FROM customers
WHERE cust_name = ‘Fun4All‘;
JOIN vs UNION
JOIN
?中连接表的列可能不同,但在?UNION
?中,所有查询的列数和列顺序必须相同。
UNION
?将查询之后的行放在一起(垂直放置),但?JOIN
?将查询之后的列放在一起(水平放置),即它构成一个笛卡尔积。建议收藏 | 超值干货:SQL 语法速成手册,12800字超长总结!
标签:存储 描述 block 大小写 定义数据 控制 子查询 集中 unknown
原文地址:https://blog.51cto.com/14570694/2509170