/-------------------------------------------------select查询----------------------------------------------------/
select distinct usersex from t_user where usernl>25
distinct:将查结果中的重复的记录删除,是每一条记录的值都是唯一的。
select username,usersex,usernl from t_user where usernl=28 or usernl=26 or usernl=24 order by usernl desc
select username,usersex,usernl from t_user where usernl in (28,26,24) order by usernl desc
in:将某一字段usernl值和(28,26,24)进行运算,如果在集合(28,26,24) 中有usernl值存在就返回结果。
/----------------------------------------------应用最广,考试常考------------------------------------------------/
like 的用法:模糊查询(只能用于字符型数据:char,nchar,varchar,nvarchar)
select * from t_user where username like '%赵%' (任意多个字符)
select * from t_user where username like '_赵' (任意一个字符)
select * from t_user where username like '[刘-赵]叶%' (以刘至赵开头)
select * from t_user where username like '[^刘-赵]叶%' (不以刘至赵开头)
用汉字作为限制条件的规则:汉语拼音的打头第一个英文字母----汉语拼音的打头第一个英文字母,他们
之间的所有汉字,这些汉字的汉语拼音的打头第一个英文字母要在上述范围内。
例:[刘-赵],那么马就在范围内,范就不在范围内。
[l-z] m f
escape:(逃)跳逸字
select * from t_user where userAdd like '鞍山#%' escape '#' (查找有通配符的字符)
含义:将'#'作为(逃)跳逸字,然后在模糊查询时,将'#'后面的一个字符作为查询字符使用
% _ 当作通配符。
/----------------------------------------------应用最广,考试常考------------------------------------------------/
=================================================================================================================
/----------------------------------------------SQL的统计查询功能-------------------------------------------------/
//默认统计查询
select sum(userC) as C总分,sum(userSQL) as SQL总分 from t_user
代表是:统计每一列(字段)的所有数据
select username as '姓名',userC+userSQL as 总分 from t_user
代表是:统计每一行的userC+userSQL的和
select sum(userC+userSQL) as 总分 from t_user
代表是:统计每一行每一列的所有数据。
//分组统计查询
select useradd,sum(userC+userSQL) as 总分 from t_user group by useradd
group by:分组查询的关键字。
useradd: 分组的字段名。
注意:分组的字段名必须在select中返回该字段。
//条件统计查询
select username,sum(userC+userSQL) as 总分 from t_user group by username having sum(userC+userSQL)>170
having:查询统计之后的数据的判断条件,只能在分组时使用。
判断条件:sum(userC+userSQL)>170
统计函数:(聚合函数)
sum():求和。
avg():求平均数。
max():求最大值。
min():求最小值。
count():求满足情况的记录数量。count在进行数据分页的时候,非常有用。
相关事例:
select sum(userC) as C总分,sum(userSQL) as SQL总分 from t_user
select avg(userC) as C总分,avg(userSQL) as SQL总分 from t_user
select max(userC) as C总分,max(userSQL) as SQL总分 from t_user
select min(userC) as C总分,min(userSQL) as SQL总分 from t_user
select usersex, count(userSQL) as SQL总分 from t_user group by usersex
//多行插入
insert into t_test select UserName,UserSex from t_user
查询部分:select UserName,UserSex from t_user
插入部分:insert into t_test
t_test:要执行插入操作的表。
功能:将查询语句部分返回的查询结果依次插入到t_test表中。(多行插入)
注意:只能用在两个表之间的数据操作中,将一个表中的数据查询查询出来,再插到另一表中。
每个字段都是一一对应的关系,最好是字段名和数据的长度都要相同。*数据类型必须相同*
-----------------------------------------------数据库表的单表查询部分-------------------------------------------------------
多表查询:
*内连接:
传统:select a.username,a.usersex,b.classname from T_user a,t_class b where a.classid=b.classid
select:查询命令;
a.username,a.usersex,b.classname:返回的字段;
from:查询数据来自于哪个表的命令;
T_user a,t_class b:查询数据来自于哪个表;a,b代表表的别名(省略as)
where a.classid=b.classid:查询条件,(该条件是为了消除迪卡尔乘积)
(如果是3个表的查询,用"与"运算再连接另一个消除迪卡尔乘积的判断)
注意:多表查询时返回的字段前要加上表名。
流行:select a.username,a.usersex,b.classname from T_user a inner join t_class b on a.classid=b.classid
select:查询命令;
a.username,a.usersex,b.classname:返回的字段;
from:查询数据来自于哪个表的命令;
T_user a:要查询一个表名。
inner join:内连接。
t_class b:内连接连接到的表名。(T_user a和t_class b进行了内连接)
on a.classid=b.classid:连接条件,(该条件是为了消除迪卡尔乘积)
select a.username,a.usersex,b.classname from T_user a,t_class b where a.classid=b.classid and usersex='男'
select a.username,a.usersex,b.classname from T_user a inner join t_class b on a.classid=b.classid and usersex='男'
*外连接:
左外连接: select a.username,a.usersex,b.classname from T_user a left outer join t_class b on a.classid=b.classid
右外连接: select a.username,a.usersex,b.classname from T_user a right outer join t_class b on a.classid=b.classid
完整外连接:select a.username,a.usersex,b.classname from T_user a full outer join t_class b on a.classid=b.classid
left outer join:左外连接关键字,outer可以省略
right outer join:右外连接关键字,outer可以省略
full outer join:完整外连接关键字,outer可以省略
其它部分和内连接的注释相同。
注意:外连接在应用时,需满足一个条件:两个子父表不能有外键约束,但要有关联的字段,来建立关系。
外键约束:它本身不能决定表与表之间的关系,它只能验证关联字段的值是否合法。
表之间关系的建立和外键约束约束没有必然的联系。
完整外连接=左外连接+右外连接+内连接,(除去相同的数据)
*交叉连接:
select a.username,a.usersex,b.classname from T_user a cross join t_class b(就是迪卡尔乘积)
在交叉连接后加入where a.classid=b.classid,它就和内连接完全相同
select a.username,a.usersex,b.classname from T_user a cross join t_class b where a.classid=b.classid
总述:在多表查询时当出现join时,查询条件的关键字on;否则,查询条件的关键字where。特殊情况交叉连接。
*自连接:
use pubs
--利用自连接返回合著图书的标识和合著者的姓名
select t1.title_id as '图书标识',rtrim(a.au_fname)+' '+rtrim(a.au_lname) as 作者
from authors a,titleauthor t1 inner join titleauthor t2 on t1.title_id=t2.title_id
where t1.au_id<>t2.au_id and t1.au_id=a.au_id
--titleauthor表是一张多对多表,是中间连接关系表,通过该表可以实现titles表与authors的多对多关系。
--authors表是作者信息表 titles表是图书信息表
自连接:字面理解就是自己与自己联接。许多子查询和外部查询引用同一标的语句称为自联接,即某个表和自身联接。
与任何连接一样,自联接至少需要两个表,只是自联接不是将另一个表添加到查询,而是添加同一个表的第二个实例。
这样就可以将表的第一个实例中的列与第二个实例中的列进行比较。
子查询:就是在一个查询语句中还有另一个查询语句。(比较重要)
//查询条件方式
select * from t_user where usersex='女'
//子查询(在主查询中查询的判断条件字段必须与子查询中返回的字段相同)
select * from t_user where userid in (select userid from t_user where usersex='女')
select * from t_user where usernum in (select usernum from t_user where usersex='女')
//它的执行顺序。就是先执行子查询,然后在执行主查询,返回相应的结果。
//在子查询结束之后:select * from t_user where userid in (1,2,8)
--在公司中谁的基本工资最高
select username from t_user where usermoney=(select max(usermoney) from t_user)
select username from t_user where usermoney in (select max(usermoney) from t_user)
//子查询分类:嵌套子查询,相关子查询,多行子查询。(根据子查询中的判断条件来确定的)
//嵌套子查询
select * from 学生表 where 学号 in (select 学号 from 成绩表 where C语言=77)
//相关子查询
select * from 学生表 where 学号 in (select 学号 from 成绩表 where 学生表.学号=成绩表.学号)
//多行子查询
select * from 学生表 where 学号 in (select 学号 from 成绩表 where C语言>60)
//select分页功能:
//分页查询:将子查询语句中的信息排除(已读页),然后在剩余的信息中,查找前几条数据(当前页)。以这种方式来实现分页。
select top 2 * from t_user where userid not in
(select top 2 userid from t_user order by userid desc) order by userid desc
//一条sql 语句搞定数据库分页:
select top 10 b.*
from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b
where b.主键字段 = a.主键字段 order by a.排序字段
--联合查询--
select * from t_user
select * from t_user where userid in
(
select userid from t_user where usersex='男'
union
select userid from t_user where usersex='女'
union
select userid from t_user where usersex='其它')
//联合查询的格式:将多个查询的结果组合在一起,把它看作是一个整体的结果来使用。
//union联合查询的关键字。(比较重要)
整本书中应用最多的就是:模糊查询,子查询,联合查询。
大家一定要掌握“联机丛书”的使用,提高自学能力。