SQL学习记录

发布于:2025-09-01 ⋅ 阅读:(16) ⋅ 点赞:(0)

基本的,增、删,改

insert into  table_name (列1, 列2,...) VALUES (值1, 值2,....)

Delete from 表 where key=value

update 表 set key=value,key=value where key=value

查用的最多

where

SELECT prod_name, prod_price 
FROM Products
WHERE vend id='DLLO1'OR vend id ='BRSO1'
    AND prod_price >= 10;

SOL(像多数语言一样)在处理 OR 操作符前,优先处理 AND 操作符。当 SOL看到上述 WHERE 子句时,它理解为:由供应商 BRS01 制造的价格为 10 美元以上的所有产品,以及由供应商 DLL01 制造的所有产品,而不管其价格如何。换句话说,由于 AND 在求值过程中优先级更高,操作符被错误地组合了

这个有点像数学里面加减乘除的优先级

and的优先级更高,所以vend id ='BRSO1' AND prod_price >= 10 就被处理成了一个整体。

所以我们应该使用()来增加前面or的优先级

SELECT prod_name, prod_price 
FROM Products
WHERE (vend id='DLLO1'OR vend id ='BRSO1')
    AND prod_price >= 10;

优先使用not和in

WHERE prod name LIKE '%"不会匹配产品名称为 NULL的行

having

HAVING支持所有WHERE操作符

having和where

WHERE 在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE 排除的行不包括在分组中。这可能会改变计算值,从而影响 HAVING 子句中基于这些值过滤掉的分组。

例如:过去12个月内具有两个以上订单的顾客。

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2

group by

它前面的操作都是对每个组而不是整个结果集进行操作。(它前面的操作是在分组之后进行)

子查询、联表查询

关联查询:

创建联结非常简单,指定要联结的所有表以及关联它们的方式即可。请看下面的例子:

SELECT vend name.prod name, prod_price
FROM Vendors,Products
WHERE Vendors.vend id= Products.vend id;


 

游标

DELIMITER //

DROP PROCEDURE IF EXISTS processnames;

CREATE PROCEDURE processnames()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE topic_name VARCHAR(255);
    DECLARE demo CURSOR FOR SELECT name FROM help_topic;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN demo;
    read_loop: LOOP
        FETCH demo INTO topic_name;
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 这里可以处理 topic_name 变量,比如插入到其他表、打印、等
        -- 例如:INSERT INTO other_table(col) VALUES (topic_name);
    END LOOP;
    CLOSE demo;
END //

DELIMITER ;

CALL processnames();

函数

AVG()函数忽略列值为 NULL 的行。

如果指定列名,则COUNT()函数会忽略指定列的值为NULL的行,但如果 COUNT()函数中用的是星号(*),则不忽略。

MAX()函数忽略列值为 NULL 的行。

MIN()函数忽略列值为 NULL 的行。

SUM()函数忽略列值为 NULL 的行。

count(字段名)

group by

order by (默认升序)  

order by …desc (降序)

distinct (不重复)

like :  SELECT prod_desc FROM Products WHERE prod_desc like “a_b%toy%carrots%"

in

not in

having