基本的,增、删,改
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