数据库-3.SQL语法


SQL语法

语法结构组成:

  • 子句:是语句和查询的组成成分
  • 表达式:可以产生任何标量值,或由行和列的数据库表
  • 谓词:给需要评估的SQL三值逻辑(3VL)(true/false/unknown)或布尔真值指定条件,并限制语句和查询的效果,或改变程序流程
  • 查询:基于特定条件检索数据,这是SQL的一个重要组成部分
  • 语句:可以持久地影响纲要和数据,也可以控制数据库事务、程序流程、连接、会话或诊断

SQL分类

  • DDL数据定义语言
    • 主要功能是定义数据库对象
    • CREATE
    • ALTER
    • DROP
  • DML数据操纵语言
    • 主要功能是访问数据,以读写数据库为主
    • INSERT
    • UPDATE
    • DELETE
    • SELECT
  • TCL事务控制语言
    • 用于管理数据库中的事务
    • COMMIT
    • ROLLBACK
  • DCL数据控制语言
    • 是一种可对数据访问权进行控制的指令,可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权
    • GRANT
    • REVOKE
    • DCL以控制用户的访问权限为主,可利用DCL控制的权限有:CONNECTSELECTINSERTUPDATEDELETEEXECUTEUSAGEREFERENCES

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';

删除数据

  • 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;

查询所有列

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通常还涉及聚合函数COUNTMAXSUMAVG
  • 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连用
  • WHEREHAVING可以在相同的查询中

使用WHERE和HAVING过滤数据

SELECT cust_name, COUNT(*) AS num
FROM Customers
WHERE cust_email IS NOT NULL
GROUP BY cust_name
HAVING COUNT(*) >= 1;

HAVINGWHERE

  • WHERE:过滤指定的行,后面不能加聚合函数,WHEREGROUP BY
  • HAVING:过滤分组,一般都是和GROUP BY连用,不能单独使用,HAVINGGROUP BY之后

子查询

是嵌套在较大查询中的SQL查询,简单来说就是指将一个SELECT查询(子查询)的结果作为另一个SQL语句(主查询)的数据来源或者判断

子查询可以嵌入SELECTINSERTUPDATEDELETE语句中,也可以和=<>INBETWEENEXISTS等运算符一起使用

子查询通常用在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_namecust_contact

w3resource中有关子查询的信息:

SQL Subqueries - w3resource

sql-subqueries

WHERE

  • WHERE子句后跟一个返回truefalse的条件
  • 可以与SELECTUPDATEDELETE一起使用
  • 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


文章作者: Feliks
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Feliks !
评论
  目录