SELECT max(column_name) FROM table_name;
SELECT MAX(column_name) FROM table_name
--创建一个student表
create table student(
 id int identity(1,1) not null,
 name varchar(20) null,
 course varchar(20) null,
 grade numeric null
)
--student表增加一个年龄字段
alter table student add age int NULL

--student表删除年龄字段,删除的字段前面需要加column,不然会报错,而添加字段不需要加column
alter table student drop Column age

--删除student表
drop table student --删除表的数据和表的结构
truncate table student -- 只是清空表的数据,,但并不删除表得结构,student表还在只是数据为空
use pangu
  insert firms
  (firm_id, f_name, f_intro)
  values(10070001, 'SQL', '制作数据库软件的公司')
-- 聚合查询(集函数)

-- 1) count() 返回总记录数
select count(*) from student

-- 查询当前字段的总个数 (null 不计算)
select count(tid) from student

-- 2) max() 最大值
select max(age) from student

-- 3) min()最小值
select min(age) from student

-- 4) sum() 求和
select sum(age) from student

-- 5) avg() 求平均值
select avg(age) from student

-- 请帮我查询年龄最大的学生的信息

-- 普通字段不能和聚合函数放在一起查询  除非 聚合函数和 group by 的字段放一起
-- 或者聚合函数放在子查询中
--  select sname,max(age) from student  -- 错误的
select sname,age from student where age=
(select max(age) from student)


-- 查询男生和女生中年龄最大的学生
update student set age=23,sex='女' where sid=7

select sex,max(age) from student group by sex

select * from student

-- 对分组后的结果进行删选  用having 
select tid,count(*) from student group by tid  having  count(*)>2
lower(字符串表达式) | select lower('ABCDEF')返回 abcdef | 返回大写字符数据转换为小写的字符表达式。


upper(字符串表达式) | select upper('abcdef')返回 ABCDEF | 返回小写字符数据转换为大写的字符表达式。


ltrim(字符串表达式) | select ltrim('    abc')返回 abc | 返回删除了前导空格之后的字符表达式。


rtrim(字符串表达式) | select rtrim('abc    ')返回 abc | 返回删除了尾随空格之后的字符表达式。


left(字符串表达式,整数表达式) | select left('abcdefg',2) 返回 ab | 返回字符串中从左边开始指定个数的字符。


right(字符串表达式,整数表达式) | select right('abcdefg',2) 返回fg | 返回字符串中从右边开始指定个数的字符。


substring(字符串表达式,开始位置,长度) | select substring('abcdef',2,2)返回bc | 返回子字符串


len(字符串表达式) | select len('abcdefg')返回 7  select len('abcdefg     ') 返回7 | 返回指定字符串表达式的字符数,其中不包含尾随空格。


difference(字符串表达式1,字符串表达式2) | select difference('Green','Greene')返回4 |
    返回一个0到4的整数值,指示两个字符表达式的之间的相似程度。0 表示几乎不同或完全不同,4表示几乎相同或完全相同。注意相似并不代表相等


space(整数表达式) | select 'a'+space(2)+'b' 返回 a  b | 返回由指定数目的空格组成的字符串

str(float型小数[,总长度[,小数点后保留的位数]])|
    eg:
    select str(123.451)返回   123(123前面有空格)
    select str(123.451,3)返回123
    select str(123.451,7,3)返回123.451
    select str(123.451,7,1)返回123.5
    select str(123.451,5,3)返回123.5
    select str(123.651,2)返回**    
    返回由数字转换成的字符串。返回字符数不到总长度的前面补空格,超过总长度的截断小数位。如果需要截断整数位则返回**。
    注意在截断时遵循四舍五入
    总长度。它包括小数点、符号、数字以及空格。默认值为 10。
    小数点后最多保留16位。默认不保留小数点后面的数字
----统计函数---- 
 
AVG  --求平均值 
 COUNT  --统计数目
 MAX  --求最大值
 MIN  --求最小值
 SUM  --求和

 --AVG
 use pangu
 select avg(e_wage) as dept_avgWage
 from employee
 group by dept_id

 --MAX
 --求工资最高的员工姓名 
 use pangu 
 select e_name 
 from employee 
 where e_wage =C
 (select max(e_wage)
  from employee)

 --STDEV()
 --STDEV()函数返回表达式中所有数据的标准差

 --STDEVP()
 --STDEVP()函数返回总体标准差
 --VAR()
 --VAR()函数返回表达式中所有值的统计变异数
 --VARP()
 --VARP()函数返回总体变异数

 ----算术函数----
 /***三角函数***/ 
 SIN(float_expression) --返回以弧度表示的角的正弦
 COS(float_expression) --返回以弧度表示的角的余弦
 TAN(float_expression) --返回以弧度表示的角的正切
 COT(float_expression) --返回以弧度表示的角的余切
 /***反三角函数***/
 ASIN(float_expression) --返回正弦是FLOAT 值的以弧度表示的角 
 ACOS(float_expression) --返回余弦是FLOAT 值的以弧度表示的角
 ATAN(float_expression) --返回正切是FLOAT 值的以弧度表示的角
 ATAN2(float_expression1,float_expression2)
     --返回正切是float_expression1 /float_expres-sion2的以弧度表示的角
 DEGREES(numeric_expression)
             --把弧度转换为角度返回与表达式相同的数据类型可为
     --INTEGER/MONEY/REAL/FLOAT 类型
 RADIANS(numeric_expression) --把角度转换为弧度返回与表达式相同的数据类型可为
     --INTEGER/MONEY/REAL/FLOAT 类型
 EXP(float_expression) --返回表达式的指数值
 LOG(float_expression) --返回表达式的自然对数值
 LOG10(float_expression)--返回表达式的以10 为底的对数值
 SQRT(float_expression) --返回表达式的平方根
 /***取近似值函数***/
 CEILING(numeric_expression) --返回>=表达式的最小整数返回的数据类型与表达式相同可为
     --INTEGER/MONEY/REAL/FLOAT 类型
 FLOOR(numeric_expression)  --返回<=表达式的最小整数返回的数据类型与表达式相同可为 
     --INTEGER/MONEY/REAL/FLOAT 类型
 ROUND(numeric_expression)  --返回以integer_expression 为精度的四舍五入值返回的数据
     --类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
 ABS(numeric_expression)   --返回表达式的绝对值返回的数据类型与表达式相同可为
     --INTEGER/MONEY/REAL/FLOAT 类型
 SIGN(numeric_expression)   --测试参数的正负号返回0 零值1 正数或-1 负数返回的数据类型
     --与表达式相同可为INTEGER/MONEY/REAL/FLOAT 类型
 PI()    --返回值为π 即3.1415926535897936
 RAND([integer_expression])  --用任选的[integer_expression]做种子值得出0-1 间的随机浮点数

 ----字符串函数----
 ASCII()     --函数返回字符表达式最左端字符的ASCII 码值
 CHAR()  --函数用于将ASCII 码转换为字符
   --如果没有输入0 ~ 255 之间的ASCII 码值CHAR 函数会返回一个NULL 值
 LOWER()  --函数把字符串全部转换为小写
 UPPER()  --函数把字符串全部转换为大写
 STR()  --函数把数值型数据转换为字符型数据
 LTRIM()  --函数把字符串头部的空格去掉
 RTRIM()  --函数把字符串尾部的空格去掉
 LEFT(),RIGHT(),SUBSTRING() --函数返回部分字符串
 CHARINDEX(),PATINDEX() --函数返回字符串中某个指定的子串出现的开始位置
 SOUNDEX() --函数返回一个四位字符码C
   --SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0 值
 DIFFERENCE()  --函数返回由SOUNDEX 函数返回的两个字符表达式的值的差异
   --0 两个SOUNDEX 函数返回值的第一个字符不同
   --1 两个SOUNDEX 函数返回值的第一个字符相同
   --2 两个SOUNDEX 函数返回值的第一二个字符相同
   --3 两个SOUNDEX 函数返回值的第一二三个字符相同
   --4 两个SOUNDEX 函数返回值完全相同 
                     

 QUOTENAME() --函数返回被特定字符括起来的字符串
 /*select quotename(’abc’, ’{’) quotename(’abc’)
 运行结果如下
 ----------------------------------{
 {abc} [abc]*/

 REPLICATE()   --函数返回一个重复character_expression 指定次数的字符串
 /*select replicate(’abc’, 3) replicate( ’abc’, -2)
 运行结果如下
 ----------- -----------
 abcabcabc NULL*/

 REVERSE()    --函数将指定的字符串的字符排列顺序颠倒
 REPLACE()    --函数返回被替换了指定子串的字符串
 /*select replace(’abc123g’, ’123’, ’def’)
 运行结果如下
 ----------- -----------
 abcdefg*/

 SPACE()  --函数返回一个有指定长度的空白字符串
 STUFF()  --函数用另一子串替换字符串指定位置长度的子串

 ----数据类型转换函数----
 CAST() 函数语法如下
 CAST() (<expression> AS <data_ type>[ length ])
 CONVERT() 函数语法如下
 CONVERT() (<data_ type>[ length ], <expression> [, style]) 

 select cast(100+99 as char) convert(varchar(12), getdate())
 运行结果如下
 ------------------------------ ------------ 
 199  Jan 15 2000 

 ----日期函数----
 DAY()  --函数返回date_expression 中的日期值
 MONTH()  --函数返回date_expression 中的月份值
 YEAR()  --函数返回date_expression 中的年份值
 DATEADD(<datepart> ,<number> ,<date>) 
   --函数返回指定日期date 加上指定的额外日期间隔number 产生的新日期
 DATEDIFF(<datepart> ,<number> ,<date>) 
   --函数返回两个指定日期在datepart 方面的不同之处
 DATENAME(<datepart> , <date>) --函数以字符串的形式返回日期的指定部分
 DATEPART(<datepart> , <date>) --函数以整数值的形式返回日期的指定部分
 GETDATE() --函数以DATETIME 的缺省格式返回系统当前的日期和时间

 ----系统函数---- 
 APP_NAME()   --函数返回当前执行的应用程序的名称
1) DDL(Data Definition Language)数据定义语言
用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等
2) DML(Data Manipulation Language)数据操作语言
用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等
3) DQL(Data Query Language)数据查询语言
用来查询数据库中表的记录(数据)。关键字:select, where 等
4) DCL(Data Control Language)数据控制语言(了解)
用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT, REVOKE 等
select LPAD(frname,7,'xo') as '左填充',
RPAD(frname,8,'xo') as '又填充',
frname as 不填充
from ent_file where id=11449
1、from子句组装来自不同数据源的数据;
2、where子句基于指定的条件对记录行进行筛选;
3、group by子句将数据划分为多个分组;
4、使用聚集函数进行计算;
5、使用having子句筛选分组,通常会使用到聚集函数;
6、计算所有的表达式;
7、select 的字段;
8、使用order by对结果集进行排序,可以使用聚集函数。
假设一个SQL任务:
Select count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’;
该任务的inputdir  /group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04
共有194个文件,其中很多是远远小于128m的小文件,总大小9G,正常执行会用194个map任务。
Map总共消耗的计算资源: SLOTS_MILLIS_MAPS= 623,020


我通过以下方法来在map执行前合并小文件,减少map数:
set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
再执行上面的语句,用了74个map任务,map消耗的计算资源:SLOTS_MILLIS_MAPS= 333,500
对于这个简单SQL任务,执行时间上可能差不多,但节省了一半的计算资源。
大概解释一下,100000000表示100M, set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;这个参数表示执行前进行小文件合并,前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),进行合并,最终生成了74个块。
# 最简单的
max(1, 2)
max('a', 'b')
# 也可以对列表和元组使用
max([1,2])
max((1,2))
# 还可以指定comparator function
max('ah', 'bf', key=lambda x: x[1])
def comparator(x):
return x[1]
max('ah', 'bf', key=comparator)
聚合函数
#1. 常见的几个聚合函数
 #1.1 AVG / SUM :只适用于数值类型的字段(或变量)SELECT AVG(salary),SUM(salary),AVG(salary) * 107
 FROM employees;
 #如下的操作没有意义
 SELECT SUM(last_name),AVG(last_name),SUM(hire_date)
 FROM employees; #1.2 MAX / MIN :适用于数值类型、字符串类型、日期时间类型的字段(或变量)
SELECT MAX(salary),MIN(salary)
 FROM employees;SELECT MAX(last_name),MIN(last_name),MAX(hire_date),MIN(hire_date)
 FROM employees; #1.3 COUNT:
 # ① 作用:计算指定字段在查询结构中出现的个数(不包含NULL值的)SELECT COUNT(employee_id),COUNT(salary),COUNT(2 * salary),COUNT(1),COUNT(2),COUNT(*)
 FROM employees ;SELECT *
 FROM employees;#如果计算表中有多少条记录,如何实现?
 #方式1:COUNT(*)
 #方式2:COUNT(1)
 #方式3:COUNT(具体字段) : 不一定对!#② 注意:计算指定字段出现的个数时,是不计算NULL值的。
 SELECT COUNT(commission_pct)
 FROM employees;SELECT commission_pct
 FROM employees
 WHERE commission_pct IS NOT NULL;#③ 公式:AVG = SUM / COUNT
 SELECT AVG(salary),SUM(salary)/COUNT(salary),
 AVG(commission_pct),SUM(commission_pct)/COUNT(commission_pct),
 SUM(commission_pct) / 107
 FROM employees;#需求:查询公司中平均奖金率
 #错误的!
 SELECT AVG(commission_pct)
 FROM employees;#正确的:
 SELECT SUM(commission_pct) / COUNT(IFNULL(commission_pct,0)),
 AVG(IFNULL(commission_pct,0))
 FROM employees;# 如何需要统计表中的记录数,使用COUNT(*)、COUNT(1)、COUNT(具体字段) 哪个效率更高呢?
 # 如果使用的是MyISAM 存储引擎,则三者效率相同,都是O(1)
 # 如果使用的是InnoDB 存储引擎,则三者效率:COUNT(*) = COUNT(1)> COUNT(字段) #其他:方差、标准差、中位数
#2. GROUP BY 的使用
#需求:查询各个部门的平均工资,最高工资
 SELECT department_id,AVG(salary),SUM(salary)
 FROM employees
 GROUP BY department_id#需求:查询各个job_id的平均工资
 SELECT job_id,AVG(salary)
 FROM employees
 GROUP BY job_id;#需求:查询各个department_id,job_id的平均工资
 #方式1:
 SELECT department_id,job_id,AVG(salary)
 FROM employees
 GROUP BY  department_id,job_id;
 #方式2:
 SELECT job_id,department_id,AVG(salary)
 FROM employees
 GROUP BY job_id,department_id; #错误的!
 SELECT department_id,job_id,AVG(salary)
 FROM employees
 GROUP BY department_id;#结论1:SELECT中出现的非组函数的字段必须声明在GROUP BY 中。
 #      反之,GROUP BY中声明的字段可以不出现在SELECT中。#结论2:GROUP BY 声明在FROM后面、WHERE后面,ORDER BY 前面、LIMIT前面
#结论3:MySQL中GROUP BY中使用WITH ROLLUP
SELECT department_id,AVG(salary)
 FROM employees
 GROUP BY department_id WITH ROLLUP;#需求:查询各个部门的平均工资,按照平均工资升序排列
 SELECT department_id,AVG(salary) avg_sal
 FROM employees
 GROUP BY department_id
 ORDER BY avg_sal ASC;#说明:当使用ROLLUP时,不能同时使用ORDER BY子句进行结果排序,即ROLLUP和ORDER BY是互相排斥的。
 #错误的:
 SELECT department_id,AVG(salary) avg_sal
 FROM employees
 GROUP BY department_id WITH ROLLUP
 ORDER BY avg_sal ASC;#3. HAVING的使用 (作用:用来过滤数据的)
 #练习:查询各个部门中最高工资比10000高的部门信息
 #错误的写法:
 SELECT department_id,MAX(salary)
 FROM employees
 WHERE MAX(salary) > 10000
 GROUP BY department_id; #要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换WHERE。否则,报错。
 #要求2:HAVING 必须声明在 GROUP BY 的后面。#正确的写法:
 SELECT department_id,MAX(salary)
 FROM employees
 GROUP BY department_id
 HAVING MAX(salary) > 10000;#要求3:开发中,我们使用HAVING的前提是SQL中使用了GROUP BY。
 #练习:查询部门id为10,20,30,40这4个部门中最高工资比10000高的部门信息
 #方式1:推荐,执行效率高于方式2.
 SELECT department_id,MAX(salary)
 FROM employees
 WHERE department_id IN (10,20,30,40)
 GROUP BY department_id
 HAVING MAX(salary) > 10000;#方式2:
 SELECT department_id,MAX(salary)
 FROM employees
 GROUP BY department_id
 HAVING MAX(salary) > 10000 AND department_id IN (10,20,30,40);#结论:当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING中。
 #      当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE中或HAVING中都可以。但是,建议大家声明在WHERE中。/*
   WHERE 与 HAVING 的对比
 1. 从适用范围上来讲,HAVING的适用范围更广。 
 2. 如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING
 */#4. SQL底层执行原理
 #4.1 SELECT 语句的完整结构
 /*#sql92语法:
 SELECT ....,....,....(存在聚合函数)
 FROM ...,....,....
 WHERE 多表的连接条件 AND 不包含聚合函数的过滤条件
 GROUP BY ...,....
 HAVING 包含聚合函数的过滤条件
 ORDER BY ....,...(ASC / DESC )
 LIMIT ...,.... #sql99语法:
 SELECT ....,....,....(存在聚合函数)
 FROM ... (LEFT / RIGHT)JOIN ....ON 多表的连接条件 
 (LEFT / RIGHT)JOIN ... ON ....
 WHERE 不包含聚合函数的过滤条件
 GROUP BY ...,....
 HAVING 包含聚合函数的过滤条件
 ORDER BY ....,...(ASC / DESC )
 LIMIT ...,.... */
#4.2 SQL语句的执行过程:
 #FROM ...,...-> ON -> (LEFT/RIGNT  JOIN) -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> 
 # ORDER BY -> LIMIT
行的放置顺序。在每个数据页上,数据行紧接着标头按顺序放置。在页的末尾有一张行偏移表。对于页中的每一行,偏移表都包含一条对应条目。即页的数据有100行则在这个行偏移表中就对应100条偏移量。每个条目中记录对应行的第一个字节与页首的距离。如第二个条目就记录着第二个数据行的行首字母到数据页页首的位置。由于每个数据行的大小都是不同的,因此偏移量也是不均匀的。行偏移表中的条目顺序与页中行的顺序是相反的。这主要是为了更方便数据库定位数据行。
<% 
dim conn,mdbfile 
mdbfile=server.mappath("数据库名称.mdb") 
set conn=server.createobject("adodb.connection") 
conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&mdbfile 
%>
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94
SQL函数大全
--聚合函数
use pubs
go
select avg(distinct price)  --算平均数
from titles
where type='business'
go 
use pubs
go
select max(ytd_sales)  --最大数
from titles
go 

use pubs
go
select min(ytd_sales) --最小数
from titles
go 

use pubs
go
select type,sum(price),sum(advance)  --求和
from titles
group by type
order by type
go 

use pubs
go 
select count(distinct city)  --求个数
from authors
go 

use pubs
go
select stdev(royalty) --返回给定表达式中所有值的统计标准偏差
from titles
go 

use pubs
go
select stdevp(royalty) --返回表达式中所有制的填充统计标准偏差
from titles
go 

use pubs
go
select var(royalty) --返回所有值的统计方差
from titles
go 

use pubs
go
select varp(royalty) --返回所有值的填充的统计方差
from titles
go 

--数学函数 

select sin(23.45),atan(1.234),rand(),PI(),sign(-2.34) --其中rand是获得一个随机数
--配置函数
SELECT @@VERSION --获取当前数据库版本
SELECT @@LANGUAGE --当前语言
--时间函数
select getdate() as 'wawa_getdate' --当前时间
select getutcdate() as 'wawa_getutcdate' --获取utc时间
select day(getdate()) as 'wawa_day' --取出天
select month(getdate()) as 'wawa_month' --取出月
select year(getdate()) as 'wawa_year' --取出年
select dateadd(d,3,getdate()) as wawa_dateadd --加三天,注意'd'表示天,'m'表示月,'yy'表示年,下面一样
select datediff(d,'2004-07-01','2004-07-15') as wawa_datediff --计算两个时间的差
select datename(d,'2004-07-15') as wawa_datename --取出时间的某一部分
select datepart(d,getdate()) as wawa_datepart  --取出时间的某一部分,和上面的那个差不多
--字符串函数
select ascii(123) as '123',ascii('123') as '"123"',ascii('abc') as '"abc"' --转换成ascii码
select char(123),char(321),char(-123) --根据ascii转换成字符
select lower('ABC'),lower('Abc'),upper('Abc'),upper('abc') --转换大小写
select str(123.45,6,1), str(123.45,2,2) --把数值转换成字符串
select ltrim('    "左边没有空格"')  --去空格
select rtrim('"右边没有空格"     ') --去空格
select ltrim(rtrim('   "左右都没有空格"    ')) --去空格
select left('sql server',3),right('sql server',6) --取左或者取右 

use pubs
select au_lname,substring(au_fname,1,1) --取子串
from authors
order by au_lname 

select charindex('123','abc123def',2) --返回字符串中指定表达式的起始位置
select patindex('123','abc123def'),patindex('%123%','abc123def') --返回表达式中某模式第一次出现的起始位置
select quotename('abc','{'),quotename('abc') --返回由指定字符扩住的字符串
select reverse('abc'),reverse('上海') --颠倒字符串顺序
select replace('abcdefghicde','cde','xxxx') --返回呗替换了指定子串的字符串
select space(5),space(-2) 

--系统函数
select host_name() as 'host_name',host_id() as 'host_id',user_name() as 'user_name',user_id() as 'user_id',db_name() as 'db_name'
--变量的定义使用
--声明局部变量
declare @mycounter int
declare @last_name varchar(30),@fname varchar(20),@state varchar(2) --一下声明多个变量
--给变量赋值
use northwind
go
declare @firstnamevariable varchar(20),
 @regionvariable varchar(30)
set @firstnamevariable='anne' --可以用set,也可以用select给变量赋值,微软推荐用set,但select在选择一个值直接赋值时很有用
set @regionvariable ='wa' 

select lastname,firstname,title  --用声明并赋值过的变量构建一个Select语句并查询
from employees
where firstname= @firstnamevariable or reginotallow=@regionvariable
go
--全局变量
select @@version  --返回数据库版本
select @@error  --返回最后的一次脚本错误
select @@identity  --返回最后的一个自动增长列的id 

--while,break,continue的使用
--首先计算所有数的平均价格,如果低于30的话进入循环让所有的price翻倍,
--里面又有个if来判断如果最大的单价还大于50的话,退出循环,否则继续循环,知道最大单价大于50就break出循环,呵呵,
--我分析的应该对吧.
use pubs
go
while (select avg(price) from titles) <$30 
begin
 update titles
  set price=price*2
  select max(price) from titles
  if(select max(price) from titles) >$50
  break
  else
  continue
end
print 'too much for the marker to bear' 

--事务编程经典例子
--begin transaction是开始事务,commit transaction是提交事务,rollback transaction是回滚事务
--这个例子是先插入一条记录,如果出现错误的话就回滚事务,也就是取消,并直接return(返回),如果没错的话就commit 提交这个事务了哦
--上面的那个return返回可以返回一个整数值,如果这个值是0的话就是执行的时候没出错,如果出错了就是一个负数,
--这个return也可以用在存储过程中,可用用 exec @return_status= pro_name来获取这个值
use pubs
go
begin tran mytran
 insert into stores(stor_id,stor_name)
  values('333','my books')
 go
 insert into discounts(discounttype,stor_id,discount)
  values('清仓甩卖','9999',50.00)
 if @@error<>0
  begin
   rollback tran mytran
   print '插入打折记录出错'
   return
  end
commit tran mytran 

--事务处理的保存点示例
--做了事务保存点后可以rollback(回滚)到指定的保存点,不至于所有的操作都不能用
use pubs
go
select * from stores
begin transaction testsavetran
 insert into stores(stor_id,stor_name)
  values('1234','W.Z.D Book')
 save transaction before_insert_data2
 go
 insert into stores(stor_id,stor_name)
  values('5678','foreat Books')
 go
rollback transaction before_insert_data2
select * from stores 

--存储存储过程
use pubs
if exists(select name from sysobjects where name= 'proc_calculate_taxes' and type='P')
 drop procedure proc_calculate_taxes
go
create procedure proc_calculate_taxes (@p1 smallint=42,@p2 char(1),@p3 varchar(8)='char')
as
select *
from titles
--执行过程
EXECUTE PROC_CALCULATE_TAXES @P2='A'
 COUNT()函数:用来统计记录的条数;

SUM()函数:是求和函数;

AVG()函数:是求平均值的函数 ;

MAX()函数是求最大值的函数

MIN()函数是求最小值的函数
               select count(all mgr) from emp;--13                select count(*) from emp;--14                select count(distinct mgr) from emp;--6
  • 1
  • 2
  • 3
  • 4
  • 5