SQL Server目录:

一、连接池
二、模糊查询like
三、通配符:%,_,[],^
1.%通配符:匹配0-n个任意字符
2._通配符,表示匹配任意1个字符
3.’^‘通配符:非,不是
4.’[]'通配符,表示匹配一定范围内的,任意1个字符
四、聚合函数
五、select 完整语序
1.order by排序
2.group by分组查询
3.distinct去除重复项
4.分组查询原则
5.给列起别名
6.where子句(条件查询)
7.top关键字:查询前若干条语句

六、union联合查询:用来把两个select查询结果集合并成一个结果集
七、字符串处理函数
八、子查询:把1个查询结果在另一个查询中使用

SQL Server正文:

一、连接池:

1.当执行到Close()方法时,ADO.NET会把connection对象放入连接池
2.连接池不属于SQL Server数据库,连接池是有由应用程序来维护的。
3.当应用程序退出时,连接池才会销毁。
4.如果连接对象长时间不用,连接对象才会销毁。
5.只有连接字符串完全相同,才能使用连接池里的对象。

DataSet就是个临时数据库
DataTable就是个临时数据表

二、模糊查询 like

 select * from TbStudent where stuName = '刘备'select * from TbStudent where stuAge>=20 and stuAge<=30

三、通配符:%,_,[],^

1.%通配符:匹配0-n个任意字符

select * from TbStudent where stuName like '%乔'

2._通配符,表示匹配任意1个字符
–查找1:名‘乔’,并且名只有2个字的人

select * from TbStudent where stuName like '_乔'

–查找2:名字里面有‘镜’字的学生信息

select * from TbStudent where stuName like '%镜%'

–查找3:名字里面没有‘乔’字的学生信息

 select * from TbStudent where stuName not like '%乔%'

3.’^'通配符:非,不是

select * from TbStudent where stuName like '%^乔%'-- 错误写法,原因?正确写法:
--查询不是16级的学生
select * from TbStudent where stuNumber not like '16%'
--^通配符:必须和[]搭配使用
select * from TbStudent where stuNumber like '1[^6]%'

4.’[]'通配符,表示匹配一定范围内的,任意1个字符
(1)%匹配0-N个任意字符与’[]'配合使用
练习一:查询姓‘诸葛’或者姓‘周’的所有记录

  方法一:select * from TbStudent where stuName like '诸葛%' or stuName like '周%'方法二:select * from TbStudent where stuName like '[诸葛,周]%'

(2)通配符[],永远只去匹配1个字符
练习二:查询14-16级的所有同学信息

--错误做法:select * from TbStudent where stuNumber like '[14,15,16]%'正确做法:
use Test
select * from TbStudent where stuNumber like '1[4-6]%'
select * from TbStudent where stuNumber like '1[4,5,6]%'

(3)^通配符:必须和[]搭配使用
练习三:查询不是16级的学生

  方法一:
select * from TbStudent where stuNumber not like '16%'方法二:
select * from TbStudent where stuNumber like '1[^6]%'

ps:^不是标准SQL通配符,它只是 SQL Server支持的,其他DBMS都不支持该符号
我们一般优先使用not like,尽量不用^

--练习:查询名字里没有‘乔’字的学生
select * from TbStudent where stuName not like '%乔%'
--错误:select * from TbStudent where stuName like '%[^乔]%'

(4) 匹配特殊字符:使用[]做转义
假如人名里就有’%’
–查询名字里有’%'的学生
select * from TbStudent where stuName like ‘%[%]%’

四、聚合函数

max(),min(),avg(),sum(),count(),count-big()

select * from TbStudent
--Max()
select MAX(stuAge) from TbStudent
--Min()
select MIN(stuAge) from TbStudent
--Avg()
select AVG(stuAge) from TbStudent
--sum()
select sum(stuAge) from TbStudent

count()统计记录条数*
count()的字段如果为NULL,是不会被计算在内的

select count(*) from TbStudent
select count(stuName) from TbStudent
select count(stuId) from TbStudent
select count(stuAge) from TbStudent

count()记录条数时,推荐使用主键或者1,作为被count对象(效率高)

select count(1) from TbStudent
select count(stuAge) from TbStudent

avg()时,如果有记录在该字段上为NULL,这条记录是不会被统计在内的

–这5个为什么叫聚合函数
–不管是多少条记录,经过这5个函数的运算后,都只能得到1个数。

--注意:
--错误写法:select stuName,AVG(stuAge) from TbStudent
--正确写法:select MAX(stuAge) as 最大值,MIN(stuAge) as 最小值,AVG(stuAge) as 平均值 from TbStudent

空值null处理

如果判断一个字段的值是不是null,需要使用is关键字,不能用=

--例一:查询籍贯是null的所有同学select * from TbStudent where stuAddress is null--例二:查询籍贯不是null的所有同学
select * from TbStudent where stuAddress is not null

–注意:not like,is not

--例一:查询所有同学信息,如果籍贯是null,就用'未知'代替
--ISNULL(原始数据,代替值)函数
select stuName,stuNumber,ISNULL(stuAddress,'未知')from TbStudent--例二:查询所有数学成绩为null的学生
select * from TbStudent where stuMath is null--例三:查询所有学生的考试成绩,如果为null,则用'缺考'代替--转义失败:select stuName,stuNumber,ISNULL(stuMath,'缺考')from TbStudent

–原因:stuMath是int类型,‘缺考’是varchar类型,所以不允许填充到同1列上
–数据表中任何1列,都只能存储同一种数据类型的数

–SQL里的null与任何数据做运算,结果还是null

--例四:查询所有的学生的数学成绩,并且给所有人的数据成绩+10分
select stuName,stuNumber,stuMath+10 as '数学' from TbStudent
--数学成绩为null的依然是null

cast:转义类型

查询所有同学信息,如果籍贯是null,就用’未知’代替
–ISNULL(原始数据,代替值)函数

select stuName,stuNumber,ISNULL(CAST(stuMath as varchar(4)),'缺考')from

**–

五、select 完整语序

语法:
–1.from [表名]
–2.where 条件
–3.group by 列
–4.having 筛选
–5.select [字段列表]
–5.1->[字段列表] 5.2->distinct 去除查询结果中完全重复的记录 5.3->top
–6.order by 列
–order by可以使用列的别名,是因为在第5步才给列起了别名。**

select * from TbStudent where stuAddress = '竹园'

1.order by排序

语法:order by[字段名] asc/desc
select * from TbStudent

--例1:查询每个同学的数学成绩,按照升序排列
select stuName,stuNumber,stuMath from TbStudent order by stuMath asc

–根据数学排序,如果数学成绩一样,再根据英语排序
–一个select语句,永远只能有一个Order by子句

select stuName,stuNumber,stuMath,stuEnglish from TbStudent order by stuMath asc,stuEnglish asc

注意:如果不写asc或者desc,默认的就是asc

select stuName,stuNumber,stuMath,stuEnglish from TbStudent
order by stuMath

–order by后边还可以跟表达式

--例:查询所有学生的平均成绩,按降序排列  /2.0得出的结果有小数
select stuName,(stuMath+stuEnglish)/2.0 as 平均分 from TbStudent
order by (stuMath+stuEnglish)/2.0 desc

–order by后边,可以使用列的别名,但是where子句中不能使用列的别名

--例:查询所有学生的平均成绩,按降序排列,并且显示平均分大于60分的
select stuName,(stuMath+stuEnglish)/2.0 as '平均分' from TbStudent
where (stuMath+stuEnglish)/2.0>60
order by 平均分

2.group by分组查询

查询男生女生各有多少人
–group by[字段名]
–分组的目的:做统计
use Test

--分组后的count,是统计各个分组内的记录条数,而不是整个表的记录条数
--有多少个分组,就会count出多少个值select stuGender,COUNT(1) from TbStudent group by stuGender

3.distinct去除重复项

select distinct stuGender from TbStudent

–练习1:查询每个地方有多少名同学

select stuaddress,COUNT(1) from TbStudent group by stuAddress

–练习2:根据各个地区人数排序

select stuaddress,COUNT(1) as 人数 from TbStudent group by stuAddress
order by 人数

4.分组查询原则:
在分组查询中,select后边的字段列表必须与group by中字段名一一对应
–除非它出现在了聚合函数里

select COUNT(1) as 人数,AVG(stuMath) as 数学平均分 from TbStudent

–练习1:查询每个班数学和英语的平均分

select stuclassId,avg((stuMath+stuEnglish)/2)from TbStudent group by stuClassId

–练习2:查询每个班的男生数学和英语的平均分

select stuclassId,avg((stuMath+stuEnglish)/2)from TbStudent where stuGender = 1 group by stuClassId

–练习3:查询每个班的男生数学和英语的平均分

select stuClassId,avg((stuMath+stuEnglish)/2)from TbStudent where stuGender = 1 group by stuClassIdselect '男',stuclassId,avg((stuMath+stuEnglish)/2)from TbStudent where stuGender = 1 group by stuClassId

–练习4:查询每个班的男生数学和英语的平均分,并且只显示平均分高于60分的

   --错误写法select stuclassId,avg((stuMath+stuEnglish)/2) from TbStudentwhere stuGender = 1 and avg((stuMath+stuEnglish)/2)>60 group by stuClassId

–上边的写法为什么不行?
where条件,只能筛选表里出现的原始字段数据

–如果要根据分组统计后出现的数据进行筛选,要使用having子句
–having只能跟在group by搭配使用

 --正确写法select stuclassId,avg((stuMath+stuEnglish)/2)from TbStudentwhere stuGender = 1 group by stuClassIdhaving avg((stuMath+stuEnglish)/2)>60

–总结:
1.列的别名只能用在order by之后,其他地方不能用
2.where只能对原始表中出现的数据做筛选时使用。
3.having只能对分组后的结果做筛选,having中不能出现为参与分组的列

ps:录入数据时,如果字段是bit类型的,给的值可以是0/1,也可以是’true’/'false’

insert into TbStudent(stuName,stuGender) values('鲁达','true')

5.给列起别名

select stuName as '姓名',--第一种起别名方法
stuName 学号,--第2种起名方法
性别 = stuGender--第3种起别名方法
from TbStudent

1.查询学生是否是党员

select stuName,stuNumber,stuGender,是否党员 = '是'from TbStudent
select * from TbStudent

2.查询出学生出生年份

select stuName,stuNumber,出生年份=2019-stuAge from TbStudent

3.构造新的无字段列

select *,'未婚' from TbStudent

6.where子句(条件查询)
where子句一定要放在被查询的表名的后面
1.查找性别为女的所有数据,SQL Server中判等使用=

select * from TbStudent where stuGender = 0

2.大小范围比较,关系运算:=,>,<,>=,<=,!=(不等于)

select * from TbStudent where stuAge>20and stuAge<25

3.逻辑运算 and or not

select * from TbStudent where stuClassId!=2

4.范围比较,between…and包含两端的数字
–between…and…是用来比较连续的值

select * from TbStudent where stuAge between 20 and 25

–查询所有1,2,3班的学生信息
–一个查询可以实现多重实现

select * from TbStudent where stuClassId = 1 or stuClassId=2 or stuClassId=3

–查询1,2,4班学生信息 使用in关键字 查询离散值

select * from TbStudent where stuClassId in(1,2,4)

–不在这3个班的同学

select * from TbStudent where stuClassId not in(1,3,4)

7.top关键字:查询前若干条语句

查询前5条数据

select top(5)*from TbStudent where stuClassId in(1,2)

六、union联合查询:用来把两个select查询结果集合并成一个结果集

select stuName,stuAge from TbStudent union
select clsName,clsNumber from TbClass

1.union查询,多个查询的列,个数必须相同
2.union查询,多个查询的列,各个列的数据类型必须一一对应
3.union会自动剔除完全重复记录,如果需要保留重复记录,使用union all

select stuName,stuAge from TbStudent union all
select stuName,stuAge from TbStudent

–练习1:统计销售明星

   select saleMan,SUM(number) from SaleRecords group by saleMan

–练习2:要求,在一个结果集里查询出学生的英语最高分,最低分,平均分

select MAX(stuEnglish) as 最高分,
MIN(stuEnglish) as 最低分,
AVG(stuEnglish) as 平均分
from TbStudent

select ‘最高分’ as 类别,MAX(stuEnglish) as 分数 from TbStudent union all
select ‘最低分’ as 类别,min(stuEnglish) as 分数 from TbStudent union all
select ‘平均分’ as 类别,avg(stuEnglish) as 分数 from TbStudent

七、字符串处理函数

1.显示数值对应的ASCII
select CHAR(47)

–2.显示ASCII对应的数值

select ASCII('a')

–3.查询子串在长字符串中首次出现的索引位置
–注意:SQL中,索引下标是从1开始计数的,不是从0计数

select CHARINDEX('o','I love you')

–4.取子串,从左边连续截取3个字符

select left('abcdef',3)

–5.从右边连续截取3个字符

select right('abcdef',3)

–6.substring()从第2个下标开始截取(包含2),连续截取4个

select SUBSTRING('abcdef',2,4)

–7.lower()大写转小写

select LOWER('ABC')

–8.upper()小写转大写

select UPPER('and')

–9.剔除字符串左右两端空格
–ltrim剔除左边空格
–rtrim剔除右边空格

select rtrim(LTRIM('   刘亚萌    ')) + ',我来卖个萌'

–10.子串的替换,替换所有的能匹配的子串

select REPLACE('东哥真帅','帅','有爱')

–11.只替换固定位置的子串:stuff(字符串,起始索引位置,替换长度,替换子串)

select STUFF('你一定能行',2,2,'真的')

–12.字符串翻转

print reverse('天安门')
select REVERSE('天安门')

–13.space添加空格

select '刘亚萌' + space(5) + '别瞌睡'

–注意:这些函数的参数,都可以使用表中的字段名来代替

–14.日期类型函数
–SQL2005及以下版本,日期类型只有DATETIME
–SQL2008及以上版本,日期类型有3个:datetime,date,datetime2

–三者区别:
date:只存储年月日,所占空间最小
datetime:存储年月日时分秒毫秒。时间格式:yyyy-MM-dd HH:mm:ss:fff,3个f,精确到1毫秒(ms),示例2019-04-15 19:58:16.433。
字段类型使用GETDATE()
datetime2:存储年月日时分秒毫秒微秒。时间格式:yyyy-MM-dd HH:mm:ss.fffffff,7个f,精确到0.1微秒,示例:2019-04-15 19:59:2888090
字段类型使用:SYSDATETIME()

DATEADD日期函数

--DateAdd(datepart,number,date)
select DATEADD(DAY,200,GETDATE())
select DATEADD(MONTH,200,GETDATE())
select DATEADD(YEAR,200,GETDATE())
select DATEADD(HOUR,200,GETDATE())
select DATEADD(MINUTE,200,GETDATE())
select DATEADD(SECOND,200,GETDATE())select * from TbStudent
select stuName,DATEADD(YEAR,stuAge,getdate()) from TbStudent

datediff计算时间差

--datediff(datepart,date1,date2)
--date1是较早的时间,date2是较新的时间
select
DATEDIFF(MONTH,'1999-9-9',getdate())

–如果student表中有birthday字段,如何获取每人的年龄

select DATEDIFF(year,birthday,GETDATE())from student

day(),month(),year()

select DAY(getdate())  --今天日期
select MONTH('1998-10-18')--月份 10
select DATEPART(year,getdate())--年2019

update更新,删除

–语法:
–update [表名] set …where
–练习1:把学生的年龄改为20岁

update TbStudent set stuAge = 20,stuEnglish = 60

–练习2:把英语成绩为null的学生,改成60分

update TbStudent set stuEnglish = 60 where stuEnglish is null
select * from TbStudent

–练习3:把女生的年龄改小了1岁

update TbStudent set stuAge = stuAge - 1 where stuGender = 0

–delete删除数据
–语法:
–delete from[表名] where…

–练习1:把家是菊园的同学记录删除掉

delete from TbStudent where stuAddress = '菊园'
select * from t

–练习2:删除表中所有记录

delete from callRecords
truncate table TbClass callRecords

–区别:
1.delete删除了数据以后,自增的字段不会自动归0.
truncate删除了数据以后,表的自增字段会自动归0.
2.delete可以使用where子句,truncate不能使用,它只能删除表里的所有数据。
3.truncate删除的数据不能恢复,delete删除的数据可以在一定条件下,根据日志文件的记录来恢复。
原因:delete删除数据时,系统会自动在.ldf中写下日志。而truncate删除时,是不做日志的。
4.truncate删除时速度非常快,delete删除时要慢一点

–练习:把所有姓’刘’的同学,改成姓’郭’

update TbStudent set stuName=REPLACE(stuName,'刘','郭')where stuName like '刘%'

case语句
case语法1:

--case when condition1 then returnValue1
--when condition2 then returnValue2
--when condition3 then returnValue3
--......
--else defaultValue
--end as[列别名]

–注意:
– 1.CASE语句就是构造出1个新的列
– 2.使用case语句必须有end,但是可以不起别名
– 3.所有的返回值类型必须一致
– 4.case语句的作用类似于C#中的if…else…

–练习1:查询每个学生的学号、姓名、最好成绩

--select stuName,stuNumber,
--case when stuMath>stuEnglish then stuMath
--else stuEnglish
--end as 最优成绩
--from TbStudent

–练习2:查询学生的数学成绩,以优良中差4级显示

select stuNumber,stuName,
case when stuMath>=90 then '优'
when stuMath>=80 then '良'
when stuMath>=70 then '中'
else '差'
end as 数学成绩
from TbStudent

case语法2

--case表达式 when value1 then returnValue1
--           when value2 then returnValue2
--           ...
--           else end as[别名]
--类似于C#中的switch...case  只能做离散值的判断

–练习1:查询学生信息,显示姓名、学号、性别,
–其中性别一栏如果是0,显示“美女”,1显示“帅哥”

--方法1 应用更广泛
select stuName,stuNumber,
case when stuGender = 0 then '美女'
when stuGender = 1 then '帅哥'
end as性别
from TbStudent--方法2
select stuName,stuNumber,
case stuGender
when 0 then '美女'
when 1 then '帅哥'
else '人妖'
end as 性别
from TbStudent

八、 子查询:把1个查询结果在另一个查询中使用(把一个查询语句做一个结果集使用)

–查询:班级号是2,名字里带‘乔’字的同学信息

select * from TbStudent where stuClassId = 2 and stuName like '%乔%'

–子查询版
–当使用子查询时,必须给子查询语句最后的结果集起别名

select stuName,stuNumber,stuAddress from
(select*from TbStudent where stuClassId=1) as tb1 where stuName like '%乔'

–练习1:查询’13级.net班’所有学生信息

select stuName,stuNumber,stuAddress from TbStudent
where stuClassId =
(select clsId  from TbClass where clsId='1')

–练习2:查询所有‘14级数据库班’和‘13嵌入式班’的所有同学的信息

select stuName,stuNumber,stuAddress from TbStudent
where stuClassId in
(select clsId from TbClass WHERE clsName='14级数据库班'or clsName='13嵌入式班')

–练习3:删除所有姓’诸葛’的同学

--方法1
delete from TbStudent where stuName like '诸葛%'--方法2
delete from TbStudent where stuId in
(select stuId from TbStudent where stuName like'诸葛%')

子查询高级应用分页查询

–每页显示5条记录

 --查询第1页select top(5) * from TbStudent--查询第2页select top(5) * from TbStudent where stuId not in(select top(1*5)stuId from TbStudent order by stuId asc) order by stuId ASC

–思路:排除前多少页条记录,去剩下记录的前几

 --第1种方法:效率低select top(M) * from TbStudentwhere stuId not in(select top((N-1)*M)stuId from TbStudent)--第2种方法
查询第N页,每页显示M条  规律--select * from--(select *,ROW_NUMBER() over (order by stuId desc)as rowNumber from TbStudent)--as 别名--where 别名.rowNumber between (N-1)M+1 and N*Mselect *,ROW_NUMBER() over(order by stuId desc)as rowNumber from TbStudent--查询‘第2页’--注意:当子查询的结果集作为主查询的数据源是,必须给子查询的结果集起别名select * from(select *,ROW_NUMBER() over(order by stuId desc)as rowNumber from TbStudent)as tb1where tb1.rowNumber between 1*5+1 and 2*5

SQL Server入门二相关推荐

  1. SQL Server入门(四) 官网关于 SQL Server初级入门教程

    原文http://www.shareblogs.top/444/ 学习内容 这些教程将帮助你理解 SSMS 中提供的信息以及如何利用其功能. 熟悉 SSMS 的最好方式是进行实践演练. 这些教程将使你 ...

  2. sql server 入门_SQL Server中的数据挖掘入门

    sql server 入门 介绍 (Introduction) In past chats, we have had a look at a myriad of different Business ...

  3. sql server 入门教程

    sql server 入门教程 1.创建数据库 1)鼠标右键数据库选项,点击新建数据库 2)命名数据库 根据自己业务情况取一个自定义数据库名字,比如:my_database 3)查看数据库 如果添加没 ...

  4. sql server 入门篇

    sql server入门篇 一.创建数据库 二.修改数据库 三.删除数据库 四.数据表创建 五.数据表数据修改(增.删.改) 六.数据表查询 七.数据表操作 一.创建数据库 1.格式 CREATE D ...

  5. sql server 入门_SQL Server查询调整入门

    sql server 入门 This article will cover some essential techniques for SQL query tuning. Query tuning i ...

  6. SQL Server 实验二 创建数据库

    SQL Server 实验二 创建数据库 这是一个系列,需几个文档一起看 Use master go Drop Database YGGLcreate database YGGL on (name=' ...

  7. LabVIEW通过ADO连接SQL Server 方法二

    数据库连接方法2 一.数据源配置 1. 打开ODBC数据源管理器,点击"添加" 2. 选择SQL Server,点击"完成" 3. 输入名称,并选择服务器,点击 ...

  8. aws rds监控慢sql_AWS RDS SQL Server入门

    aws rds监控慢sql This article describes the concepts and steps to setup AWS RDS SQL Server(Relational D ...

  9. 使用WinDbg调试SQL Server——入门

    这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server.在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题 ...

最新文章

  1. Unity3D热更新LuaFramework入门实战
  2. “为啥Kaggle奖金那么少?”一场25000美元的比赛,却因“抠门”引发激烈讨论...
  3. asp.net 关于列表问题。点击文章标题,显示文章内容。
  4. medical research
  5. js函数重写php,深入讲解js覆盖原有方法 提供重写方法
  6. 腾讯,字节等大厂面试真题汇总,深夜思考
  7. ​腾讯第一季度员工平均月薪 7.6 万元;“淘宝特价版”App 正式更名为“淘特”;Deno 1.10 正式发布|极客头条...
  8. java9什么时候公布_Java 9正式版有可能被推迟到9月21号发布
  9. adb提示已停止工作问题的解决方案
  10. 德鲁克谈《自我管理》笔记摘要
  11. 网络表情NLP(二)︱特殊表情包+emoji识别
  12. 调焦后焦实现不同距离成像_分辨率、调焦和景深
  13. win8计算机可用内存不足,Win8.1频繁提示内存不足是怎么回事
  14. 申宝证券-个股分化严重
  15. 【数论】同余(四):一元线性同余方程组(两两相消、中国剩余定理)
  16. 解决win10下samba不能访问
  17. Python自动化办公——生成Excel入库统计表
  18. 来自#Devoxx 2014的WebSocket螺母和螺栓的幻灯片
  19. 金融投资之重要财务指标 (From Corporate Finance, 6th Edition) 与Tushare数据接口
  20. 用Unity写一个12306验证器的恶搞图生成软件

热门文章

  1. 初等概率论期中复习(1)基本概念
  2. Android room存储高级数据类型
  3. Wigner-Ville 分布
  4. 【实训01】基于视图的访问控制
  5. 一、JavaScript基本语法
  6. 神经网络训练是什么意思,神经网络训练准确率
  7. java报表开发之报表总述
  8. 总结 这三款原型工具今年最火
  9. 写一个无尽的拉格朗日升本脚本
  10. 正达信通丨【功能介绍】ZedaIoT物联网平台的视频监控设置说明