一、SQL 基础知识

1、DDL(数据定义语言)

1)创建数据表

  1. --创建数据表
  2. create table Test(Id int not null, Age char(20));
  3. --创建数据表
  4. create table T_Person1(Id int not null,
  5. Name nvarchar(50),
  6. Age int null);
  7. --创建表,添加外键
  8. Create table T_Students(
  9. StudentNo char(4),
  10. CourseNo char(4),
  11. Score int,
  12. Primary key(StudentNo),
  13. Foreign key(CourseNo) References T_Course(CourseNo)
  14. );

2)修改表结构

  1. --修改表结构,添加字段
  2. Alter table T_Person add NickName nvarchar(50) null;
  3. --修改表结构,删除字段
  4. Alter table T_Person Drop NickName;

3)删除数据表

  1. --删除数据表
  2. Drop table T_Person;
  3. --删除数据表
  4. drop table test

4)创建索引

  1. Create [Unique] Index <索引名> on <基本表名>(<列明序列>);

2、DML(数据操纵语言)

1)插入语句

  1. insert into T_Person1(Id,Name,Age) values(1,'Vicky',20)
  2. --插入一条据数,字段和值必须前后对应
  3. insert into T_Preson1(Id,Name,Age) values(2,'Tom',19)
  4. insert into T_Person1(Id,Name,Age) values(4,'Jim',19)
  5. insert into T_Person1(Id,Name,Age) values(5,'Green',20)
  6. insert into T_Person1(Id,Name,Age) values(6,'Hanmeimei',21)
  7. insert into T_Person1(Id,Name,Age) values(7,'Lilei',22)
  8. insert into T_Person1(Id,Name,Age) values(8,'Sky',23)
  9. insert into T_Person1(Id,Name,Age) values(newid(),'Tom',19)

2)更新语句

  1. --修改列,把所有的age字段改为30
  2. update T_Person1 set age=30
  3. --把所有的Age字段和Name字段设置为...
  4. update T_Person1 set Age=50,Name='Lucy'
  5. update T_Person1 set Name='Frankie' where Age=30
  6. update T_Person1 set Name=N'中文字符' where Age=20
  7. --中文字符前面最好加上N,以防出现乱码
  8. update T_Person1 set Name=N'成年人' where Age=30 or Age=50

3)删除语句

  1. delete from T_Person1
  2. --删除表中全部数据
  3. delete from T_Person1 where Name='Tom'
  4. --根据条件删除数据

4)查询语句

查询语句非常强大,几乎可以查任意东西!

  1. -----------------
  2. ---- 数据检索 -----
  3. -----------------
  4. --查询不与任何表关联的数据.
  5. SELECT 1+1; --简单运算
  6. select 1+2 as 结果
  7. SELECT newid();--查询一个GUID字符创
  8. select GETDATE() as 日期 --查询日期
  9. --可以查询SQLServer版本
  10. select @@VERSION as SQLServer版本
  11. --一次查询多个
  12. select 1+1 结果, GETDATE() as 日期, @@VERSION as 版本, NEWID() as 编号
  13. --简单的数据查询.HelloWorld级别
  14. SELECT * FROM T_Employee;
  15. --只查询需要的列.
  16. SELECT FNumber FROM T_Employee;
  17. --给列取别名.As关键字
  18. SELECT FNumber AS 编号, FName AS 姓名 FROM T_Employee;
  19. --使用 WHERE 查询符合条件的记录.
  20. SELECT FName FROM T_Employee WHERE FSalary<5000;
  21. --对表记录进行排序,默认排序规则是ASC
  22. SELECT * FROM T_Employee ORDER BY FAge ASC,FSalary DESC;
  23. --ORDER BY 子句要放在 WHERE 子句之后.
  24. SELECT * FROM T_Employee WHERE FAge>23 ORDER BY FAge DESC,FSalary DESC;
  25. --WHERE 中可以使用的逻辑运算符:or、and、not、<、>、=、>=、<=、!=、<>等.
  26. --模糊匹配,首字母未知.
  27. SELECT * FROM T_Employee WHERE FName LIKE '_arry';
  28. --模糊匹配,前后多个字符未知.
  29. SELECT * FROM T_Employee WHERE FName LIKE '%n%';
  30. --NULL 表示"不知道",有 NULL 参与的运算结果一般都为 NULL.
  31. --查询数据是否为 NULL,不能用 = 、!= 或 <>,要用IS关键字
  32. SELECT * FROM T_Employee WHERE FName IS NULL;
  33. SELECT * FROM T_Employee WHERE FName IS NOT NULL;
  34. --查询在某个范围内的数据,IN 表示包含于,IN后面是一个集合
  35. SELECT * FROM T_Employee WHERE FAge IN (23, 25, 28);
  36. --下面两条查询语句等价。
  37. SELECT * FROM T_Employee WHERE FAge>=23 AND FAge<=30;
  38. SELECT * FROM T_Employee WHERE FAge BETWEEN 23 AND 30;
  39. ----创建一张Employee表,以下几个Demo中会用的这张表中的数据
  40. ----在SQL管理器中执行下面的SQL语句,在T_Employee表中进行练习
  41. create table T_Employee(FNumber varchar(20),
  42. FName varchar(20),
  43. FAge int,
  44. FSalary Numeric(10,2),
  45. primary key (FNumber)
  46. )
  47. insert into T_Employee(FNumber,FName,FAge,FSalary) values('DEV001','Tom',25,8300)
  48. insert into T_Employee(FNumber,FName,FAge,FSalary) values('DEV002','Jerry',28,2300.83)
  49. insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES001','Lucy',25,5000)
  50. insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES002','Lily',25,6200)
  51. insert into T_Employee(FNumber,FName,FAge,FSalary) values('SALES003','Vicky',25,1200)
  52. insert into T_Employee(FNumber,FName,FAge,FSalary) values('HR001','James',23,2200.88)
  53. insert into T_Employee(FNumber,FName,FAge,FSalary) values('HR002','Tom',25,5100.36)
  54. insert into T_Employee(FNumber,FName,FAge,FSalary) values('IT001','Tom',28,3900)
  55. insert into T_Employee(FNumber,FAge,FSalary) values('IT002',25,3800)
  56. --开始对T_Employee表进行各种操作
  57. --检索所有字段
  58. select * from T_Employee
  59. --只检索特定字段
  60. select FName,FAge from T_Employee
  61. --带过滤条件的检索
  62. select * from T_Employee
  63. where FSalary<5000
  64. --可更改显示列名的关键字as,as—起别名
  65. select FName as 姓名,FAge as 年龄,FSalary as 薪水 from T_Employee

二、SQL Server 中的数据类型

1、精确数字类型

  1. bigint
  2. int
  3. smallint
  4. tinyint
  5. bit
  6. money
  7. smallmoney

2、字符型数据类型,MS建议用VarChar(max)代替Text

  1. Char
  2. VarChar
  3. Text

3、近似数字类型

  1. Decimal
  2. Numeric
  3. Real
  4. Float

4、Unicode字符串类型

  1. Nchar
  2. NvarChar
  3. Ntext

5、二进制数据类型,MS建议VarBinary(Max)代替Image数据类型,max=231-1

  1. Binary(n) 存储固定长度的二进制数据
  2. VarBinary(n) 存储可变长度的二进制数据,范围在n~(1,8000)
  3. Image 存储图像信息

6、日期和时间类型,数据范围不同,精确地不同

  1. DateTime
  2. SmallDateTime

7、特殊用途数据类型

  1. Cursor
  2. Sql-variant
  3. Table
  4. TimeStamp
  5. UniqueIdentifier
  6. XML

三、SQL中的内置函数

  1. --------------------------------------
  2. -----数据汇总-聚合函数---------
  3. --------------------------------------
  4. --查询T_Employee表中数据条数
  5. selectCOUNT(*)fromT_Employee
  6. --查询工资最高的人
  7. selectMAX(FSalary)asTop1fromT_Employee
  8. --查询工资最低的人
  9. selectMin(FSalary)asBottom1fromT_Employee
  10. --查询工资的平均水平
  11. selectAvg(FSalary)as平均水平fromT_Employee
  12. --所有工资的和
  13. selectSUM(FSalary)as总工资fromT_Employee
  14. --查询工资大于5K的员工总数
  15. selectCOUNT(*)astotalfromT_Employee
  16. whereFSalary>5000
  17. ------------------------------
  18. -----数据排序-------
  19. ------------------------------
  20. --按年龄排序升序,默认是升序
  21. select*fromT_Employee
  22. orderbyFAgeASC
  23. --多个条件排序,先什么,后什么,在前一个条件相同的情况下,根据后一个条件进行排列
  24. --where在orderby之前
  25. select*fromT_Employee
  26. orderbyFAgeASC,FSalaryDESC
  27. ------------------------------
  28. -----模糊匹配-------
  29. ------------------------------
  30. --通配符查询
  31. --1.单字符通配符_
  32. --2.多字符通配符%
  33. --以DEV开头的任意个字符串
  34. select*fromT_Employee
  35. whereFNumberlike'DEV%'
  36. --以一个字符开头,om结尾的字符串
  37. select*fromT_Employee
  38. whereFNamelike'_om'
  39. --检索姓名中包含m的字符
  40. select*fromT_Employee
  41. whereFNamelike'%m%'
  42. ------------------------------
  43. -----空值处理-------
  44. ------------------------------
  45. --null表示不知道,不是没有值
  46. --null和其他值计算结果是null
  47. selectnull+1
  48. --查询名字是null的数据
  49. select*fromT_Employee
  50. whereFNameisnull
  51. --查询名字不为空null的数据
  52. select*fromT_Employee
  53. whereFNameisnotnull
  54. --年龄是23,25,28中的员工
  55. select*fromT_Employee
  56. whereFAge=23orFAge=25orFAge=28
  57. --或者用in集合查询
  58. --年龄是23,25,28中的员工
  59. select*fromT_Employee
  60. whereFAgein(23,25,28)
  61. --年龄在20到25之间的员工信息
  62. select*fromT_Employee
  63. whereFAge>20andFAge<25
  64. --年龄在20到25之间的员工信息,包含25
  65. select*fromT_Employee
  66. whereFAgebetween20and25
  67. ------------------------------
  68. -----数据分组-------
  69. ------------------------------
  70. SelectFAge,COUNT(*)fromT_Employee
  71. groupbyFAge
  72. --1.根据年龄进行分组
  73. --2.再取出分组后的年龄的个数
  74. --注意:没有出现在groupby子句中的字段,不能出现在select语句后的列名列表中(聚合函数除外)
  75. --groupby必须出现在where后面
  76. SelectFAge,AVG(FSalary),COUNT(*)fromT_Employee
  77. groupbyFAge
  78. --错误用法
  79. SelectFAge,FName,COUNT(*)fromT_Employee
  80. groupbyFAge
  81. --加上where的groupby子句
  82. --groupby必须出现在where后面
  83. SelectFAge,AVG(FSalary),COUNT(*)fromT_Employee
  84. whereFAge>=25
  85. groupbyFAge
  86. --Having不能包含查不到的字段,只能包含聚合函数和本次查询有关的字段
  87. selectFAge,COUNT(*)fromT_Employee
  88. groupbyFAge
  89. HavingCOUNT(*)>1
  90. selectFAge,COUNT(*)fromT_Employee
  91. whereFSalary>2500
  92. groupbyFAge
  93. --HAVING子句中的列'T_Employee.FSalary'无效,因为该列没有包含在聚合函数或GROUPBY子句中
  94. --Having是对分组后信息的过滤,能用的列和select中能有的列是一样的。
  95. --因此,having不能代替where
  96. selectFAge,COUNT(*)fromT_Employee
  97. groupbyFAge
  98. HavingFSalary>2500
  99. ------------------------------
  100. -----确定结果集行数-------
  101. ------------------------------
  102. --取出所有员工的信息,根据工资降序排列
  103. select*fromT_Employee
  104. orderbyFSalaryDESC
  105. --取出前三名员工的信息,根据工资降序排列
  106. selecttop3*fromT_Employee
  107. orderbyFSalaryDESC
  108. --根据工资取出排名在6-8的员工信息,按工资降排列
  109. selecttop3*fromT_Employee
  110. whereFNumbernotin
  111. (selecttop5FNumberfromT_EmployeeorderbyFSalaryDESC)
  112. orderbyFSalaryDESC
  113. ---修改数据表,添加字段,更新字段的值等操作。
  114. altertableT_EmployeeaddFSubCompanyvarchar(20)
  115. altertableT_EmployeeaddFDepartmentvarchar(20)
  116. updateT_EmployeesetFSubCompany='Beijing',FDepartment='Development'
  117. whereFNumber='DEV001';
  118. updateT_EmployeesetFSubCompany='ShenZhen',FDepartment='Development'
  119. whereFNumber='DEV002';
  120. updateT_EmployeesetFSubCompany='Beijing',FDepartment='HumanResource'
  121. whereFNumber='HR001';
  122. updateT_EmployeesetFSubCompany='Beijing',FDepartment='HumanResource'
  123. whereFNumber='HR002';
  124. updateT_EmployeesetFSubCompany='Beijing',FDepartment='InfoTech'
  125. whereFNumber='IT001';
  126. updateT_EmployeesetFSubCompany='ShenZhen',FDepartment='InfoTech'
  127. whereFNumber='IT002'
  128. updateT_EmployeesetFSubCompany='Beijing',FDepartment='Sales'
  129. whereFNumber='SALES001';
  130. updateT_EmployeesetFSubCompany='Beijing',FDepartment='Sales'
  131. whereFNumber='SALES002';
  132. updateT_EmployeesetFSubCompany='ShenZhen',FDepartment='Sales'
  133. whereFNumber='SALES003';
  134. select*fromT_Employee
  135. ------------------------------
  136. ------去掉重复数据------
  137. ------------------------------
  138. --所有员工的部门信息
  139. selectDistinctFDepartmentfromT_Employee;
  140. selectFDepartment,FSubCompany
  141. fromT_Employee
  142. --以上两个例子结合起来比较,Distinct针对的是整行进行比较的
  143. selectDistinctFDepartment,FSubCompany
  144. fromT_Employee
  145. -----------------------------
  146. -----联合结果集Union--------
  147. ------------------------------
  148. --创建一个测试表T_TempEmployee,并插入数据
  149. CreateTableT_TempEmployee(FIdCardNumbervarchar(20),FNamevarchar(20),FAgeint,Primarykey(FIdCardNumber));
  150. insertintoT_TempEmployee(FIdCardNumber,FName,FAge)values('1234567890121','Sarani',33);
  151. insertintoT_TempEmployee(FIdCardNumber,FName,FAge)values('1234567890122','Tom',26);
  152. insertintoT_TempEmployee(FIdCardNumber,FName,FAge)values('1234567890123','Yamaha',38);
  153. insertintoT_TempEmployee(FIdCardNumber,FName,FAge)values('1234567890124','Tina',36);
  154. insertintoT_TempEmployee(FIdCardNumber,FName,FAge)values('1234567890125','Konkaya',29);
  155. insertintoT_TempEmployee(FIdCardNumber,FName,FAge)values('1234567890126','Foortia',29);
  156. select*fromT_TempEmployee
  157. --Union关键字,联合2个结果
  158. --把2个查询结果结合为1个查询结果
  159. --要求:上下2个查询语句的字段(个数,名字,类型相容)必须一致
  160. selectFName,FagefromT_TempEmployee
  161. union
  162. selectFName,FagefromT_Employee
  163. selectFNumber,FName,Fage,FDepartmentfromT_Employee
  164. union
  165. selectFIdCardNumber,FName,Fage,'临时工,无部门'fromT_TempEmployee
  166. ---UnionAll:不合并重复数据
  167. --Union:合并重复数据
  168. selectFName,FAgefromT_Employee
  169. unionall
  170. selectFName,FAgefromT_TempEmployee
  171. selectFAgefromT_Employee
  172. union
  173. selectFAgefromT_TempEmployee
  174. --注意:Union因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复,那么就用Unionall
  175. --例子:报名
  176. select'正式员工最高年龄',MAX(FAge)fromT_Employee
  177. unionall
  178. select'正式员工最低年龄',MIN(FAge)fromT_Employee
  179. unionall
  180. select'临时工最高年龄',MAX(FAge)fromT_TempEmployee
  181. unionall
  182. select'临时工最低年龄',MIN(FAge)fromT_TempEmployee
  183. --查询每位正式员工的信息,包括工号,工资,并且在最后一行加上员工工资额合计
  184. selectFNumber,FSalaryfromT_Employee
  185. unionall
  186. select'工资额合计',SUM(FSalary)fromT_Employee
  1. ------------------------------
  2. -----SQL其他内置函数------
  3. ------------------------------
  4. --1.数学函数
  5. --ABS():求绝对值
  6. --CEILING():舍入到最大整数
  7. --FLOOR():舍入到最小整数
  8. --ROUND():四舍五入
  9. selectABS(-3)
  10. selectCEILING(3.33)
  11. selectCEILING(-3.61)
  12. selectFLOOR(2.98)
  13. selectFLOOR(-3.61)
  14. selectROUND(-3.61,1)--第二个参数是精度,小数点后的位数
  15. selectROUND(-3.61,0)
  16. selectROUND(3.1415926,3)
  17. --2.字符串函数
  18. --LEN():计算字符串长度
  19. --LOWER(),UPPER():转大小写
  20. --LTRIM():去掉字符串左侧的空格
  21. --RTRIM():去掉字符串右侧的空格
  22. --SUBSTRING(string,start_positoin,length):
  23. --索引从1开始
  24. selectSUBSTRING('abc111',2,3)--结果是bc1
  25. selectFName,SUBSTRING(FName,2,2)fromT_Employee
  26. selectLEN('abc')--结果是3
  27. selectFName,LEN(FName)fromT_Employee
  28. --没有可以同时既去掉左边空格、又去掉右边空格的TRIM()内置函数,所以先左后右的进行TRim,当然,你也可以先右后左
  29. selectLTRIM('abc'),RTRIM('abc'),LEN(LTRIM(RTRIM('abc')))
  30. --3.日期函数
  31. --GETDATE():获取当前日期时间
  32. --DATEADD(datepart,numbre,date):计算增加以后的日期,
  33. --参数date为待计算的日期;参数number为增量;参数datepart为计量单位,时间间隔单位;
  34. --DATEDIFF(datepart,startdate,enddate):计算2个日期之间的差额
  35. --DATEPART(datepart,date):返回一个日期的特定部分,比如年月日,时分秒等.
  36. /*
  37. 值缩写(SqlServer)(Access和ASP)说明
  38. YearYyyyyy年1753~9999
  39. QuarterQqq季1~4
  40. MonthMmm月1~12
  41. DayofyearDyy一年的日数,一年中的第几日1-366
  42. DayDdd日,1-31
  43. WeekdayDww一周的日数,一周中的第几日1-7
  44. WeekWkww周,一年中的第几周0~51
  45. HourHhh时0~23
  46. MinuteMin分钟0~59
  47. SecondSss秒0~59
  48. MillisecondMs-毫秒0~999
  49. */
  50. selectDATEADD(DAY,3,getdate())
  51. selectDATEADD(MONTH,-3,getdate())
  52. selectDATEADD(HOUR,8,getdate())
  53. selectDATEDIFF(YEAR,'1989-05-01',GETDATE())
  54. selectDATEDIFF(HH,GETDATE(),DATEADD(DAY,-3,GETDATE()))
  55. --查询员工的工龄,年为单位
  56. selectFName,FInDate,DATEDIFF(year,FInDate,getdate())as工龄fromT_Employee
  57. --取出每一年入职员工的个数V1
  58. selectDATEDIFF(year,FInDate,getdate()),COUNT(*)
  59. fromT_Employee
  60. groupbyDATEDIFF(year,FInDate,getdate())
  61. --取出每一年入职员工的个数V2
  62. selectDATEPART(YEAR,FInDate),COUNT(*)
  63. fromT_Employee
  64. groupbyDATEPART(YEAR,FInDate)
  65. selectDATEPART(YEAR,GETDATE())
  66. selectDATEPART(MONTH,GETDATE())
  67. selectDATEPART(DAY,GETDATE())
  68. selectDATEPART(HH,GETDATE())
  69. selectDATEPART(MINUTE,GETDATE())
  70. selectDATEPART(SECOND,GETDATE())
  71. --4.类型转换函数
  72. --CAST(expressionasdata_type)
  73. --CONVERT(data_type,expression)
  74. selectCAST('123'asint),CAST('2010-09-08'asdatetime),
  75. CONVERT(datetime,'2010-09-08'),CONVERT(varchar(20),123)
  76. --5.空值处理函数isNull
  77. --ISNULL(expression,value)
  78. selectISNULL(FName,'佚名')as姓名fromT_Employee
  79. --6.CASE函数用法:
  80. --1.单值判断:相当于switch.case
  81. --CASEexpression
  82. --WHENvalue1thenreturnvalue1
  83. --WHENvalue2thenreturnvalue2
  84. --WHENvalue3thenreturnvalue3
  85. --ELSEdefault_return_value
  86. --END
  87. --判断客户类型
  88. selectFName,
  89. (
  90. caseFLevel
  91. when1then'普通客户'
  92. when2then'会员'
  93. when3then'VIP'
  94. else'未知客户类型'
  95. End
  96. )as客户类型
  97. fromT_Customer
  98. --收入水平查询
  99. selectFName,
  100. (
  101. case
  102. whenFSalary<2000then'低收入'
  103. whenFSalary>=2000andFSalary<=5000then'中等收入'
  104. else'高收入'
  105. end
  106. )as收入水平
  107. fromT_Employee
  108. --这里有一道关于CASE用法的面试题
  109. --表T中有ABC三列,用SQL语句实现:当A列大于B列时选择A列,否则选择B列;
  110. --当B列大于C列时选择B列,否则选择C列。
  111. select
  112. (
  113. case
  114. whena>bthenaelseb
  115. end
  116. ),
  117. (
  118. case
  119. whenb>cthenbelsec
  120. end
  121. )
  122. fromT
  123. ---------------------------------------
  124. selectFNumber,
  125. (
  126. case
  127. whenFAmount>0thenFAmount
  128. else0
  129. end
  130. )as收入,
  131. (
  132. case
  133. whenFAmount<0thenABS(FAmount)
  134. else0
  135. end
  136. )as支出
  137. fromT
  138. -----------------------------------------
  139. --球队比赛那个题
  140. --有一张表T_Scroes,记录比赛成绩:
  141. --DateNameScroe
  142. --2008-8-8拜仁胜
  143. --2008-8-9奇才胜
  144. --2008-8-8湖人胜
  145. --2008-8-10拜仁负
  146. --2008-8-8拜仁负
  147. --2008-8-12奇才胜
  148. --要求输出下面格式:
  149. --Name胜负
  150. --拜仁12
  151. --湖人10
  152. --奇才20
  153. --注意:在中文字符串前加N,比如N'胜'
  154. createtableT_Scores(
  155. [Date]datetimenullcollate
  156. [Name]nvarchar(50)
  157. )
  158. CREATETABLE[T_Scores]([Date][datetime]NULL,
  159. [Name][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
  160. [Score][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL
  161. );
  162. INSERT[T_Scores]([Date],[Name],[Score])VALUES(CAST(0x00009AF200000000ASDateTime),N'拜仁',N'胜');
  163. INSERT[T_Scores]([Date],[Name],[Score])VALUES(CAST(0x00009AF300000000ASDateTime),N'奇才',N'胜');
  164. INSERT[T_Scores]([Date],[Name],[Score])VALUES(CAST(0x00009AF300000000ASDateTime),N'湖人',N'胜');
  165. INSERT[T_Scores]([Date],[Name],[Score])VALUES(CAST(0x00009AF400000000ASDateTime),N'拜仁',N'负');
  166. INSERT[T_Scores]([Date],[Name],[Score])VALUES(CAST(0x00009AF200000000ASDateTime),N'拜仁',N'负');
  167. INSERT[T_Scores]([Date],[Name],[Score])VALUES(CAST(0x00009AF600000000ASDateTime),N'奇才',N'胜');
  168. select*fromT_Scores
  169. --列出第一个表格
  170. --统计每支队伍的胜负情况
  171. selectName,
  172. (
  173. caseScore
  174. whenN'胜'then1
  175. else0
  176. end
  177. )as胜,
  178. (
  179. caseScore
  180. whenN'负'then1
  181. else0
  182. end
  183. )as负
  184. fromT_Scores
  185. selectName,
  186. sum
  187. (
  188. caseScore
  189. whenN'胜'then1
  190. else0
  191. end
  192. )as胜,
  193. sum
  194. (
  195. caseScore
  196. whenN'负'then1
  197. else0
  198. end
  199. )as负
  200. fromT_Scores
  201. groupbyName
  202. --根据每个队的胜负判断出胜负的场数
  1. --题5)创建一张表,记录电话呼叫员的工作流水,记录呼叫员编号,对方号码,通话开始时间,通话结束时间,。
  2. --创建一张表T_Callers,记录电话呼叫员的工作流水,记录呼叫员编号、对方号码、通话开始时间、通话结束时间。建表、插数据等最后都自己写SQL语句。
  3. --要求:
  4. --1)输出所有数据中通话时间最长的5条记录。
  5. --2)输出所有数据中拨打长途号码(对方号码以0开头)的总时长。
  6. --3)输出本月通话总时长最多的前三个呼叫员的编号。
  7. --4)输出本月拨打电话次数最多的前三个呼叫员的编号。
  8. --5)输出所有数据的拨号流水,并且在最后一行添加总呼叫时长。
  9. --记录呼叫员编号、对方号码、通话时长
  10. --......
  11. --汇总[市内号码总时长][长途号码总时长]
  12. --IdCallerNumberTellNumberStartDateTimeEndDateTime
  13. --1001020888888882010-7-1010:012010-7-1010:05
  14. --2001020888888882010-7-1113:412010-7-1113:52
  15. --3001898989892010-7-1114:422010-7-1114:49
  16. --4002021883689812010-7-1321:042010-7-1321:18
  17. --5002767676762010-6-2920:152010-6-2920:30
  18. --6001022888782432010-7-1513:402010-7-1513:56
  19. --7003672546862010-7-1311:062010-7-1311:19
  20. --8003862314452010-6-1919:192010-6-1919:25
  21. --9001874223682010-6-1919:252010-6-1919:36
  22. --10004400458622452010-6-1919:502010-6-1919:59
  23. --创建表
  24. createtableT_CallRecords(
  25. idintnotnull,
  26. CallerNumbervarchar(3),
  27. TellNumbervarchar(13),
  28. StartDateTImedatetime,
  29. EndDateTimedatetime,
  30. Primarykey(Id)
  31. );
  32. --插入数据
  33. insertintoT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTIme)
  34. values(1,'001','02088888888','2010-7-1010:01','2010-7-1010:05');
  35. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  36. VALUES(2,'002','02088888888','2010-7-1113:41','2010-7-1113:52');
  37. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  38. VALUES(3,'003','89898989','2010-7-1114:42','2010-7-1114:49');
  39. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  40. VALUES(4,'004','02188368981','2010-7-1321:04','2010-7-1321:18');
  41. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  42. VALUES(5,'005','76767676','2010-6-2920:15','2010-6-2920:30');
  43. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  44. VALUES(6,'006','02288878243','2010-7-1513:40','2010-7-1513:56');
  45. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  46. VALUES(7,'007','67254686','2010-7-1311:06','2010-7-1311:19');
  47. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  48. VALUES(8,'008','86231445','2010-6-1919:19','2010-6-1919:25');
  49. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  50. VALUES(9,'009','87422368','2010-6-1919:25','2010-6-1919:36');
  51. INSERTINTOT_CallRecords(Id,CallerNumber,TellNumber,StartDateTime,EndDateTime)
  52. VALUES(10,'010','40045862245','2010-6-1919:50','2010-6-1919:59');
  53. --修改呼叫员编号
  54. UPDATET_CallRecordsSETCallerNumber='001'WHEREIdIN(1,2,3,6,9);
  55. UPDATET_CallRecordsSETCallerNumber='002'WHEREIdIN(4,5);
  56. UPDATET_CallRecordsSETCallerNumber='003'WHEREIdIN(7,8);
  57. UPDATET_CallRecordsSETCallerNumber='004'WHEREId=10;
  58. --数据汇总
  59. select*fromT_CallRecords
  60. --题1):输出所有数据中通话时间最长的5条记录。
  61. --@计算通话时间;
  62. --@按通话时间降序排列;
  63. --@取前5条记录。
  64. selecttop5CallerNumber,DATEDIFF(SECOND,StartDateTime,EndDateTime)as总时长
  65. fromT_CallRecords
  66. orderbyDATEDIFF(SECOND,StartDateTime,EndDateTime)DESC
  67. --题2):输出所有数据中拨打长途号码(对方号码以0开头)的总时长
  68. --@查询拨打长途号码的记录;
  69. --@计算各拨打长途号码的通话时长;
  70. --@对各拨打长途号码的通话时长进行求和。
  71. selectSUM(DATEDIFF(SECOND,StartDateTime,EndDateTime))as总时长fromT_CallRecords
  72. whereTellNumberlike'0%'
  73. --题3):输出本月通话总时长最多的前三个呼叫员的编号。
  74. --@按呼叫员编号进行分组;
  75. --@计算各呼叫员通话总时长;
  76. --@按通话总时长进行降序排列;
  77. --@查询前3条记录中呼叫员的编号。
  78. selectdatediff(month,convert(datetime,'2010-06-01'),convert(datetime,'2010-07-22'))--测试
  79. selectCallerNumber,TellNumber,datediff(month,StartDateTime,EndDateTime)
  80. fromT_CallRecords
  81. selecttop3CallerNumberfromT_CallRecords
  82. wheredatediff(month,StartDateTime,getdate())=12--一年前的
  83. groupbyCallerNumber
  84. orderbySUM(DATEDIFF(SECOND,StartDateTime,EndDateTime))DESC
  1. --题4)输出本月拨打电话次数最多的前三个呼叫员的编号.
  2. --@按呼叫员编号进行分组;
  3. --@计算个呼叫员拨打电话的次数;
  4. --@按呼叫员拨打电话的次数进行降序排序;
  5. --@查询前3条记录中呼叫员的编号。
  6. selecttop3CallerNumber,count(*)
  7. fromT_CallRecords
  8. wheredatediff(month,StartDateTime,getdate())=12--一年前的
  9. groupbyCallerNumber
  10. orderbycount(*)DESC
  11. --题5)输出所有数据的拨号流水,并且在最后一行添加总呼叫时长:
  12. --记录呼叫员编号、对方号码、通话时长
  13. --......
  14. --汇总[市内号码总时长][长途号码总时长]
  15. --@计算每条记录中通话时长;
  16. --@查询包含不加0号码,即市内号码的记录;
  17. --@计算市内号码通话总时长;
  18. --@查询包含加0号码,即长途号码的记录;
  19. --@计算长途号码通话总时长;
  20. --@联合查询。
  21. select'汇总'as汇总,
  22. convert(varchar(20),
  23. sum((
  24. case
  25. whenTellNumbernotlike'0%'thendatediff(second,StartDateTime,EndDateTime)
  26. else0
  27. end
  28. )))as市内通话,
  29. sum((
  30. case
  31. whenTellNumberlike'0%'thendatediff(second,StartDateTime,EndDateTime)
  32. else0
  33. end
  34. ))as长途通话
  35. fromT_CallRecords
  36. unionall
  37. selectCallerNumber,TellNumber,datediff(second,StartDateTime,EndDateTime)as通话时长
  38. fromT_CallRecords
  39. --客户和订单表的练习
  40. --建立一个客户表
  41. createtableT_Customers(
  42. idintnotnull,
  43. namenvarchar(50)collatechinese_prc_ci_asnull,
  44. ageintnull
  45. );
  46. insertT_Customers(id,name,age)values(1,N'tom',10);
  47. insertT_Customers(id,name,age)values(2,N'jerry',15);
  48. insertT_Customers(id,name,age)values(3,N'john',22);
  49. insertT_Customers(id,name,age)values(4,N'lily',18);
  50. insertT_Customers(id,name,age)values(5,N'lucy',18);
  51. select*fromT_Customers
  52. --建立一个销售单表
  53. createtableT_Orders(
  54. idintnotnull,
  55. billnonvarchar(50)collatechinese_prc_ci_asnull,
  56. customeridintnull);
  57. insertT_Orders(id,billno,customerid)values(1,N'001',1)
  58. insertT_Orders(id,billno,customerid)values(2,N'002',1)
  59. insertT_Orders(id,billno,customerid)values(3,N'003',3)
  60. insertT_Orders(id,billno,customerid)values(4,N'004',2)
  61. insertT_Orders(id,billno,customerid)values(5,N'005',2)
  62. insertT_Orders(id,billno,customerid)values(6,N'006',5)
  63. insertT_Orders(id,billno,customerid)values(7,N'007',4)
  64. insertT_Orders(id,billno,customerid)values(8,N'008',5)
  65. select*fromT_Orders
  66. selecto.billno,c.name,c.age
  67. fromT_OrdersasojoinT_Customersascono.customerid=c.id
  68. --查询订单号,顾客名字,顾客年龄
  69. selecto.billno,c.name,c.age
  70. fromT_OrdersasojoinT_Customersascono.customerid=c.id
  71. wherec.age>15
  72. --显示年龄大于15岁的顾客姓名、年龄和订单号
  73. selecto.billno,c.name,c.age
  74. fromT_OrdersasojoinT_Customersascono.customerid=c.id
  75. wherec.age>(selectavg(age)fromT_Customers)
  76. --显示年龄大于平均年龄的顾客姓名、年龄和订单号
  77. --子查询练习
  78. --新建一个数据库,名为BookShop
  79. CreatedatabaseBookShop
  80. --创建4张表
  81. createtableT_Reader(FIdINTNOTNULL,FNamevarchar(50),FYearOfBirthINT,FCityvarchar(50),FProvincevarchar(50),FYearOfJoinINT);
  82. createtableT_Book(FIdintnotnull,FNamevarchar(50),FYearPublishedint,FCategoryIdint);
  83. createtableT_Category(FIdintnotnull,FNamevarchar(50));
  84. createtableT_ReaderFavorite(FCategoryIdint,FReaderIdint);
  85. --分别为4张表插入数据
  86. insertintoT_Category(FId,FName)values(1,'Story');
  87. insertintoT_Category(FId,FName)values(2,'History');
  88. insertintoT_Category(FId,FName)values(3,'Theory');
  89. insertintoT_Category(FId,FName)values(4,'Technology');
  90. insertintoT_Category(FId,FName)values(5,'Art');
  91. insertintoT_Category(FId,FName)values(6,'Philosophy');
  92. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(1,'Tom',1979,'TangShan','Hebei',2003);
  93. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(2,'Sam',1981,'LangFang','Hebei',2001);
  94. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(3,'Jerry',1966,'DongGuan','GuangDong',1995);
  95. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(4,'Lily',1972,'JiaXing','ZheJiang',2005);
  96. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(5,'Marry',1985,'BeiJing','BeiJing',1999);
  97. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(6,'Kelly',1977,'ZhuZhou','HuNan',1995);
  98. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(7,'Tim',1982,'YongZhou','HuNan',2001);
  99. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(8,'King',1979,'JiNan','ShanDong',1997);
  100. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(11,'John',1979,'QingDao','ShanDong',2003);
  101. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(9,'Lucy',1978,'LuoYang','HeNan',1996);
  102. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,FProvince,FyearOfJoin)values(10,'July',1983,'ZhuMaDian','HeNan',1999);
  103. insertintoT_Reader(FId,FName,FYearOfBirth,FCity,fProvince,FyearOfJoin)values(12,'Fige',1981,'JinCheng','ShanXi',2003);
  104. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(1,'AboutJ2EE',2005,4);
  105. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(2,'LearningHibernate',2003,4);
  106. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(3,'TowCites',1999,1);
  107. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(4,'JaneEyre',2001,1);
  108. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(5,'OliverTwist',2002,1);
  109. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(6,'HistoryofChina',1982,2);
  110. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(7,'HistoryofEngland',1860,2);
  111. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(8,'HistoryofAmerica',1700,2);
  112. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(9,'HistoryofTheVorld',2008,2);
  113. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(10,'Atom',1930,3);
  114. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(11,'RELATIVITY',1945,3);
  115. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(12,'Computer',1970,3);
  116. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(13,'Astronomy',1971,3);
  117. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(14,'HowTosinging',1771,5);
  118. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(15,'DaoDeJing',2001,6);
  119. insertintoT_Book(FId,FName,FYearPublished,FCategoryId)values(16,'ObediencetoAu',1995,6);
  120. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(1,1);
  121. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(5,2);
  122. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(2,3);
  123. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(3,4);
  124. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(5,5);
  125. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(1,6);
  126. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(1,7);
  127. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(4,8);
  128. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(6,9);
  129. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(5,10);
  130. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(2,11);
  131. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(2,12);
  132. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(1,12);
  133. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(3,1);
  134. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(1,3);
  135. insertintoT_ReaderFavorite(FCategoryId,FReaderId)values(4,4);
  136. select*fromT_Book
  137. select*fromT_Category
  138. select*fromT_Reader
  139. select*fromT_ReaderFavorite
  140. --并列查询
  141. select1asf1,2,(selectMIN(FYearPublished)fromT_Book),
  142. (selectMAX(FYearPublished)fromT_Book)asf4
  143. --查询入会日期在2001或者2003年的读者信息
  144. select*fromT_Reader
  145. whereFYearOfJoinin(2001,2003)
  146. --与between...and不同
  147. select*fromT_Reader
  148. whereFYearOfJoinbetween2001and2003
  149. --查询有书出版的年份入会的读者信息
  150. select*fromT_Reader
  151. whereFYearOfJoinin
  152. (
  153. selectFYearPublishedfromT_Book
  154. )
  155. --SQLServer2005之后的版本内置函数:ROW_NUMBER(),称为开窗函数,可以进行分页等操作。
  156. selectROW_NUMBER()over(orderbyFSalaryDESC)asRow_Num,
  157. FNumber,FName,FSalary,FAgefromT_Employee
  158. --特别注意,开窗函数row_number()只能用于select或orderby子句中,不能用于where子句中
  159. --查询第3行到第5行的数据
  160. select*from
  161. (
  162. selectROW_NUMBER()over(orderbyFSalaryDESC)asRow_Num,
  163. FNumber,FName,FSalary,FAgefromT_Employee
  164. )ase1
  165. wheree1.Row_Num>=3ande1.Row_Num<=5

四、SQL其他概念

--索引

1、什么是索引?优缺点是什么?

索引是对数据库表中一列或多列的值进行排序的一种单独的、物理的数据库结构。

优点:

1) 大大加快数据的检索速度;

2) 创建唯一性索引,保证数据库表中每一行数据的唯一性;

3) 加速表和表之间的连接;

4) 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点:

1) 索引需要占物理空间;

2) 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

--创建索引,在列上点击右键,写一个名称,选定列即可。

2、业务主键和逻辑主键

业务主键是使用有业务意义的字段做主键,比如身份证号,银行账号等;

逻辑主键是使用没有任何业务意义的字段做主键。因为很难保证业务主键不会重复(身份证号重复)、不会变化(账号升位),因此推荐使用逻辑主键。

3、SQL Server 两种常用的主键数据类型

1) int(或 bigint) + 标识列(又称自动增长字段)

用标识列实现字段自增可以避免并发等问题,不要开发人员控制自增。用标识列的字段在Insert的时候不用指定主键的值。

优点:占用空间小、无需开发人员干预、易读;

缺点:效率低,数据导入导出的时候很痛苦。

设置:"修改表"->选定主键->"列属性"->"标识规范"选择"是"

2) uniqueidentifier(又称GUID、UUID)

GUID算法是一种可以产生唯一表示的高效算法,它使用网卡MAC、地址、纳秒级时间、芯片ID码等算出来的,这样保证每次生成的GUID永远不会重复,无论是同一计算机还是不同计算机。在公元3400年前产生的GUID与任何其他产生过的GUID都不相同。

SQL Server中生成GUID的函数newid()。

优点:效率高、数据导入导出方便;

缺点:占用空间大、不易读。

业界主流倾向于使用GUID。

原文链接:http://www.cnblogs.com/fanyong/archive/2011/08/08/2131316.html

SQL语句相关概念及练习之基础篇相关推荐

  1. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》...

    一.课程笔记 1.1  软件开发周期 (1)需求分析阶段 分析客户的业务和数据处理需求. (2)概要设计阶段 设计数据库的E-R模型图,确认需求信息的正确和完整. /* E-R图:实体-关系图(Ent ...

  2. 剖析SQL Server 2005查询通知之基础篇

    剖析SQL Server 2005查询通知之基础篇 注:这是本人转载的文章. 摘要 在本系列文章中,我们将深入探讨如何把.NET 2.0和SQL Server 2005的查询通知特征联合起来,以便通知 ...

  3. SQL语句相关概念及练习

    一.SQL 基础知识 1.DDL(数据定义语言) 1)创建数据表 --创建数据表 create table Test(Id int not null, Age char(20)): --创建数据表 c ...

  4. SQL数据库开发知识总结:基础篇

    1.数据库概述 (1) 用自定义文件格式保存数据的劣势. (2) DBMS(DataBase Management System,数据库管理系统)和数据库,平时谈到"数据库"可能有 ...

  5. 数据库(SQL)的下载安装和基本操作—基础篇

    本篇基于SQL Server 2019 and SSMS v18.5 如何下载安装数据库? 下载链接:https://www.microsoft.com/zh-cn/sql-server/sql-se ...

  6. java表示语句结束的符号,java基础篇三(运算符号、表达式与语句)

    一.运算符 赋值运算符:= 一元运算符: +,正号 -,负号 !,非 ~:取补码,如下例子: Paste_Image.png Paste_Image.png ++,自增一 --,自减一 算数运算符: ...

  7. SQL Server2005的XML数据类型之基础篇 (2)

    四. XML类型方法 到此为止,上面的示例已经展示了XML数据类型仅能用作一种blob类型数据,但是这正是XML数据类型显示其自身力量的地方.XML数据类型支持使用UDT点(myXml.operati ...

  8. SQL Server - 小鸟系列之T-SQL基础篇

    创建表 Create Table dbo.UserInfo (Id int identity(1,1) primary key ,Name varchar(100) Constraint UQ_Nam ...

  9. 第 05 篇 如何使用 SQL 语句进行模糊查找?

    <SQL 从入门到精通>专栏目录 第 01 篇 和数据打交道的你,一定要学会 SQL 第 02 篇 在 SQL 的世界里一切都是关系 第 03 篇 使用 SELECT 语句初步探索数据库 ...

最新文章

  1. ECCV 2018 | CornerNet:目标检测算法新思路
  2. 【软考-软件设计师】计算机存储器的分类
  3. zookeeper+kafka配置
  4. postfix+squirrelmail - rhat 5.4
  5. 操作系统线程互斥,锁死机制的简单介绍
  6. 关于Nginx参数路径问题的问题
  7. OSChina 周日乱弹 —— 我叫张一条
  8. BurpSuite插件 -- Struts2-RCE
  9. python的基本功能_二.Python的基本数据类型及常用功能
  10. 重构《一》-- 提取方法
  11. studentdeng的博客
  12. oracle 导出01455,使用exp命令导出报EXP-00008 和ORA-01455的解决方法
  13. 【问题8】Redis它到底解决了哪些问题?
  14. 云课堂智慧职教计算机作业答案,云课堂智慧职教毛概作业答案
  15. iOS越狱,插件afc2、afc2add、apple file conduit2的区别
  16. linux 核显驱动程序,在Ubuntu系统上安装英特尔核显驱动安装器的方法
  17. Jeffrey Dean联署论文 The Case for Learned Index Structures
  18. Win10禁止更新设备驱动的几种方式
  19. 更新 mac 系统,clion 不能用
  20. 语言-汉语-官话:官话

热门文章

  1. 64位win7搭建php mysql_[转]Win7 64位操作系统下配置PHP+MySql+Apache环境
  2. 有趣的超短python代码_神级Coder绝不犯的错误:为炫耀编出超短码
  3. C++:了解SGI-STL空间配置器
  4. 2019逆市实现高速增长,伴鱼做对了什么?
  5. 从零开始做一个SLG游戏(四):UI系统之主界面搭建
  6. python驱动级模拟按键_python如何实现驱动级的模拟按键?
  7. git diff比较不同commit版本的代码文件异同
  8. 自己的小程序终于开始赚钱了
  9. 我们该如何保护自己的密码?
  10. 如何使用FFmpeg将AVI转换为MP4(有损转换和无损转换)