|-摘 sql查询两张表中不同的数据
select * from B where (select count(1) from A where A.ID = B.ID) = 0
select * from B where (select count(1) from A where A.ID = B.ID) = 0
注意,这里A.id字段要和B.id字段的类型相同,比如都是int,否则执行会报错
有比如
select * from B where (select count(1) from A where A.name= B.name) = 0...
|-转 SQL中EXISTS的使用
SQL中EXISTS的使用1.简介不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关...
SQL中EXISTS的使用
1.简介
- 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
- 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询
- EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”
2.表结构
选课表:学号、课程号
学生表:学号、姓名
课程表:课程号、课程名
3.查询所有选修了“C1”课程的学生名。
普通SQL查询:
SELECT 姓名 FROM 学生表 WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1');
带EXISTS的SQL查询:
SELECT 姓名 FROM 学生表 WHERE EXISTS ( SELECT * FROM 选课表 WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1' );
相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。
EXISTS语句不关心子查询的具体内容,因此用“SELECT *”,“Exists + 子查询”用来判断该子查询是否返回记录。...
|-原 Yii2报错没有关联命名 common\models\Post has no relation named
Invalid Parameter – yii\base\InvalidParamExceptioncommon\models\Post has no relation named "{{%mark}}". 我记得是在程序里用了$query = Post::find()->with({...
Invalid Parameter – yii\base\InvalidParamException
common\models\Post has no relation named "{{%mark}}".
我记得是在程序里用了$query = Post::find()->with({{%mark}}.... 这样的语句,其实就是想在标记表里取出符合条件的帖子id,然后在帖子表里查找这些id。结果想了好些办法才搞定。...
|-转 SQL常用语句
SQL常用语句一、基础1、说明:创建数据库CREATE DATABASE database-name2、说明:删除数据库drop database dbname3、说明:备份sql server--- 创建 备份数据的 ...
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2... from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col....)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in ('值1','值2','值4','值6')
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
三、技巧
1、1=1,1=2的使用,在SQL语句组合时用的较多
"where 1=1" 是表示选择全部 "where 1=2"全部不选,
如:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
我们可以直接写成
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
3、压缩数据库
dbcc shrinkdatabase(dbname)
4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go
5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT...
|-转 SQL复杂查询(案例一)
https://blog.csdn.net/dingchenxixi/article/details/732235721.列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最...
https://blog.csdn.net/dingchenxixi/article/details/73223572
1.列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资。
确定所需要的数据表
emp表:员工的部门编号,平均工资,最低工资,最高工资
dept表:部门名称
确定已知的关联字段
emp.deptno=dept.deptno
1.1 先得到员工数大于1的部门
SELECT deptno,COUNT(empno) FROM emp GROUP BY deptno HAVING COUNT(empno)>1;
- 1
1.2 找到部门名称
SELECT d.dname,COUNT(e.empno) FROM emp e ,dept d
WHERE e.deptno=d.deptno GROUP BY d.deptno,d.dname HAVING COUNT(e.empno)>1;
- 1
- 2
1.3 统计各种信息
SQL分组:http://blog.csdn.net/dingchenxixi/article/details/70193634
select子句之后,只能出现分组的字段和统计函数,其它的字段不能出现
由于AVG(),MAX(),MIN()为统计函数,可以直接使用
SELECT d.deptno,d.dname,COUNT(e.empno),AVG(sal),MIN(sal),MAX(sal)
FROM emp e ,dept d
WHERE e.deptno=d.deptno
GROUP BY d.deptno,d.dname HAVING COUNT(e.empno)>1;
- 1
- 2
- 3
- 4
2.列出薪金比“SMITH”或“ALLEN”多的所有员工的编号、姓名、部门名称、其领导姓名。
确定所需要的数据表
emp表:列出“SMITH”或“ALLEN”的薪金
emp表:员工的编号,姓名
dept表:部门名称
确定已知的关联字段
emp.deptno=dept.deptno;
emp1.mgr = emp2.empno (自关联查询)
2.1 先查询出“SMITH”或“ALLEN”的薪金
SELECT sal FROM emp WHERE ename='SMITH' OR ename='ALLEN'
- 1
或者
SELECT sal FROM emp WHERE ename IN('SMITH','ALLEN');
- 1
2.2 子查询,查询比“SMITH”或“ALLEN”薪金多的员工编号,姓名,部门名称...
|-转 Sql常用查询操作
https://blog.csdn.net/bruce_up/article/details/82750024 1.查询语句模板: 需要注意的是: FROM 才是 SQL ...
https://blog.csdn.net/bruce_up/article/details/82750024
1.查询语句模板:
需要注意的是:
- FROM 才是 SQL 语句执行的第一步,并非 SELECT 。
- SELETC 是在WHERE语句执行之后执行的,所以不能再WHERE语句后使用SELECT中设置的别名
- WHERE是对分组前进行的过滤,HAVING是对分组后进行过滤。
2.sql中的 与 或 非
与--and 或--or 非--not 注意的是 :and 优先级高于 or A and B or C and D 最后执行or
3.设置别名:
select sal*12 as "年薪" from 表名 t ; sa "年薪" 给 列设置别名 , t 是给表设置别名
4.查询空值
select * from emp where comm is null (is not null)
5.模糊查询:
%(通配符)表示任意长度的字符 ,_ 表示一个字符。 例如以S开头的 任意结束 (S%)
select 字段名 from 表名 where 字段名 like '%s%' ;
6.分组:
通过性别不同分组查数据:
select sex, avg(age) as 平均年龄 from user group by sex;
注意:
- 使用分组后select 后面只能写分组条件(group by后面的值)或者组函数
- 分组函数 count min max avg sum
- 要筛选结果 可以先使用where 再用group by 或者先用group by 再用having
- group by 执行过程如下:
7.单行函数:
1)数字函数
--四舍五入 ROUND(input[,n]) n表示小数位如果n被忽略则无小数位SELECT ROUND(12.111) FROM dual;SELECT ROUND(12.111,1) FROM dual;SELECT ROUND(12.164,1) FROM dual;--截取数字 TRUNC (input[,n]) 将数字值截取,n代表截取的小数位,如果n被忽略则默认0SELECT TRUNC(12.113) FROM dual;SELECT TRUNC(12.113,2) FROM dual;--返回m除于n的余数 MOD(m,n)SELECT MOD(3,2) FROM dual
2)字符函数
select * from emp;--转换为大写SELECT UPPER(e.ename) FROM emp e;--转换为小写SELECT LOWER(e.ename) FROM emp e;--首字母转换为大写SELECT INITCAP(ename) FROM emp--连接第一个字符到第二个字符等价于“||”SELECT CONCAT(ename,empno) EMPINFO FROM empSELECT ename ||' ' || empno EMPINFO FROM emp --获取字符串中指定的字符,SUBSTR(input,m,[n]) 从m位置开始,取n个字符长度,如果n被忽略,则取到字符串结尾处SELECT SUBSTR(ename,1,3) FROM empSELECT SUBSTR(ename,1) FROM emp--返回字符串的字符数SELECT ename,LENGTH(ename) as "str_length" FROM emp--返回字符值中查找字符串char的数字位置,m作为查找的开始,n代表第n次发现,m,n默认值为1,及默认是从开始位置查找,报告第一个查询到的位置INSTR(input,char[,m][.n])SELECT ename,INSTR(ename,'A') as "第一次出现a的位置" FROM (SELECT UPPER(ename) as ename FROM emp )--从字符串中查找字符char1,找到则替换为char2SELECT REPLACE(ename,'A','哈哈') FROM emp--左补全函数SELECT LPAD('EMPNO',12,'*') FROM emp--右补全函数SELECT RPAD('EMPNO',12,'*')FROM emp
3)日期函数 ...
|-转 【知乎】从零学会SQL:复杂查询
内容太多了,还没来得及看,是想进一步学习SQL的,先在网上找些,有空时再仔细看 20200327 00:18从零学会SQL:复杂查询crazy1.视图1. 在实际的数据库中,每...
内容太多了,还没来得及看,是想进一步学习SQL的,先在网上找些,有空时再仔细看 20200327 00:18
crazy
1.视图
1. 在实际的数据库中,每一张表会有很多个字段,但是不同的用户只想了解自己想了解的字段,对于其他的字段并不感兴趣,这时候使用视图可以把自己想要的一些字段再封装成一张表,这样每次特定用户只需要访问这张封装成的表即可了解自己想知道的字段。再说的专业一点,视图是对SQL语句的封装,这个说法在下面进行解释
2. 视图是对SQL语句的封装。因为,我们在数据库中建立的一张张表会实际存储到存储设备上,比如磁盘,我们每次使用select语句,实际上就是在访问内存中的表,但是视图并不是,视图保存的并不是数据,而是select语句,每次从视图中读取数据的时候,相当于是在内部执行select语句并创建出一张临时表
3. 视图的优点:(1)视图不需要保存实际数据,节省存储空间(2)可以将频繁使用的select语句保存成视图,这样就不用每次都书写复杂的SQL了
/*
创建视图
create view 视图名称(<视图列名1>,<视图列名2>,...)
as
<select 查询语句>;
*/
create view 按性别汇总(性别,人数)
as
select 性别,count(*)
from student
group by 性别;
select*
from 按性别汇总; -- 在from子句中,使用视图名称代替表名称
-- 视图中存放的是sql查询语句,所以视图中的语句会随着原表的变化而更新,视图也不需要保存数据
-- 注意事项:避免在视图的基础上再去创建视图;不能往视图插入数据,否则会报错
2.子查询
嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在select list中,作为一个字段值来返回。
select 性别,人数
from (
select 性别,count(*) as 人数
from student
group by 性别 -- 先运行子查询
) as 按性别汇总;
select 性别,count(*) as 人数
from student
group by 性别;
-- in/any/all(子查询)
-- 找出每个课程里成绩最低的学号
-- 1.查找出每门课程的最低成绩有哪些值
select 课程号,min(成绩)
from score
group by 课程号;
-- 2.在成绩表里查找这些值对应的学号
select 学号,成绩
from score
where 成绩 in(80,50,40);
-- 这个可以显示正确的结果
select 学号,成绩
from score
where (课程号 =0001 and 成绩 =80) or (课程号 =0002 and 成绩 =50) or (课程号 =0003 and 成绩 =40);
select 学号,成绩
from score as s1
where 成绩 =(select min(成绩)
from score as s2
where s1.课程号 = s2.课程号 -- 在同一课程号中对各学号的成绩与最低成绩进行比较
group by 课程号);
-- 这个语句查询结果不太对,上面的两块代码可以正确显示每门课程里成绩最低的学号
select 学号,成绩
from score
where 成绩 in (
select min(成绩)
from score
group by 课程号
);
/*
any(子查询) 与some(子查询)相同
select 列名1
from 表名1
where 列名 > any(子查询);
*/
/*
哪些学生的成绩比课程0002的全部成绩里的任意一个高呢?
第一步:课程0002的全部成绩,比如是(10,30)
第二步:某个学生的成绩大于任何一个第一步里的成绩,就符合条件
*/
-- 第一步
select 成绩
from score
where 课程号 = '0002';
-- 第二步
select 学号,成绩
from score
where 成绩 > any(
select 成绩
from score
where 课程号 = '0002'
);
-- 哪些学生的成绩比课程0002的全部成绩都高呢?
select 学号,成绩
from score
where 成绩 > all(
select 成绩
from score
where 课程号 = '0002'
);
/*
使用子查询的注意事项
1.a>3*all(b)是错的,正确格式是a/3=all(b)
2.避免使用多层嵌套子查询
3.select...from...子查询 as 子查询名称(可省略)
*/
3.标量子查询
标量子查询就是返回值只能有一行一列的子查询...