SQL语法
语法结构组成:
子句:是语句和查询的组成成分表达式:可以产生任何标量值,或由行和列的数据库表谓词:给需要评估的SQL三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程查询:基于特定条件检索数据,这是SQL的一个重要组成部分语句:可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断
SQL分类
- DDL数据定义语言
- 主要功能是定义数据库对象
CREATEALTERDROP
- DML数据操纵语言
- 主要功能是访问数据,以读写数据库为主
INSERTUPDATEDELETESELECT
- TCL事务控制语言
- 用于管理数据库中的事务
COMMITROLLBACK
- DCL数据控制语言
- 是一种可对数据访问权进行控制的指令,可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权
GRANTREVOKE- DCL以控制用户的访问权限为主,可利用DCL控制的权限有:
CONNECT、SELECT、INSERT、UPDATE、DELETE、EXECUTE、USAGE、REFERENCES
DML
增删改查,数据库基本操作中的基本操作
插入数据
INSERT INTO
插入完整的行
# 插入一行
INSERT INTO user
VALUES (10, 'root', 'root', 'xxxx@163.com');
# 插入多行
INSERT INTO user
VALUES (10, 'root', 'root', 'xxxx@163.com'), (12, 'user1', 'user1', 'xxxx@163.com'), (18, 'user2', 'user2', 'xxxx@163.com');
插入行的一部分
INSERT INTO user(username, password, email)
VALUES ('admin', 'admin', 'xxxx@163.com');
插入查询出来的数据
从account表里面查出所有name插入到user表中
INSERT INTO user(username)
SELECT name
FROM account;
更新数据
UPDATE
UPDATE user
SET username='robot', password='robot'
WHERE username = 'root';
删除数据
DELETETRUNCATE TABLE
删除表中的指定数据
DELETE FROM user
WHERE username = 'robot';
清空表
TRUNCATE TABLE user
查询数据
SELECTDISTINCT用于返回唯一不同的值,作用于所有列LIMIT限制返回的行数,可以有两个参数,第一个参数作为起始行,从0开始,第二个参数作为返回的总行数ASC:升序(默认)DESC:降序
查询单列
SELECT prod_name
FROM products;
查询多列
SELECT prod_id, prod_name, prod_price
FROM products;
查询所有列
SELECT *
FROM products;
查询不同的值
SELECT DISTINCT
vend_id FROM products;
限制查询结果
-- 返回前 5 行
SELECT * FROM mytable LIMIT 5;
SELECT * FROM mytable LIMIT 0, 5;
-- 返回第 3 ~ 5 行(从第2行开始,查询三行,所以是3 ~ 5行)
SELECT * FROM mytable LIMIT 2, 3;
排序
ORDER BY:默认升序,需要降序则使用DESC关键字
对多列排序时,先排序的放前面,后排序的放后面,并且不同的列可以有不同的排序规则
SELECT * FROM products
ORDER BY prod_price DESC, prod_name ASC;
分组
GROUP BY
GROUP BY子句将记录分组到汇总行中GROUP BY为每一个组返回一个记录GROUP BY通常还涉及聚合函数COUNT、MAX、SUM、AVG等GROUP BY可以按一列或多列进行分组GROUP BY按分组字段进行排序后,ORDER BY可以以汇总字段来进行排序
分组
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name;
分组后排序
SELECT cust_name, COUNT(cust_address) AS addr_num
FROM Customers GROUP BY cust_name
ORDER BY cust_name DESC;
HAVING
HAVING用于对汇总的GROUP BY结果进行过滤HAVING一般都是和GROUP BY连用WHERE和HAVING可以在相同的查询中
使用WHERE和HAVING过滤数据
SELECT cust_name, COUNT(*) AS num
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVING COUNT(*) >= 1;
HAVING和WHERE
WHERE:过滤指定的行,后面不能加聚合函数,WHERE在GROUP BY前HAVING:过滤分组,一般都是和GROUP BY连用,不能单独使用,HAVING在GROUP BY之后
子查询
是嵌套在较大查询中的SQL查询,简单来说就是指将一个SELECT查询(子查询)的结果作为另一个SQL语句(主查询)的数据来源或者判断
子查询可以嵌入SELECT、INSERT、UPDATE和DELETE语句中,也可以和=、<、>、IN、BETWEEN、EXISTS等运算符一起使用
子查询通常用在WHERE子句和FROM子句后面
- 用于
WHERE子句:根据不同的运算符,子查询可以返回单行单列、多行单列、单行多列数据。子查询就是要返回能够作为WHERE子句查询条件的值 - 用于
FROM子句:一般返回多行多列数据,就是一张临时表,这样才符合FROM后面是表的规则,能实现多表联查
WHERE子句子查询语法:
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name operator
(
SELECT
column_name [, column_name ]
FROM
table1 [, table2 ]
[WHERE]
)
operator表示用于WHERE子句的运算符
FROM子句子查询语法:
SELECT column_name [, column_name ]
FROM (
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE]
) AS temp_table_name
WHERE CONDITION
- 用于
FROM的子查询返回的结果相当于一张临时表,所以需要用AS关键字为该临时表起一个名字
子查询的子查询
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'
)
);
将满足prod_id='RGAN01'的数据对应的order_num查出来,然后从查出来的这些order_num中找出他们对应的cust_id,然后再从查出的这堆cust_id中找出他们对应的cust_name和cust_contact
在w3resource中有关子查询的信息:
WHERE
- 在
WHERE子句后跟一个返回true或false的条件 - 可以与
SELECT、UPDATE、DELETE一起使用 - 在
WHERE子句中可用的操作符
| 运算符 | 描述 |
|---|---|
| = | 等于 |
| <> | 不等于(!=) |
| > | 大于 |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| 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