Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说《SQL必知必会-第四版》学习「终于解决」,希望能够帮助你!!!。
"-- 注释内容"这种注释方法一般适用于所有DBMS
-- 去重不仅作用于score,而是所有查询列!!!
SELECT DISTINCT score, Cid;
-- 这里去重作用于括号的S2.score
SELECT
S1.score 'Score',
COUNT( DISTINCT S2.score ) 'Rank'
WHERE vend_id = 'DLL01' OR vend_id = 'BRS01' AND prod_price >= 10;
-- 等价为
WHERE vend_id = 'DLL01' OR (vend_id = 'BRS01' AND prod_price >= 10);
-- 匹配前面两个字符任意,后面字符为" 电风扇"的字符串!
where sname like '__ 电风扇';
SELECT CONCAT(TRIM(sname),'【',TRIM(age),'】') name
-- 赵雷【1990-01-01】
每一个DBMS 都有特定的函数。事实上,只有少数几个函数被所有主要的DBMS等同地支持,所以会导致SQL的可移植性差,如果你决定使用函数,应该保证做好代码注释,以便以后你(或其他人)能确切地知道所编写的SQL 代码的含义。
UPPER() 将文本转换为大写: select UPPER(name)
|
函数 |
说明 |
|
AVG() |
返回某列的平均值 |
|
MAX() |
返回某列的最大值 |
|
MIN() |
返回某列的最小值 |
|
SUM() |
返回某列值之和 |
|
COUNT() |
返回某列的行数 |
SELECT AVG(DISTINCT prod_price) AS avg_price;
SELECT SUM(DISTINCT prod_price) AS avg_price;
SELECT COUNT(DISTINCT prod_price) AS count_price;
1.GROUP BY (创建分组)
2.HAVING (分组后过滤)
这里有另一种理解方法,WHERE 在数据分组前进行过滤,HAVING 在数 据分组后进行过滤。这是一个重要的区别,WHERE 排除的行不包括在 分组中。这可能会改变计算值,从而影响HAVING 子句中基于这些值 过滤掉的分组
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'));
SELECT cust_name,
cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id) AS orders
FROM Customers
ORDER BY cust_name;
1.内连接
SELECT vend_name, prod_name, prod_price
FROM Vendors,
Products
WHERE Vendors.vend_id = Products.vend_id;
-- 等价于
SELECT vend_name, prod_name, prod_price
FROM Vendors
INNER JOIN Products
ON Vendors.vend_id = Products.vend_id;
2.外连接
-- 1.2 查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )
select s1.Sid,s1.score score1,s2.score score2 from
(select Sid,score from SC where Cid = "01") s1 left join
(select Sid,score from SC where Cid = "02") s2 on s1.Sid = s2.Sid
where s1.score > s2.score
3.全连接
关键字: union/union all
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT cust_name, cust_contact, cust_email
FROM Customers
WHERE cust_name = 'Fun4All';
1.为什么使用视图?
CREATE VIEW ProductCustomers AS
SELECT cust_name, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;
视图为虚拟的表。它们包含的不是数据而是根据需要检索数据的查询。 视图提供了一种封装SELECT 语句的层次,可用来简化数据处理,重新 格式化或保护基础数据。
资料学习:mysql存储过程学习笔记
存储过程就是为以后使用而保存的一条 或多条SQL 语句。可将其视为批文件,虽然它们的作用不仅限于批处理。
1.基本语法:
create procedure 名称([IN|OUT|INOUT] 参数名 参数数据类型 begin ... end;
2.存储过程的传入参数in
-- varchar类型参数需要指定长度
create procedure test4(userId varchar (150))
begin
declare username varchar(32) default ''; -- declare:声明变量
-- select A into B:查询A字段赋值给B变量!
select name into username from users where id=userId;
select username;
end;
-- 调用: call test4("OD1528989");
3.存储过程的传出参数out
create procedure test5(in userId int,out username varchar(32))
begin
select name into username from users where id=userId;
end;
-- 执行存储过程
-- 定义一个变量 set @变量名
set @uname = '';
call test5(1,@uname);
select @uname as username;
4.存储过程的可变参数INOUT
MySQL -- 定义变量并在sql语句中使用变量
INSERT INTO Department ( Id, NAME) VALUES( NULL, 'Math' );
-- 定义变量,并将上一个新增的自增主键值赋值给这个变量
SET @modelId = (SELECT @@identity);
-- 使用变量
INSERT INTO Course ( Id, cname, Did ) VALUES( NULL, '数学2', @modelId);
事务处理用来管理INSERT、UPDATE 和DELETE 语句。不能回退SELECT 语句(回退SELECT 语句也没有必要),也不能回退CREATE 或DROP 操 作。事务处理中可以使用这些语句,但进行回退时,这些操作也不撤销。
MySQL 游标的使用
-- delimiter // 标识一个SQL结束,防止遇到;就以为是一个SQL结束(有点DBMS可能不需要)
delimiter //
create procedure p1()
begin
declare id int;
declare name varchar(100) character set utf8;
declare done int default 0;
-- 声明游标 (declare 游标名 cursor for 查询语句)
declare mc cursor for select stuId,stuName from student where stuAge >19;
-- 指定游标循环结束时的返回值
declare continue handler for not found set done = 1;
-- 打开游标
open mc;
-- 获取结果(注意into的顺序)
fetch mc into id,name;
-- 这里是为了显示获取结果
select id,name;
-- 关闭游标
close mc;
end //
delimiter ;
约束(constraint) :管理如何插入或处理数据库数据的规则。
Q:查询某张表的下一个自增主键值?
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '表的名称'
通过数据库连接工具查看表的DDL信息栏(AUTO_INCREMENT = ?)
外键
唯一约束
唯一约束用来保证一列(或一组列)中的数据是唯一的。它们类似于主键,但存在以下重要区别。
检查约束
索引用来排序数据以加快搜索和排序操作的速度。
1.添加PRIMARY KEY(主键索引)
mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引)
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysql>ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加联合索引
mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
触发器是特殊的存储过程,它在特定的数据库活动发生时自动执行。触发器可以与特定表上的INSERT、UPDATE 和DELETE 操作(或组合)相关联。
一般说来,需要保护的操作有:
对数据库管理功能(创建表、更改或删除已存在的表等)的访问;
对特定数据库或表的访问;
访问的类型(只读、对特定列的访问等);
仅通过视图或存储过程对表进行访问;
创建多层次的安全措施,从而允许多种基于登录的访问和控制;
限制管理用户账号的能力。
上一篇
已是最后文章
下一篇
已是最新文章