UNION :联集
将两个SQL语句的结果合并起来,两个SQL语句所产生的字段需要是同样的数据记录种类
UNION:生成结果的数据记录值将没有重复,且按照字段的顺序进行排序
语法: [SELECT 语句1] UNION [SELECT 语句2];
UNION ALL :将生成结果的数据记录值都列出来,无论有无重复
语法: [SELECT 语句1] UNION ALL [SELECT 语句2];
SELECT Store_Name FROM location UNION SELECT Store_Name FROM Store_Info;
SELECT Store_Name FROM location UNION ALL SELECT Store_ Name FROM Store_Info;
交集值--取两个SQL语句的交集
SELECT A.Store_Name FROM location A INNER JOIN Store_Info B ON A.Store_Name = B.Sstore_Name;
SELECT A.Store_Name FROM location A INNER JOIN Store_Info B USING (Store_Name) ;
#两表其中的一一个表没有指定的行,而另一-个表这个行有重复不适用,要求两个表确实有交集的行的时候用SELECT A.Store_Name FROM
(SELECT Store_Name FROM location UNION ALL SELECT Store_ Name FROM Store_Info) A
GROUP BY A. Store_Name HAVING COUNT(*) > 1;
#取两个SQL语句结果的交集,且没有重复
SELECT A.Store_Name FROM (SELECT B.Store_Name FROM location B INNER JOIN store_Info C ON B.Store_Name = C.store_Name) A GROUP BY A.Store_Name;
SELECT DISTINCT A.Store_Name FROM location A INNER JOIN Store_Info B USING (Store_Name);
SELECT DISTINCT Store_Name FROM location WHERE (Store_ Name) IN (SELECT Store_Name FROM Store_Info);
SELECT DISTINCT A.Store_Name FROM location A LEFT JOIN Store_Info B USING (Store_Name) WHERE B.Store_Name IS NOT NULL;
无交集值--显示第一个SQL语句的结果,且与第二个SQL语句没有交集的结果,且没有重复
SELECT DISTINCT Store_Name FROM location WHERE (Store_ Name) NOT IN (SELECT Store_Name FROM Store_Info);
SELECT DISTINCT A.Store_Name FROM location A LEFT JOIN Store_Info B USING (Store_Name) WHERE B.Store_Name IS NULL;
SELECT A.Store_Name FROM (SELECT DISTINCT Store_Name FROM location UNION ALL SELECT DISTINCT Store_Name FROM Store_ Info) A GROUP BY A.Store_Name HAVING COUNT(*) = 1;
CASE
是SQL用来做为IF-THEN-ELSE 之类逻辑的关键字
语法:
SELECT CASE ("字段名")
WHEN "条件1" THEN "结果1"
WHEN "条件2" THEN "结果2"
...
[ELSE "结果N"]
END
FROM "表名";
## "条件”可以是一个数值或是公式。 ELSE子句则并不是必须的。
SELECT Store_Name, CASE Store_Name
WHEN 'Los Angeles' THEN Sales * 2
WHEN 'Boston' THEN 1000
ELSE Sales
END
"New Sales", Date
FROM Store_Info;
#"New Sales" 是用于CASE那个字段的字段名。
算排名:
表格自我连结(Self Join),然后将结果依序列出,算出每一-行之前(包含那一行本身)有多少行数SELECT A1.Name, A1.Sales, COUNT (A2.Sales) Rank FROM Total Sales A1, Total Sales A2WHERE A1.Sales < A2.Sales OR (A1 .Sales=A2.Sales AND A1.Name = A2 . Name)GROUP BY A1.Name, A1.Sales ORDER BY A1.Sales DESC;
CREATE TABLE Total_Sales (Name char(10),Sales int(5));
INSERT INTO Total_Sales VALUES ('zhangsan',10);
INSERT INTO Total_Sales VALUES ('lisi',15);
INSERT INTO Total_Sales VALUES ('wangwu',20);
INSERT INTO Total Sales VALUES ('zhaoliu',40);
空值(NULL) 和无值('') 的区别
1.无值的长度为0,不占用空间的:而NULL值的长度是NULL,是占用空间的。
2. IS NULL或者IS NOT NULL,是用来判断字段是不是为NULL 或者不是NULL,不能查出是不是无值的。
3.无值的判断使用=' '或者<>' '来处理。<>代表不等于。
4.在通过count()指定字段统计有多少行数时,如果遇到NULL 值会自动忽略掉,遇到无值会加入到记录中进行计算。
SELECT length (NULL),length(''), length('1');
SELECT * FROM City WHERE name IS NULL;
SELECT * FROM City WHERE name IS NOT NULL;
SELECT * FROM City WHERE name = '';
SELECT * FROM City WHERE name <> ' ';
SELECT COUNT(*) FROM City;
SELECT COUNT (name) FROM City;
粗体
正则表达式
语法: SELECT "字段" FROM "表名" WHERE "字段" REGEXP {模式} ;
SELECT * FROM Store_Info WHERE Store_Name REGEXP 'os';
SELECT * FROM Store_Info WHERE Store_Name REGEXP '^[A-G]';
SELECT * FROM Store_Info WHERE Store_Name REGEXP 'Ho|Bo';
存储过程
存储过程是一组为了完成特定功能的SQL语句集合。
存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统SQL速度更快、执行效率更高。
存储过程的优点:
1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
2、SQL语句加上控制语句的集合,灵活性高
3、在服务器端存储,客户端调用时,降低网络负载
4、可多次重复被调用,可随时修改,不影响客户端调用
5、可完成所有的数据库操作,也可控制数据库的信息访问权限
##创建存储过程##
DELIMITER $$ #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
CREATE PROCEDURE Proc () #创建存储过程,过程名为Proc,不带参数
>BEGIN #过程体以关键字BEGIN开始
> select * from Store_Info; #过程体语句
>END $$ #过程体以关键字END 结束
DELIMITER ; #将语句的结束符号恢复为分号
##调用存储过程
CALL Proc;
#查看存储过程##
SHOW CREATE PROCEDURE [ 数据库.]存储过程名; #查看某个存储过程的具体信息
SHOW CREATE PROCEDURE Proc;
SHOW PROCEDURE STATUS [LIKE '%Proc8'] \G
##存储过程的参数##
IN输入参数:表示调用者向过程传入值(传入值可以是字而量或变量)
OUT输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
DELIMITER $$
CREATE PROCEDURE Proc1 (IN inname CHAR(16))
-> BEGIN
-> SELECT * FROM Store_Info WHERE Store_Name = inname;
-> END $$
DELIMITER ;
CALL Proc1 ('Boston');
##删除存储过程##
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
DROP PROCEDURE IF EXISTS Proc; #仅当存在时删除,不添加IF EXISTS 时,如果指定的过程不存在,则产生一个错误
##存储过程的控制语句##
create table t (id int(10));
insert into t values(10);
(1)条件语句if-then-else .... end if
DELIMITER $$
CREATE PROCEDURE proc2(IN pro int)
-> begin
-> declare var int;
->set var=pro*2;
->if var>=10 then
->update t set id=id+1;
->else
->update t set id=id-1;
->end if;
->end $$
DELIMITER ;
CALL Proc2(6) ;
(2)循环语句while .... end while
DELIMITER $$
CREATE PROCEDURE proc3 ()
-> begin
->declare var int (10);
->set var=0;
->while var<6 do
->insert into t values (var);
-> set var=var+1;
-> end while;
-> end $$
DELIMITER ;
CALL Proc3;
总结:
null ''
regexp '模式'
联集交集无交集
存储过程
创建:先临时修改结束符,create procedure 名() BEGIN ..... END结束符恢复结束符为;
call 过程名
show create procedure 过程名
show procedure status like '...'
drop procedure过程名
if ... then ... else ... end if
while ... do .... end while