SQL server2005基本sql语句 常用的内置函数、聚合函数的使用详解

一、基本概念

                          实体完整性约束
  约束种类                                      功能描述
  PRIMARY KEY(主键)约束                        
唯一识别每一条记录的标志,可以有多列共同组成
  IDENTITY(自增)约束                           
列值自增,一般使用此属性设置的列作为主键
  UNIQUE(唯一)约束                             
可以使用UNIQUE约束确保在非主键列中不存在重复值,但列值可以是NULL(空)
  
  
                     域完整性约束
  CHECK(检查)约束                                用于限制列中值得范围
  FOREIGN KEY(外键)                              一个表中的FORENIGN KEY
指向另一个表中的PRIMARY KEY
  DEFAULT(默认值)约束                            用于向列中插入默认值
  NOT NULL(非空)约束                            
用于强制列不接受NULL(空)值
  
  
  
注意:
1、PRIMARY
KEY用于将表中的某类设置为主键,一张表中只有一个主键,主键可以是一列或由多列组成。
2、NOT NULL是对列值进行限制,即在表中添加数据时不允许有NULL值。
3、CHECK约束的语法规则:CHECK(表达式)
外键的使用:字段名 数据类型 [FOREIGN KEY] REFERENCES 表名(字段名)
  
向数据库中添加值:
语法:INSERT [INTO] table_name [(COLUMN1,COLUMN2,…..)] VALUES
(VALUE1,VALUE2,…..)
注意:
1、VALUES需要与COLUMN对应
2、添加数据时,如果字段类型为varchar或datetime,否则必须使用单引号(”)引起来。
3、虽然没有显示地添加IDENTIRY约束字段,但是数据库会自动按照IDENTITY规则添加数据

  1.数据库:

  数据库(DataBase)就是一个存储数据的仓库,为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。数据库是数据管理软件。数据存储分为三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。

一次添加多行数据
语法:
INSERT [INTO] tabale_name([COLUMN1,COLUMN2,…..])
SELECT VALUE UNION
SELECT VALUE

  2.数据库范式:

  数据库范式即数据库应该遵循的规则。目前关系数据库最常用的四种范式分别是:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCN范式(BCNF)。

  第一范式:无重复的域。即数据库表的每一列都是不可分割的原子数据项,而不是集合、数组、记录等非原子数据项。

  第二范式:数据库表中的所有列都必须依赖于主键,这意味着一个表只描述一件事情。

  第三范式:表中的每一列只与主键直接相关而不是间接相关。

  BCN范式:Boyce-Codd,不允许出现有主键的一部分被主键另一部分或者其他部分决定。即一个表中只能有一个主键。

  举例(摘自其他博客)说明BCN:

  假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID,
数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

    (仓库ID, 存储物品ID) →(管理员ID, 数量)

    (管理员ID, 存储物品ID) → (仓库ID, 数量)

  所以,(仓库ID, 存储物品ID)和(管理员ID,
存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

    (仓库ID) → (管理员ID)

    (管理员ID) → (仓库ID)

  即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。

删除表中的数据
语法:DELECT FROM table_name[WHERE <表达式>]
注意:
1、使用DELETE语句删除数据时,是以整条记录为单位的,不能只删除某个字段
删除整张表数据
语法:TRUNCATE TABLE table_name
                                  
           两种删除语句的优缺点
   语句                     优点                                       
缺点
   DELETE                   选择性地删除,数据可恢复                   
当删除整张表的数据时效率低
   TRUNCATE                 只能删除整张表的数据,但是效率高于         
不能选择性地删除,数据可恢复
                            DELETE语句

  3.数据库系统和数据库管理系统:

  数据库系统由数据库、数据库管理系统、应用开发工具构成。

  数据库管理系统(DataBase Management System,
DBMS)是用来定义、管理和维护数据的软件。它是数据库系统的重要组成部分。数据库管理系统通过SQL语言来管理数据库中的数据。

修改表中的数据
语法:UPDATE table_name SET COLUMN1={},COLUMN2={},….
WHERE<表达式>

  4.SQL语言:

  SQL(Structured Query Language)语言的全称是结构化查询语言。它包括:

    - 数据库定义语言(Data Definition Language, DDL)

    - 数据操作语言(Data Manipulation Language, DML)

    - 数据控制语言(Data Control Language, DCL)

注意:分离数据库是将数据库文件从SQL
Server中分离出来,而删除数据库是将数据库文件删除。

  5.MySQL数据库版本和优势:

查询语句语法结构
语法:SELECT <COLUMN1,COLUMN2,…..> FROM <table_name>
[表达式] [ORDER BY <COLUMN1,COLUMN2,…..> [ASC或DESC]]
ORDER BY
子句用于对查询结果进行排序。ASC表示升序,DESC表示降序排列,默认的排序是ASC.
注意:将查询得到的结果称为结果集(RecordSet).SQL
Server对大小写不敏感,包括关键字在内。例如,SELECT、select和Select是等效的。

  常见数据库

  商业数据库:甲骨文的Oracle、IBM的DB2、微软的Access和SQL
Server。开源数据库:PostgreSQL、MySQL。

使用别名
1、语法:SELECT 字段名1 别名,字段名2 别名 FROM 表名
2、语法:SELECT 别名=字段名1,别名=字段名2 FROM
3、语法:SELECT 字段名1 AS 别名,字段名2 AS 别名 FROM 表名
注意:使用“=”更改查询结果列名时比较特殊,在SELECT语句中语法必须是“别名=字段名”;

  版本分类

  根据操作系统:Windows版,UNIX版,Linux版,MacOS版;根据开发情况:Alpha、Beta、Gamma与Available(GA)。

  alpha
暗示这是一个以展示新特性为目的的版本,存在比较多的不稳定因素,还会向代码中添加新新特性

  beta
以后的beta版、发布版或产品发布中,所有API、外部可视结构和SQL命令列均不再更改,不再向代码中添加影响代码稳定性的新特性。Gamma比Beta版更高级。

  GA如果没有后缀,则暗示这是一个大多数情况下可用版本或者是产品版本。.
GA releases则是稳定版。

  优势:MySQL开放源码、跨平台性、价格优势、功能强大且使用方便。

单列排序:SELECT * FROM table_name ORDER BY
多列排序;SELECT * FROM table_name ORDER BY COLUMN1 DESC,COLUMN2
DESC….

  Linux安装MySQL

  

查询限定行TOP N
语法:SELECT TOP N <COLUMN1,COLUMN2,…..> FROM
<table_name> [WHERE <表达式>] [ORDER BY
<COLUMN1,COLUMN2,…..> [ASC或DESC]]
查询百分比
语法:SELECT TOP N PERCENT <COLUMN1,COLUMN2,…..> FROM
<table_name> [WHERE <表达式>] [ORDER BY
<COLUMN1,COLUMN2,…..> [ASC或DESC]]

二、MySQL数据类型(摘自菜鸟教程:

  MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

条件查询注意:
1、在一个WHERE子句中,可以同时使用多个AND运算符链接多个查询条件。
2、在“(表达式1)OR(表达式2)”中,如果表达式1为TRUE,将不再执行表达式2。

  1.整数类型的存储和范围

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE 8 字节 (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

 

  2.日期和时间类型

类型 大小 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/’838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 4

1970-01-01 00:00:00/2038

结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07

YYYYMMDD HHMMSS 混合日期和时间值,时间戳

SQL Server内置函数(内置函数可作为where条件,聚合函数不能做为where条件)

  3.字符串类型

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYTEXT 0-255字节 短文本字符串
TEXT 0-65 535字节 长文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据
TINYBLOB  0-255字节  不超过 255 个字符的二进制字符串
BLOB 0-65 535字节 二进制形式的长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据

                                      字符串函数
  函数名                      
示例                                          函数功能
  CharIndex                 
CharIndex(‘ab’,’cdab’)结果返回3                
返回‘ab’在‘cdab’中的位置,将返回第一个字母的位置
  Len                       
Len(‘adc’)结果返回3                             返回字符串的长度
   Upper                     
Upper(‘abc’)结果ABC                            
将字符串中的小写字母转换为大写
  Ltrim                      Ltrim(‘ 
adc’)结果返回adc                       清楚左边空格
  Rtrim                      Rtrim(‘abc 
‘)结果返回abc                       清除右边空格
  Replace                   
Replace(‘abb’,’b’,’z’)结果返回azz               替换指定的字符
  Stuff                     
Stuff(‘abcd’,1,2,’mm’)结果返回mmcd              替换指定范围的字符
  substring                 
substring(‘abc’,’2′,’2′)结果返回bc              从指定位置截取
  
实例:测试字符串长度SELECT Len(字段名) FROM table_name
将内置函数作为条件使用:SELECT * FROM table_name WHERE
 Len(字段名)>VALUE

三、MySQL表操作

                                    日期函数
        函数名                 
示例                                                  函数功能
        GetDate                
GetDate结果返回“当前日期”                             返回当前日期
        DateAdd                
DateAdd(mm,2,’2009-10-08′)结果返回‘2009-12-08’       
向日期指定部分添加数字,其中,yy表示年、mm表示月、dd表示日
  DateDiff               
DateDiff(dd,’2009-09-09′,’2010-09-09′)结果返回‘365’  
返回两个日期之间的间隔,其中,yy表示年、mm表示月、dd表示日
  DateName               
DateName(DW,’2009-09-09′)结果返回“星期三”            
以字符串的形式返回某个日期指定的部分
  DatePart               
DatePart(DW,’2009-09-09′)结果返回“4”                 
以整数形式返回某个日期指定的部分
  
实例:获取系统当前日期函数为GetDate(),表达式可以写为“COLUMN1<GetDate()”,SQL语句如下:
SELECT * FROM table_name WHERE COLUMN1<GetDate()

  1.插入数据 INSERT INTO

-- 插入一条新的数据
/* INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) VALUES('10006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL); */
-- 按表列字段的顺序插入数据时,列字段可省略
INSERT INTO customers VALUES('10006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', NULL, NULL);
-- 将一张表插入到原来的表
/* INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)  SELECT cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email FROM cust_new WHERE cust_id NOT IN (SELECT cust_id FROM customers); */
-- 复制表
CREATE TABLE custcopy AS SELECT * FROM customers;

  注意:

  - 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY。

  - 可以联结多个表执行插入数据操作。

  - 不管从多少个表中检索数据,数据都只能插入到单个表中。

判断选课时间是否是星期三的函数为DateName(DW,COLUMN),表达式可以写成“DateName(DW,COLUMN)=‘星期三’”,SQL语句如下:
SELECT * FROM table_name DateName(DW,COLUMN)=‘星期三’

  2.更新和删除数据 UPDARE DEL

  UPDATE可以:更新表中特定行,更新表中所有行。在没有where子句时,UPDATE会更新所有记录。

-- UPDATE总以要更新的表的名字开始,以SET指明一个或多个要更新的字段,以WHERE指定要更新的记录
UPDATE customers SET cust_email = 'kim@thetoystore.com' WHERE cust_id = '10005';
UPDATE customers SET cust_contact = 'Sam Roberts', cust_email = 'sam@toyloand.com' WHERE cust_id = '10006';
-- 设置NULL来删除某个列的值
UPDATE customers SET cust_email = NULL WHERE cust_id = '10005';

-- DELETE是删除列
DELETE FROM customers WHERE cust_id = '10006';

  DELETE用于按行删除记录,它本身不会修改表结构。

  注:在对UPDATE或DELETE语句使用WHERE子句前,应该先用SELECT进行测试,以保证它过滤的是确实要删除的记录。

                                    数学函数
  函数名                 
示例                                                   函数功能
   Abs                    
Abs(-1)结果返回“1”                                     求绝对值
  Ceiling                
Ceiling(24.1)结果返回“25”                             
大于24.1的最小整数     
  Floor                  
Floor(24.1)结果返回“24”                               
小于24.1的最大整数
  Power                  
Power(2,3)结果返回“8”                                  计算2的3次方
  Round                  
Round(748.32,1)结果返回“748.30”                       
返回一个数值,舍入到指定的长度或精度
  Sign                   
Sign(100)结果返回“1”                                  
正整数返回1,负整数返回-1
  Sqrt                   
Sqrt(4)结果返回“2”                                     开平方

   3.创建表及约束条件

                                  系统函数
  函数名                     
示例                                                 函数功能
        Convert                
Convert(varchar(10),123)结果返回“123”                   装换数据类型
  DataLength             
DataLength(’12中国’)结果返回6                          
返回任何数据类型的字节数。“中国”包含4个字节,“12”包含两个字节,所以返回6.
 

  1.创建表

-- 创建表语法:CREATE TABLE [IF NOT EXISTS] table_name(column_name data_type,...);
CREATE TABLE users(id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20), salary FLOAT(8,2) UNSIGNED);
-- 查看表结构
DESC users;
SHOW COLUMNS FROM users;
SHOW CREATE TABLE users;

开发过程中对于日期的操作:例如获得昨天、前天的数据。
SQL语句如下: select * from table_name where pudoctime>=SUBSTRING(
Convert(varchar(20),DateAdd(DD,-1,GETDATE()),120),1,10)

  2.约束条件

  约束是为了保证数据的完整性和一致性,约束类型包括:

 键名  类型
PRIMARY KEY 主键约束
UNIQUE KEY 唯一约束
NOT NULL 非空约束
UNSIGNED 无符号约束
DEFAULT 默认约束
FOREIGN KEY 外键约束

 

 
模糊查询
在SQL
Server中,通过使用通配符来实现LIKE运算,通配符“%”,“_”,“[]”。
注意:只有char、varchar和text类型的数据才能使用LIKE运算符和通配符。

  4.修改表结构

1、“%”通配符:表示任意字符的匹配,且不计字符的多少。
(1)开头、结尾匹配
开头匹配(以字母“c”开头的所有数据):SELECT * FROM table_name WHERE
COLUMN LIKE ‘c%’
结尾匹配(以字母“c”结尾的所有数据):SELECT * FROM table_name WHERE
COLUMN LIKE ‘%c’

  1.添加和删除列

-- 修改数据表
-- 添加列语法: ALTER TABLE tbl_name ADD [COLUMN] col_name column_definition [FIRST|AFTER col_name]
ALTER TABLE users ADD age TINYINT UNSIGNED NOT NULL DEFAULT 10 AFTER name;
-- 删除列语法: ALTER TABLE tbl_name DROP [COLUMN] col_name
ALTER TABLE users DROP age;
-- 混合操作
ALTER TABLE users ADD gender VARCHAR(10) NOT NULL DEFAULT "male", ADD address VARCHAR(32) NOT NULL,DROP salary;

(2)中间匹配
以“c”开头,以“b”结尾的所有数据:SELECT * FROM table_name WHERE COLUMN
LIKE ‘c%b’

  2.修改列定义和列名

-- 修改列名,要重新声明列的数据类型和约束条件
ALTER TABLE users CHANGE name username varchar(10) NOT NULL;
-- 修改列定义
ALTER TABLE users MODIFY id SMALLINT NOT NULL FIRST;
-- 修改表名
ALTER TABLE users RENAME TO tb;

 

(3)两端匹配
查询出包含字母“c”的所有数据:SELECT * FROM table_name WHERE COLUMN
LIKE ‘%c%’

四、MySQL查询操作

注意:“%”匹配一个或多个字符。

  1、查询数据

2、”_“通配符:”_“统配符的功能与”%“基本相同,只是它仅表示任意一个字符(区别)的匹配。若需要表示两个字符的匹配,则使用两个”_“通配符,即写成”_
_“。
(1)匹配一个字符
示例:从表中查询名称(name)为”t_fu“(“_”代表任意一个字符)的所有数据,SQL语句如下:
SELECT * FROM table_name where name LIKE ‘t_fu’    
匹配字符串有(tafu,tbfu,tcfu…..)

  1.查询关键字 SELECT FROM

-- 查询单列
SELECT prod_name FROM products;
-- 查询多列
SELECT prod_id, prod_name, prod_price FROM products;
-- 查询所有列
SELECT * FROM products;

(2)匹配多个字符
查询名称(name)为3个字符的数据SQL语句如下:
SELECT * FROM table_name where name LIKE ‘_ _ _’
注意:”_”只能匹配一个字符。

  2.排序关键字 ORDER BY

  查询的数据如果不排序,一般是以它在底层表中出现的顺序显示。如果不明确规定排序顺序,则不应该假定检索出的数据的顺序有意义。

-- 单排
SELECT prod_name FROM products ORDER BY prod_name;
-- 多排
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price, prod_name;
-- 按列位置排
SELECT prod_id, prod_price, prod_name FROM products ORDER BY 2, 3; 注,它只能根据已选择字段的相对位置排序
-- 指定排序方向
SELECT prod_id, prod_price, prod_name FROM products ORDER BY prod_price DESC, prod_name;

(3)”_”与”%”的综合应用
在模糊查询过程中,经常需要”_”和”%”一起使用才能完成查询功能。
示例:查询名称(name)第二个字母为”c”的所有数据,SQL语句如下:
SELECT * FROM table_name where name LIKE ‘_c%’

  3.过滤关键字 where + 操作符

  where子句操作符表:

 操作符  说明
 =  等于
 <>  不等于
 !=  不等于
 <  小于
 <=  小于等于
 !<  不小于
 >  大于
 >=  大于等于
 !>  不大于
BETWEEN 在指定的两个值之间
IS NULL 为null值
AND、OR、NOT、IN 组合查询
LIKE 通配符过滤

  用例:

-- 匹配查询
SELECT prod_price, prod_name FROM products where prod_price = 3.49;
-- 不匹配查询
SELECT prod_price, prod_name FROM products where prod_price <> 10;
-- 范围查询
SELECT prod_price, prod_name FROM products where prod_price BETWEEN 5 AND 10; 
-- 空值查询
SELECT prod_name FROM products where prod_price IS NULL;
-- 组合查询AND
SELECT prod_id, prod_name, prod_price FROM products WHERE vend_id='DLL01' AND prod_price <= 4;
-- 组合查询OR
SELECT prod_name, prod_price FROM products WHERE vend_id='DLL01' OR vend_id = 'BRS01';
-- 组合查询AND和OR
SELECT prod_name, prod_price FROM products WHERE vend_id='DLL01' OR vend_id = 'BRS01' AND prod_price <= 4;
-- 组合查询IN
SELECT prod_name, prod_price FROM products WHERE vend_id IN ('DLL01', 'BRS01') ORDER BY prod_name;
-- 组合查询NOT
SELECT prod_name, prod_price FROM products WHERE vend_id NOT vend_id='DLL01';
-- 通配符过滤
SELECT prod_name FROM products WHERE prod_name LIKE '%TNT%';

3、”[]”通配符:”[]”通配符用于指定一系列的字符,只要满足这些字符其中之一且出现在”[]”通配符的位置的字符串就满足查询条件
(1)、各种通配符可以组合使用,必须自习分析它所表示的匹配条件
       
                                  匹配条件列表
   查询条件                                                     
匹配条件
   LIKE ‘5[%]’                                                    
5%
   LIKE ‘[_]n’                                                    
_n
   LIKE
‘[a-f]’                        a,b,c,d,e,f
   LIKE ‘[[]’                                                      
[
   LIKE ‘[]]’                                                      
]
   LIKE ‘abc[def]’                                            
abcd,abce,abcf
   LIKE ‘abc[_]d%’                                            
adbc_d…(省略号表示可以有任意字符)
   LIKE ‘a[^a]d%’                                             
不能为aad…([^]表示不能取[]内的字符)
   
示例:
查询名称(name)中包含”_”的所有数据:SELECT * FROM table_name WHERE name
LIKE ‘%[_]%’
查询名称(name)中最后一个字符为”a”,”b”,”f”,”g”的所有数据:SELECT * FROM
table_name WHERE name LIKE ‘%[a,b,f,g]’
查询名称(name)中最后一个字符不为”a”,”b”,”f”,”g”的所有数据:SELECT *
FROM table_name WHERE name LIKE ‘%[^a,b,f,g]’

   2、数据处理函数

IN运算符
若只需要满足多个条件中的一个查询条件,则可以使用IN运算符。IN运算符允许根据一行记录中是否有一列包括在一系列值之中而选择改行。
所有的条件罗列在IN运算符之后,并以园括号括起来,各个条件之间使用逗号分开。
示例:
查询ID为1、3或4的数据:SELECT * FROM table_name WHERE ID IN (1,3,4)
注意:
在大多数情况下,OR运算符与IN运算符可以实现相同的功能。
示例:SELECT * FROM talbe_name WHERE ID=1 OR ID=3 OR ID=4

  1.文本处理函数

 函数 说明
 LEFT 返回字符串左边的字符
 LENGTH 返回字符串的长度
 LOWER  返回字符串的小写
 LTRIM 去掉字符串左边的空格
 RIGHT 返回字符串右边的字符
 RTRIM 去掉字符串右边的空格
UPPER 返回字符串的大写

   - 用例: 

SELECT vend_name, UPPER(vend_name) AS vend_name_upcase FROM vendors ORDER BY vend_name;

二者的结果完全一致,都是返回多条数据记录。但是,与OR运算符相比,IN运算符具有以下两个优点:
(1)当选择条件很多时,采用IN运算符将十分简捷,只需要在括号中用逗号间隔后一次罗列即可,运行效率高于OR运算符。
(2)IN运算符后面所列的条件可以是另一条SELECT语句,即子查询。

  2.日期和时间处理函数

  注:日期和时间函数根据

 函数  说明
 NOW()、SYSDATE()、CURRENT_TIMESTAMP、LOCALTIME、LOCALTIMESTAMP 获取当前日期和时间
 CURDATE(), CURRENT_DATE 获取当前日期
 CURTIME(), CURRENT_TIME 获取当前时间
 DATE、YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MICROSECOND 获取指定日期和时间的日期、年、季度、月、周、日、小时、分钟、秒、毫秒数
 WEEKOFYEAR、DAYOFYEAR、DAYOFMONTH、DAYOFWEEK、LAST_DAY 获取指定日期和时间的年周索引、年天索引、月天索引、周天索引,最后一天的日期
MONTHNAME、 DAYNAME 获取指定日期和时间的英文月名、英文天名
DATE_ADD、DATE_SUB 指定日期按指定参数进行加减运算
PERIOD_ADD、PERIOD_DIFF 指定日期加、减多少个月
TIMEDIFF 指定日期和时间相差多少个时间
TIMESTAMPDIFF 指定日期/时间或日期时间的差值
TO_DAYS、FROM_DAYS 日期和月数的相互转换函数
TIME_TO_SEC、SEC_TO_TIME 时间和秒数的相互转换函数
STR_TO_DATE、DATE_FORMAT 字符串/日期时间格式转换成新的格式
TIME_FORMAT 时间格式转换你成新的格式
MAKEDATE、MAKETIME 拼凑日期/时间
UNIX_TIMESTAMP、FROM_UNIXTIME 日期时间和unix时间戳的相互转化

   用例:

-- 获取当前日期和时间,日期指的是年月日,时间指的是时分秒
SELECT NOW(), SYSDATE(), CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP;
-- 分别获取当前日期和时间
SELECT CURDATE(), CURRENT_DATE, CURTIME(), CURRENT_TIME;
-- 分别获取日期时间、年、季度、月、周、日、时、分、秒
SELECT DATE(SYSDATE()), YEAR(SYSDATE()), QUARTER(SYSDATE()), MONTH(SYSDATE()), WEEK(SYSDATE()), DAY(SYSDATE()), HOUR(SYSDATE()), MINUTE(SYSDATE()), SECOND(SYSDATE()), MICROSECOND(SYSDATE());
-- 获取指定索引
SELECT WEEKOFYEAR(SYSDATE()), DAYOFYEAR(SYSDATE()), DAYOFMONTH(SYSDATE()), DAYOFWEEK(SYSDATE()), LAST_DAY(SYSDATE());
-- 获取月和周的英文名称
SELECT MONTHNAME(SYSDATE()), DAYNAME(SYSDATE());

-- DATE加,第一个参数是指定的日期和时间,第二个参数是间隔和单位
SELECT DATE_ADD(now(), INTERVAL 1 YEAR), DATE_ADD(now(), INTERVAL 2 MONTH), DATE_ADD(now(), INTERVAL 1000 SECOND);
-- DATE减,与DATE加参数相同
SELECT DATE_SUB(now(), INTERVAL 1 YEAR), DATE_SUB(now(), INTERVAL 2 MONTH), DATE_SUB(now(), INTERVAL 1000 SECOND);
-- 日期的加减运算
SELECT PERIOD_ADD(201808, 2), PERIOD_ADD(1808, 2),PERIOD_ADD(DATE_FORMAT(SYSDATE(), '%Y%m'), 2), PERIOD_DIFF(201808, 201004), PERIOD_DIFF(1808, 1004); 
-- 时间差计算
SELECT TIMEDIFF('2018-08-06', '2018-08-5');-- 不支持日期
SELECT TIMEDIFF('19:00:00', '17:00:00'), TIMEDIFF('2018-08-6 9:30:30', '2018-08-5 17:00:00');
-- 更便捷的日期/时间差值计算,第一个参数是要计算的字段,其值为第三个日期时间减去第二个日期时间
SELECT TIMESTAMPDIFF(DAY, '2018-08-5 17:00:00', '2018-08-8 9:30:30'), TIMESTAMPDIFF(DAY, '2018-08-5', '2018-08-8');
SELECT TIMESTAMPDIFF(SECOND, '17:00:00', '19:30:30');-- 不支持单独时间计算
-- 日期和天数的相互转换
SELECT TO_DAYS(SYSDATE()), TO_DAYS('2018-8-8'), FROM_DAYS(737279);
-- 时间和秒数的相互转换
SELECT TIME_TO_SEC(SYSDATE()), TIME_TO_SEC('12:00:00'), SEC_TO_TIME(43200);
-- 字符串格式化;字符串格式化成日期只能要按照字符串的写法改写成标准日期时间字符串
SELECT STR_TO_DATE('2018.08.6 9:30:30', '%Y.%m.%d %H:%i:%s');
-- 日期时间字符串可以随便更改或获取字段
SELECT DATE_FORMAT('2018-08-06 09:30:30', '%Y%m');-- 获取年月的组合字符串
SELECT DATE_FORMAT('2018-08-06 09:30:30', '%H%i%s');-- 获取时分秒的组合字符串
SELECT DATE_FORMAT(SYSDATE(), '%Y年%m月%d日 %H时哈哈%i分嘿嘿%d秒呵呵');-- 重新格式化
-- 时间格式化只能格式化时间
SELECT TIME_FORMAT('2018-08-06 09:30:30', '%Y年%m月%d日 %H时%i分%d秒');
-- 只对'09:30:30'进行格式化,日期全部为00
SELECT TIME_FORMAT('09:30:30', '%H时%i分%d秒');
-- MAKEDATE根据数字组合成日期(以天数换算),MAKETIME根据数字组合成时间
SELECT MAKEDATE(2018, 9);-- 结果是'2018-01-09'而不是'2018-09-01'
SELECT MAKEDATE(2018, 220);-- 结果是'2018-08-08'
SELECT MAKETIME(19,30,30);-- 与日期相反,支持三个参数拼接而不支持两个参数换算
-- 日期时间和unix时间的相互转换
SELECT UNIX_TIMESTAMP(), FROM_UNIXTIME(UNIX_TIMESTAMP());

BETWEEN运算符
在WHERE子句中,可以采用BETWEEN运算符在两个值之间进行比较筛选。
1、用于数字类型数据比较
查询年龄(age)在6~10之前的数据:SELECT * FROM table_name WHERE age
BETWEEN 6 AND 10
2、用于时间日期比较
查询日期(bridate)在”1952-01-01″到”1954-01-01″之间的数据:SELECT * FROM
table_name WHERE bridate BETWEEN ‘1952-01-01’ AND ‘1954-01-01’
注意:BETWEEN运算符筛选包含头和尾。例如数字类型比较,数据会包含6和10

  3.数值处理函数

函数  说明
ABS() 返回数字表达式的绝对值。
ACOS() 返回数字表达式的反余弦值。如果值是不在范围-1到1,则返回NULL。
ASIN() 返回数字表达式的反正弦。返回NULL,如果值不在范围-1到1
ATAN() 返回数字表达式的反正切。
ATAN2() 返回传递给它的两个变量的反正切。
BIT_AND() 返回按位AND运算表达中的所有位。
BIT_COUNT() 返回传递给它的二进制值的字符串表示。
BIT_OR() 返回传递表达的所有位的位或。
CEIL() 返回最小的整数值但不能比传递的数字表达式小
CEILING() 返回最小的整数值但不能比传递的数字表达式小
CONV() 表达式从一个基数到另一个基数转换的数字。
COS() 返回传递数字表达式的余弦值。数字表达式应该用弧度表示。
COT() 返回传递数字表达式的余切。
DEGREES() 返回数字表达式从弧度转换为度。
EXP() 返回数值表达式的自然对数(E)为基数的幂。
FLOOR() 返回最大整数值但不能大于通过表达式数值。
FORMAT() 返回数字表达式舍入到小数位数。
GREATEST() 返回输入表达式的最大值。
INTERVAL() 需要多个表达式exp1, exp2和exp3等..如果为exp1小于exp2返回0,如果为exp1小于exp3返回1等。
LEAST() 给两个或两个以上时,返回所有输入的最小值。
LOG() 返回通过数字表达式的自然对数。
LOG10() 返回传递表达的基数为10对数的数值。
MOD() 返回表达式由另一个表达式除以剩余部分。
OCT() 返回通过数字表达式的八进制值的字符串表示。如果传递值为NULL,返回NULL。
PI() 返回圆周率的值
POW() 返回一个表达式到另一个表达的次方值
POWER() 返回一个表达式到另一个表达的次方值
RADIANS() 返回传递表达从度转换为弧度值
ROUND() 返回数字表达式四舍五入到整数。可用于舍入表达式为小数点数值
SIN() 返回给定的数字表达的正弦值(弧度)
SQRT() 返回数字表达式的非负平方根
STD() 返回数字表达式的标准偏差
STDDEV() 返回数字表达式的标准偏差
TAN() 返回以弧度表示数值表达式的正切值。
TRUNCATE() 返回exp1小数位数字截断到exp2。如果exp2为0,则结果将没有小数点。

 

  4.聚合函数

函数  说明
 AVG  返回某列的平均值
 COUNT  返回某类的行数
 MAX  返回某列的最大值
 MIN  返回某列的最小值
 SUM  返回某列值之和

  用例:

-- AVG
SELECT AVG(prod_price) AS avg_price FROM products;
SELECT AVG(prod_price) AS avg_price FROM products WHERE vend_id=1003;
SELECT AVG(DISTINCT prod_price) AS avg_price FROM products WHERE vend_id=1003;-- 计算唯一值列表平均值
-- COUNT
SELECT COUNT(*) AS num_cust FROM customers;-- 对所有行技数
SELECT COUNT(cust_email) as num_cust FROM customers;-- 只对具有电子邮寄地址的客户计数(除去null)
-- SUM
SELECT SUM(item_price * quantity) AS total_price FROM orderitems WHERE order_num = 20005;
-- 组合
SELECT COUNT(*) AS nun_items, MIN(prod_price) AS price_min, MAX(prod_price) AS pric_max, AVG(prod_price) AS price_ag FROM products;

                                  聚合函数(不能做为WHERE条件)
   函数名称                                                       
函数功能
   SUM                                                            
返回选取结果集所有值的和
   MAX                                                            
返回选取结果集中所有值的最大值
   MIN                                                            
返回选取结果集中所有值的最小值
   AVG                                                            
返回选取结果集中所有值的平均值
      COUNT                                                          
返回选取结果集中行的数目

  3、分组关键字 GROUP BY 和HAVING

使用实例:SELECT SUM(COLUMN) FROM table_name

  1.GROUP BY

  - GROUP BY子句可以包含任意数目的列。

  - GROUP BY会在最后规定的分组上进行汇总。

  - GROUP
BY子句列出的每个列都必须是检索列或有效的表达式(但不能是聚合函数)。

  - 除聚合函数外,SELECT语句中的每个列都必须在GROUP BY子句中给出。

  -
如果分组列中具有NULL值,则NULL将作为一个分组返回;如果列中有多行NULL值,它们将分为一组。

  - GROUP BY子句必须出现在WHERE子句字后,ORDER BY子句之前。

  一般在使用GROUP BY子句时,应该也给出ORDER
BY子句,以保证数据正确排序。

 

  2.HAVING

  HAVING支持所有WHERE操作符。它与WHERE最重要的区别是,HAVING对GROUP
BY分组后的数据进行过滤,而where在GROUP BY分组前组织新表时进行过滤。

  用例:

-- GROUP BY 与 HAVINNG
SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
-- GROUP BY 与 ORDER BY
SELECT order_num, COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >= 3 ORDER BY items, order_num;

分组查询
GROUP BY子句
原理:先通过GROUP
BY后面的字段进行分组,合并相同的项。留下唯一的项,再执行SELECT后面的聚合函数。
SELET 后面只能有GROUP BY包含字段和聚合函数。

  4、关键字顺序

关键字(子句) 说明
 是否必须使用
 SELECT  要返回的列或表达式  是
 FROM  从中检索数据的表  仅在从表选择数据时使用
 WHERE  行级过滤  否
 GROUP BY  分组说明  仅在按组计算聚集时使用
 HAVING  组级过滤  否
 ORDER BY  指定排序字段和熟顺序  否

   在实现SQL语句时,通用格式为:

SELECT *columns* FROM *tables* WHERE *condition* GROUP BY *columns* HAVING *condition* ORDER BY *columns* LIMIT *start*, *offset*;

  实际执行的顺序为:

FROM *tables*
WHERE *condition*
GROUP BY *columns*
HAVING *condition*
SELECT *columns*
ORDER BY *columns*
LIMIT *start*, *offset*

# 注:数据表来自

图片 1图片 2

CREATE TABLE customers
(
cust_id int NOT NULL AUTO_INCREMENT,
cust_name char(50) NOT NULL ,
cust_address char(50) NULL ,
cust_city char(50) NULL ,
cust_state char(5) NULL ,
cust_zip char(10) NULL ,
cust_country char(50) NULL ,
cust_contact char(50) NULL ,
cust_email char(255) NULL ,
PRIMARY KEY (cust_id)
) ENGINE=InnoDB;

CREATE TABLE orderitems
(
order_num int NOT NULL ,
order_item int NOT NULL ,
prod_id char(10) NOT NULL ,
quantity int NOT NULL ,
item_price decimal(8,2) NOT NULL ,
PRIMARY KEY (order_num, order_item)
) ENGINE=InnoDB;

CREATE TABLE orders
(
order_num int NOT NULL AUTO_INCREMENT,
order_date datetime NOT NULL ,
cust_id int NOT NULL ,
PRIMARY KEY (order_num)
) ENGINE=InnoDB;

CREATE TABLE products
(
prod_id char(10) NOT NULL,
vend_id int NOT NULL ,
prod_name char(255) NOT NULL ,
prod_price decimal(8,2) NOT NULL ,
prod_desc text NULL ,
PRIMARY KEY(prod_id)
) ENGINE=InnoDB;

CREATE TABLE vendors
(
vend_id int NOT NULL AUTO_INCREMENT,
vend_name char(50) NOT NULL ,
vend_address char(50) NULL ,
vend_city char(50) NULL ,
vend_state char(5) NULL ,
vend_zip char(10) NULL ,
vend_country char(50) NULL ,
PRIMARY KEY (vend_id)
) ENGINE=InnoDB;

CREATE TABLE productnotes
(
note_id int NOT NULL AUTO_INCREMENT,
prod_id char(10) NOT NULL,
note_date datetime NOT NULL,
note_text text NULL ,
PRIMARY KEY(note_id),
FULLTEXT(note_text)
) ENGINE=MyISAM;

ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);


INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10001, 'Coyote Inc.', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'Y Lee', 'ylee@coyote.com');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES(10002, 'Mouse House', '333 Fromage Lane', 'Columbus', 'OH', '43333', 'USA', 'Jerry Mouse');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10003, 'Wascals', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'rabbit@wascally.com');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES(10004, 'Yosemite Place', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Y Sam', 'sam@yosemite.com');
INSERT INTO customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES(10005, 'E Fudd', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'E Fudd');

INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1001,'Anvils R Us','123 Main Street','Southfield','MI','48075', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1002,'LT Supplies','500 Park Street','Anytown','OH','44333', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1003,'ACME','555 High Street','Los Angeles','CA','90046', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1004,'Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1005,'Jet Set','42 Galaxy Road','London', NULL,'N16 6PS', 'England');
INSERT INTO vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES(1006,'Jouets Et Ours','1 Rue Amusement','Paris', NULL,'45678', 'France');


INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV01', 1001, '.5 ton anvil', 5.99, '.5 ton anvil, black, complete with handy hook');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV02', 1001, '1 ton anvil', 9.99, '1 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('ANV03', 1001, '2 ton anvil', 14.99, '2 ton anvil, black, complete with handy hook and carrying case');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('OL1', 1002, 'Oil can', 8.99, 'Oil can, red');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FU1', 1002, 'Fuses', 3.42, '1 dozen, extra long');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SLING', 1003, 'Sling', 4.49, 'Sling, one size fits all');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT1', 1003, 'TNT (1 stick)', 2.50, 'TNT, red, single stick');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('TNT2', 1003, 'TNT (5 sticks)', 10, 'TNT, red, pack of 10 sticks');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FB', 1003, 'Bird seed', 10, 'Large bag (suitable for road runners)');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('FC', 1003, 'Carrots', 2.50, 'Carrots (rabbit hunting season only)');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('SAFE', 1003, 'Safe', 50, 'Safe with combination lock');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('DTNTR', 1003, 'Detonator', 13, 'Detonator (plunger powered), fuses not included');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP1000', 1005, 'JetPack 1000', 35, 'JetPack 1000, intended for single use');
INSERT INTO products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('JP2000', 1005, 'JetPack 2000', 55, 'JetPack 2000, multi-use');

INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20005, '2005-09-01', 10001);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20006, '2005-09-12', 10003);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20007, '2005-09-30', 10004);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20008, '2005-10-03', 10005);
INSERT INTO orders(order_num, order_date, cust_id)
VALUES(20009, '2005-10-08', 10001);

INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 1, 'ANV01', 10, 5.99);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 2, 'ANV02', 3, 9.99);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 3, 'TNT2', 5, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 4, 'FB', 1, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20006, 1, 'JP2000', 1, 55);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 1, 'TNT2', 100, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20008, 1, 'FC', 50, 2.50);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 1, 'FB', 1, 10);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 2, 'OL1', 1, 8.99);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 3, 'SLING', 1, 4.49);
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 4, 'ANV03', 1, 14.99);

INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(101, 'TNT2', '2005-08-17',
'Customer complaint:
Sticks not individually wrapped, too easy to mistakenly detonate all at once.
Recommend individual wrapping.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(102, 'OL1', '2005-08-18',
'Can shipped full, refills not available.
Need to order new can if refill needed.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(103, 'SAFE', '2005-08-18',
'Safe is combination locked, combination not provided with safe.
This is rarely a problem as safes are typically blown up or dropped by customers.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(104, 'FC', '2005-08-19',
'Quantity varies, sold by the sack load.
All guaranteed to be bright and orange, and suitable for use as rabbit bait.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(105, 'TNT2', '2005-08-20',
'Included fuses are short and have been known to detonate too quickly for some customers.
Longer fuses are available (item FU1) and should be recommended.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(106, 'TNT2', '2005-08-22',
'Matches not included, recommend purchase of matches or detonator (item DTNTR).'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(107, 'SAFE', '2005-08-23',
'Please note that no returns will be accepted if safe opened using explosives.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(108, 'ANV01', '2005-08-25',
'Multiple customer returns, anvils failing to drop fast enough or falling backwards on purchaser. Recommend that customer considers using heavier anvils.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(109, 'ANV03', '2005-09-01',
'Item is extremely heavy. Designed for dropping, not recommended for use with slings, ropes, pulleys, or tightropes.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(110, 'FC', '2005-09-01',
'Customer complaint: rabbit has been able to detect trap, food apparently less effective now.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(111, 'SLING', '2005-09-02',
'Shipped unassembled, requires common tools (including oversized hammer).'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(112, 'SAFE', '2005-09-02',
'Customer complaint:
Circular hole in safe floor can apparently be easily cut with handsaw.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(113, 'ANV01', '2005-09-05',
'Customer complaint:
Not heavy enough to generate flying stars around head of victim. If being purchased for dropping, recommend ANV02 or ANV03 instead.'
);
INSERT INTO productnotes(note_id, prod_id, note_date, note_text)
VALUES(114, 'SAFE', '2005-09-07',
'Call from individual trapped in safe plummeting to the ground, suggests an escape hatch be added.
Comment forwarded to vendor.'
);

数据表

 

1、SELECT 后一个聚合函数情况
示例:从订单表Orders中查询各个员工最早的订单时间(OrderDate)。员工ID为(EmployeeID)
SELECT EmployeeID,min(OrderDate) FROM table_name GROUP BY EmployeeID
原理:当执行时首先在表中查询员工ID(EmployeeID),然后将相同的ID合并为一个。当所有的ID都唯一时,这时便开始通过聚合函数获得
员工的最早订单时间。

2、SELECT 后多个聚合函数情况
示例:从订单表Orders中查询各个员工最早的订单时间(OrderDate)和购买最便宜的价格(price)。员工ID为(EmployeeID)
SELECT EmployeeID,min(OrderDate),min(price) FROM table_name GROUP BY
EmployeeID
原理:当执行时首先在表中查询员工ID(EmployeeID),然后将相同的ID合并为一个。当所有的ID都唯一时,这时便开始通过聚合函数获得
员工的最早订单时间,接着再通过聚合函数获得最便宜的价格。

3、GROUP BY后多个字段情况
实例:SELECT MAX(C) FROM table_name GROUP BY A,B
原理:当执行时先对A进行分组如果A中有相同项,则开始对B进行分组。如果A、B同时出现相同项。则将相同项合并,留下一个唯一项。
若A出现相同项,B为不同项。则此时不进行合并,保留此时的项。当A、B分组结束后,则开始通过聚合函数找出分组好后C的最大项。

错误情况:
SELECT EmployeeID,price FROM table_name GROUP BY EmployeeID
错误提示:选择列表中的列 ‘table_name.price’
无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
解决办法:
1、将price写在GROUP BY。(原因:没有被GROUP BY包含,Group
By语句的后面,作为分组的依据)
2、将price写在聚合函数中 (例如:min(price))

错误原因:根据分组字段,将具有相同分组字段的记录归并成了一条记录。
这个时候剩下的那些不存在于Group
By语句后面作为分组依据的字段就有可能出现多个值,
但是目前一种分组情况只有一条记录,一个数据格是无法放入多个数值的,
所以这里就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,
那么完成这个步骤的就是聚合函数。这就是为什么这些函数叫聚合函数(aggregate
functions)了。

总结:GROUP BY 主要是用于分组之后,再通过聚合函数获得相应的值。GROUP
BY后面的字段主要是分组的依据,
当获得唯一项之后再执行SELECT后的聚合函数获得相应的值。GROUP BY
可以通过条件来获得指定的组,
例如:SELECT EmployeeID,min(OrderDate) FROM  table_name WHEER price
=value GROUP BY EmployeeID
另一种用法:Group By All [COLUMN]
SELECT EmployeeID,min(OrderDate) FROM  table_name WHEER price =value
GROUP BY All EmployeeID
分组好之后显示对应的项
聚合函数会根据返回值的类型用默认值0或者NULL来代替聚合函数的返回值。
注意:当GROUP
BY子句中用于分组的列中出现了NULL值时,会将所有的NULL值分别在同
一组,即认为他们是“相等”的

HAVING子句
GROUP
BY子句只是简单地依据所选列的数据进行分组,将该列具有相同值的行划为一组。而实际应用中,
往往还需要删除不满足条件的组,SQL提供HAVING子句来实现该功能。
示例:SELECT EmployeeID,MIN(price) FROM table_name GROUP BY EmployeeID
HAVING MIN(price)

HAVING与WHERE的区别
HAVING子句与WHERE子句的相似之处在于定义了搜索条件,但与WHERE子句不同,HAVING子句与组有关,而不是与单个的行有关。
WHERE子句不能直接以聚合函数作为搜索条件。在SELECT语句中,WHERE和HAVING子句的执行顺序不同。
添加限制条件
1、SELECT EmployeeID,MIN(price) FROM table_name GROUP BY EmployeeID
HAVING MIN(price)>20 AND EmployeeID>2

错误写法:SELECT EmployeeID,MIN(price) FROM table_name GROUP BY
EmployeeID HAVING MIN(price)>100 AND OrderID>5
错误提示:选择列表中的列 ‘table_name.OrderID’
无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
产生错误的原因:不能将单个的OrderID的值应用于组,包括在HAVING子句中的列必须是祖列。此时,WHERE子句不能用HAVING子句代替。
为了获得所需的结果,需要需改如下:
SELECT EmployeeID,MIN(price) FROM table_name WHERE OrderID>5 GROUP
BY   EmployeeID HAVING MIN(price)>100

表的基本链接
1、两表链接:SELECT * FROM table_name1 [AS] a,table_name2 [AS] b
WHERE a.ID=b.ID
2、多表链接:SELECT * FROM table_name1 [AS] a,table_name2 [AS]
b,table_name3 [AS] c WHERE a.ID=b.ID AND b.ID=c.ID
注意:
1、使用SQL
Server关键字作为表名、列名时,需要使用”[]”括起来。例如Order为SQL
Server关键字,若需要创建一张名伟Order的表,则写为”CREATE TABLE
[Order]”
2、SELECT语句首先执行FROM子句,由于定义表别名是在FROM子句中执行,而在其他子句中使用,所以在SELECT语句的任何子句中都可以使用表的别名。

表的连接类型
1、内链接:内连接也称等同连接,返回的结果集是两个表中所有相匹配的数据,并舍弃不匹配的数据(类似于上面的表的基本连接)。
语法:SELECT * FROM table_name1 [INNER] JOIN table_name2 ON
<表达式> [WHERE] [<表达式>]
示例:SELECT * FROM Categories INNER JOIN  Prouducts ON
Categories.CategorID=Prouducts.CategorID
注意:INNER关键字可以省略。

2、外连接:无论是内连接还是带WHERE子句的多表查询,都只返回相匹配的数据(内连接和外连接的区别)。即如果任何一个源表中的行
在另一个源表中没有匹配,则系统不会将该行放在最后的结果中,而在外连接系统生成的结果表中,
不仅包含符合条件的行,还包括左表、
右表、或两个表中所有的数据行。
(1)左外连接(LEFT [OUTER] JOIN)
左外连接除了包括匹配的行之外,还包括JOIN关键字左表中不匹配的行,其中,右表中缺少的属性值用NULL值表示。左表连接示意图如下:
                                              
             
      TB_A                                     TB_B
                A      B      C                                C      
D
    a1     b1     c1                               c1      d1
    a2     b2     c2                               c2      d2
    a3     b3     c3
               
           TB_A LEFT [OUTER] JOIN TB_B ON TB_A.C=TB_B.C
      A      B      C       C       D
         a1     b1     c1      c1      d1
         a2     b2     c2      c2      d2
         a3     b3     c3      NULL     NULL
     
UNION运算符
UNION运算符用于执行集合的“并”运算。
语法:SELECT * FROM table_name1 WHERE <表达式> UNION SELECT *
FROM table_name1 WHERE <表达式>
内连接实现多表连接
语法:SELECT * FROM table_name1 Orders o INNER JOIN Details od ON
o.OrderID=od.OrderID INNER JOIN Employees e ON e.EmployeeID=o.EmployeeID

 

  

 

 

 

 

 

 

 

 

 

 

 

 

相关文章