学习Sql基础以及Sql的部分语法(语法部分为3w中copy)

第一章

.netc#

.NETMicrosoft.NET的简称,包含了能在.NET Framework平台运行的所有编程语言。

C# 是专门为.NET平台设计的一种语言。

c#第一个成绩

1使用Visual  Studio2012 创建并运行控制台应用程序包括是三步:新建项目--- 生成可执行文件--- 运行。

.NET Framework提供的快捷键:

F5:启动

Ctrl+F5:开始执行不调试;

2Program.cs:为项目的启动文件,在该文件中定义项目的启动入口,即Main()方法。在C#中,程序源文件以.cs作为扩展名。

3

1. namespace关键字(命名空间),类似与Java中的package

2. using 关键字 类似与Java中的import关键字

3. class 关键字 表示类

4. Main()方法  跟Javamain()方法一样的效果。

5.关键代码  console.WriteLine(); 表示从控制台输出内容

Console.RealLine(); 从控制台输入

数据类型

整型:int  浮点型: float;  双精度型:double;  字符串型:string

布尔型:bool

其中 C#中布尔的关键字与Java不同,使用bool ,字符串关键字是小写开头

C# 语言要求给浮点变量赋值时,必须以字母fF结束。

C#中的变量

语法:  数据类型  变量名称;

命名规则:

1. 组成: 由字母(A-Za-z)、 10个数字(0-9)、下划线,除此之外不能 含有其他字母

2. 开头: 只能以字母或下划线开头

3. 不能使用C#关键字;

C#中的常量

常量是在程序运行过程中保持不变的值。

语法:const 数据类型  常量名称=值;

常量命名规范:

1. 必须有一定的实际意义

2. 最好以大写字母来命名,中间可根据意义的连接性用下划线做链接,每个常量定义的右侧最好有简单的注释,说明其作用

3. 常量名称长度最好不要超过25个字符。

 

何时使用常量

1. 用于在程序中一旦设定就不允许被修改的值

2. 用于在程序中被经常引用的值

3. 用于程序中具有特定含义的值

 

3.console

常用的输出方法有两种:

Console.WriteLine()Console.Write(). 唯一区别是前者在输出后换行。后者不换行。

常用的输入方法有Console.RealLine()

语法

语法: Console.WriteLine();

Int age int.Parse(Console.ReadLine()); 其中int.Parse()方法的作用是把字符串转换为整数

 

4 .类和对象

方法

【访问修饰符】 返回值类型 方法名(参数列表)

{

//方法的主体

}

1. 访问修饰符 :一个是public 另一个是 private(私有的)

2. 方法的返回值类型:跟Java一样,

3. 方法名 命名规则: 要有实际的含义; 一般每个单词首字母大写

4. 参数列表

语法

方法的主体:实现方法的代码,应该先写方法的声明,包括访问修符、返回值类型、方法名、参数列表,然后再写方法的主体

定义类的语法

语法:【访问修饰符】 class 类名

{

//类的主体

}

语法:  1.if 结构

if(条件表达式)

{

//代码块

}

2. if –else结构

If(条件表达式)

{

//代码块

}

else

{

//代码块

}

3.多重if结构

If(条件表达式1

{

//代码块

}

else  if(条件表达式2)

{

//代码块

}

else if(条件表达式3)

{

//代码块

}

else

{

//代码块

}

 

4.嵌套if结构

If(条件表达式1)

{

If(条件表达式2)

{

//代码块1

}

Else

{

//代码块2

}

}

Else

{

//代码块3

}

Switch

对比:Java中允许case中没有break语句。但是C#语言中要求每个casedefault语句中都必须有break语句。

 

语法:Java

Switch(int/char 表达式)

{

Case 常量表达式1

//语句1

Break//可以没有

Case 常量表达式2

//语句2

Break//可以没有

……

Default

//语句n

}

 

 

C#

Switch(int/char/string表达式)

{

Case 常量表达式1

//语句1

Break//必须有

Case 常量表达式2

//语句2

Break//必须有

……

Default

//语句n

Break;  //必须有

}

Switch(int/char/string表达式)

{

Case 常量表达式1

Case 常量表达式2

//语句1

Break//必须有

……

Default

//语句n

Break;  //必须有

}

数组

语法: 数据类型[] 数据名;

对比:在C#中不能把方括号放在数组名的后面。

循环

1. while 循环

While循环是先判断条件是否满足,如果条件成立再执行循环体。

语法: while(条件表达式)

{

//代码块

}

 

2. do-while 循环

 do-while循环是先执行再判断条件,所以至少会执行一次循环体中的语句。

 语法: do

{

//代码块

}while(条件表达式);

3. for 循环

 for循环常常用在确定循环次数的情况中,

语法: for(表达式1;表达式2; 表达式3

{

//代码块

}

 

4. foreach 循环

Foreach结构的执行过程是循环体依次取出数组中的每一个元素,然后对每个元素都执行一次循环体的操作。

语法: foreach(元素类型 元素变量名 in 数组)

{

//代码块

}

冒泡语法

语法:forint=0; i<scores.Lenght-1; i++

{

for(j=0; j< scores.Lenght-1-i; j++)

{

 Temp=scores[j];

Scores[j]=scores[j+1];

Scores[j+1]=temp;

}

}

冒泡排序速记口诀(升序):

1. N个数字来排队,两两相比小靠前

2. 外层循环N-1,内层循环N-1-i

3. 如果要降序排序,只要把程序中的大于号换成小于号就行了。

 

注释

C#的行注释和快注释与Java相同,分别使用///*..*/,但是文档注释C#中使用“///,且文档注释的每一行都以“///”开头。  

Vs的基本应用

1. 设置断点(断点:breakpoint)将光标停在这一行按F9键。

F5:开始调试;

Shift+F5:停止调试

F9:设置或取消断点

Ctrl+F9:取消断点

F10:单步执行

F2: 转到所调用过程或变量的定义

Ctrl+F2 将焦点转移到类的下拉列表框。

2.  监视变量值

将变量添加到监视窗口的方法有两种:

1. 选中并右击需要关注的变量,选择快捷菜单中的“添加监视”选项

2. 在监视1窗口中单击名称下的空白单元格,输入“变量名”,按Enter

第三章使用属性升级MyBank

修饰符

如果使用private限制类成员的访问权限,那么这些类成员就只能在该类里面使用,其他类对他们没有访问权限。

C#中的访问修饰符

Public  不受任何限制  访问级别:最高

Private  只有类的内部可以使用 访问级别:最低

this 关键字

This关键字是指当前对象本身,通过this可以引用当前类的成员变量和方法。

使用this关键字可以解决成员变量和局部变量名称冲突的问题。

 用属性实现字段封装

1. C#的属性

语法: privatestring _name

Public string Name

{

Get{ return _name}

Set{ _name=value}

}

Get访问器用来返回相应的私有字段的值。Get访问器与方法相似,必须用return语句返回子墩的值。执行get访问器相当于读取勒种私有字段的值。

Set访问器用来设定相应的私有字段的值。Set访问器类似与返回类型为void的方法。它使用一个隐含的输入参数value。对属性赋值时,将会调用set访问器,并将新的参数值赋予对应的字段。

2.属性的数据类型

定义类中的一个属性时,属性的书库类型必须与它所访问的字段类型一致。

3. 属性的访问类型

 只读属性: 只包含get访问器

 只写属性: 只包含set访问器

 读写属性;  包含getset访问器

4. 在编码中如何快速的创建属性

 快捷键 ctrl+r+e   选中字段右击,在弹出快捷菜单中选择“重构”-“封装字段”选项

 

C#中,字段和属性的区别是什么?

通常将字段指定为private,在类内部使用,将属性指定为public,对外部公开,通过getset访问器对字段提供安全、有效范围的保护。

 

C#中,属性和方法的区别是什么?

C#中的属性set访问器和get访问器后不使用“()”,因为访问器没有返回值,所以也不需要指定void

5. 对象初始化器

提供对象初始化器,可以更方便的为对象的属性赋值。

语法: Student student =new Student(){Age=-20}

 

 面向对象的特征——封装

封装的好处:

1. 避免使用非法数据赋值

2. 保证数据的完整性

3. 避免类内部发生修改时,导致整个程序的修改

4. 方法的参数传递有两种方式,即按值传递和按引用传递

 按引用传递参数

5.  C#中,利用按引用传递参数的方式可以在方法调用之后,仍然保留对参数值的修改,需要使用ref 关键字来修饰参数。

 比较值传递与引用传递

6.   值传递是将变量的值复制传递给方法,使得该方法的形参和实参的值相同,在调用的方法中修改形参也只是对实参复制品的数据做更新,并没有真正改变实参的值。

7. 引用传递是将要传递的对象的引用复制给方法的形参,使用被调用的方法直接对引用对象进行更改,会影响实参原来的值。

8. 

 

第四章

字符串的处理

1. 字符串转换为数值型                                 /*字符和数字转换*/

转换为整数型 int.Parsestring

转换为单精度浮点型 floatParsestring

转换为双精度浮点型  double.Parsestring

2 . 数值型转换为字符串

String age =ageToString();

 

Bool Equals(string value) 比较一个字符串与另一个字符串value的值是否相等。若相等,则返回true,若不相等,则返回false

Int Comparestring strAstring strB)比较两个字符串的大小关系,返回一个整数,若A小于B,返回小于0;若等于,返回0; 若大于,返回大于0

Int IndexOfstring value) 获取指定的value字符串在当前字符串第一个匹配项的位置,如果找到value,返回它的位置,如果没有,返回-1

Int LastIndexOfstring value)获取指定的value字符串在当前字符串最后一个匹配项的位置,如果找到value,返回它的位置,如果没有,返回-1

String Joinstring separatorstring[] value)把字符串数组value中的每个字符串用指定的分隔符separate连接,返回连接后的字符串。

String[] Split(char sepatator)  用指定的分隔符separator分割字符串,返回分割后的字符串数组;

string Substringint starIndex, int length)从指定的位置starIndex开始检索长度诶length的子字符串

string ToLower() 获得字符串的小写形式

string ToUpper() 获得字符串的大写形式

string Trim() 去掉字符串前后两端多余的空格

4.1.4 format格式化

语法:String myString=StringFormat(“格式字符串”, 参数列表)

其中 格式字符串包含固定文本和格式项: {索引[,对齐][:格式字符串]}

其中,索引从0开始,与变量列表对应;对齐部分设置显示的宽度和对齐的方式,是一个带符号的整数,整数大小表示数据的宽度,正数为右对齐,负数为左对齐,格式字符串部分包含格式说明符

 

格式化数值结果表

C 货币格式  String.Format(“{0C3}”,2000)   ¥2000.000

D 十进制格式String.Format(“{0D3}”,2000)   2000

F 小数点后的位数固定String.Format(“{0F3}”,2000)  2000.000

N 用逗号,隔开的数字String.Format(“{0N}”,250000)  250,000

P 百分比计数法String.Format(“{0P3}”,0.24545)  24.545

X 十六进制格式String.Format(“{0X000}”,12C

常用Convert类的类型转换方法

ConvertToInt32() 转换为整型(int型)

Conver.ToSingle() 转换为单精度浮点型(float型)

Convert.ToDouble() 转换为双精度浮点型(double型)

Convert.ToString() 转换为字符串类型(string型)

第六章

数据库是表的集合,不是简单的存储实体数据,还要求表达实体之间的关系

数据库管理系统和数据库系统

数据库管理系统(DataBase Management System, DBMS)由一个互相关联的数据集合和一组访问数据的程序构成。基本目标是要提供一个可以方便有效的存取数据库信息的环境。

主要功能是维护数据库,并有效地访问数据库中各个部分的数据

 

数据库系统(DataBase System,DBS)可以对系统提供的数据进行存储、维护和应用,由存储介质、处理对象和管理系统共同组成的集合体,通常由软件、数据库和数据库管理员组成。

数据库由数据库管理系统统一管理,数据的插入、修改和检索都要通过数据库管理系统进行。

 

 数据冗余和数据完整性

数据冗余是指数据库中存在一些重复的数据;数据完整性是指数据库中的数据能够正确地反映实际情况。数据库中允许有一些数据冗余,但是要保持数据的完整性

 

 登录SQL Server数据库

SQL Server中的数据库按照用途可以分为两种:

1. 系统数据库

2. 用户数据库

系统数据库是管理和维护SQL Server所必需的数据库,用户数据库是用户自己建立的数据库

 

SQL Server 提供的系统数据库

1. Master 数据库

Master 数据库记录SQL Server系统的所有系统级别信息

1. 所有的登录账户和系统配置设置

2. 所有其他的数据库及数据库文件的位置

3. SQL Server的初始化信息

2. Tempdb数据库

保存所有临时表和临时存储过程,以及临时生成的工作表

3. Model 数据库

可用于在系统上创建的所有数据库的模板

4. Msdb 数据库

SQL Server 代理程序调度警报、作业及记录操作时使用,另外有关数据库备份和还原的记录,也会写在该数据库中

5. Resource 数据库

只读数据库,包含SQL Server中的所有系统对象

 

 新建一个数据库连接

1.SSMS的菜单栏中选择“文件”-“连接对象资源管理器”选项,弹出“连接到服务器”对话框

2.在“服务器名称”下拉列表框中选择已经连接过的服务器,也可以选择“《浏览更多》”选择其他服务器

3. Windows身份验证

SQL Server身份验证

Windows身份验证是使用当前登录到操作系统的用户去登录,而SQL Server身份验证是使用SQL Server中建立的用户验证

 

 新建数据库登录名

1. 在“安全性”节点下,右击“登录名”,在弹出的快捷菜单中选择“新建登录名”选项

2. 在新建登录对话框中输入登录名、密码,并指定其默认的数据库

  确定登录名和密码时需要注意

1. 登录名默认是Windows身份验证”

2. 可以勾选“强制实施密码策略”复选框,对用户输入的密码提出要求

3.登录名操作权限

操作权限分两类:第一类是指用户在服务器范围内能够执行哪些操作 第二类是指该登录名对指定的数据库的操作权限“在用户映射中设置”

 

 新建数据库用户

步骤如下:

1. 在指定数据库“安全性”节点中,右击“用户”,在弹出的快捷菜单中选择“新建用户”选项

2. 在新建对话框中输入用户的名称,选择关联的登录名

3. 赋予用户对该数据库的操作权限

创建和管理SQL Server数据库

创建数据库

一个数据库至少包含一个数据库文件和一个事务日志文件

1. 数据库文件

数据库文件是存放数据库数据和数据库对象的文件,一个数据库可以有一个或多个数据库文件,一个数据库文件值属于一个数据库,扩展名为.mdf,用来存储数据库的启动信息数据。一个数据库只能有一个主数据库文件

2. 事务日志文件

用来记录数据库的更新情况,扩展名为.ldf

3. 文件组

主要用于分配磁盘空间并进行管理

 

SQL Server Management Studio 中,创建数据库步骤如下:

1. 右击“数据库”在弹出的快捷菜单中选择“新建数据库”选项

2. 建立数据库的时候,首先要输入数据库的名称

数据库的管理和维护

1. 分离和附加数据库

右击数据库名称,在弹出快捷菜单汇总选择“任务”—“分离”选项

右击数据库,选择“附加”,选择要添加的数据库路径,确定

 

2.备份和还原数据库

四种备份方式:完全备份、差异备份、事务日志备份、文件和文件组备份

 

备份数据库步骤:

1. 展开“数据库”文件夹,右击需要备份分数据库,在快捷菜单中选择“任务”—“备份”,在备份窗口中,在“备份类型”中选择“完整”,

“备份到”选项下,点击“磁盘”,如果不想使用系统默认的备份地址,选中默认地址删除后单击“添加”按钮,选择保存的位置

 

第七章

数据完整性

1. 实体完整性约束

实体完整性要求表中的每一行数据都反映不同的实体,不能存在相同的数据行

通过索引、唯一约束、主键约束或标识列属性,可以实现表的实体完整性

2.域完整性约束

  通过限制数据类型、检查约束、输入格式、默认值、非空约束等多种方法

3.引用完整性约束

在输入或删除数据行时,引用完整性约束用来保持表之间已定义的关系

4. 自定义完整性约束

主键和外键

1.主键(Primary Key

一个表只能有一个主键,并且主键列不允许出现空值

选择哪个列作为主键的时候,需要考虑两个原则:最少性和稳定性

2. 外键(Foreign Key

 值要求与主表的主键或者唯一键相对应

 

创建数据库表

SQL Server Management Studio 中建立数据库表

右击数据库下的“表”选项,选择“新建表”

 确定列的数据类型

二进制数据类型:用来存储非字符和文本的数据

Binary 固定长度的二进制数据

Varbinary:可变长度的二进制数据

Image:可用来存储图像

文本书库类型:字符数据包括任意字母、符号或数字字符的组合

Char:固定长度的非Unicode字符数据

Varchar:可变长度的非Unicode字符数据

Nchar:固定长度的Unicode字符数据

Nvarchar:可变长度的Unicode字符数据

Text:存储长文本信息

Ntext:存储可变长度的长文本

日期和时间数据类型:用于存储日期和时间

Datetime:从175311日到99991231日,准确度为三百分之一或3.33毫秒

数字数据类型:该数据仅包含数字,包括正数、负数及分数

Intsmallinttinyintbigint:整数

Floatreal:浮点数

货币数据类型:货币数据类型用于十进制货币值,并且精确到小数点后面4位数

Money

Bit数据类型:表示是/否的数据,在SQL Server中用10表示,一般1表示是,0表示否

Bit:存储布尔数据类型

 标识列

标识列的实现方式如下:

1. 只能是数据属于数字类型,

2. 定义成标识列后,需要分别指定:“标识种子”和“标识增量”,默认值是1

3. 定义标识后,该列随数据行的增加而自动增加数值

如何建立表间关系

步骤如下:

1. 在设计表的时候,在表中点击右键,在弹出的快捷菜单中选择“关系”选项,弹出“外键关系”,,单击“添加”按钮可以添加新的关系

2. 单击“表和列规范”最右侧的小按钮,弹出要建立关系的主键表及主键列对话框

3. 选择主键表,主键列,对应的外键表和列

建立检查约束

设计表的时候,在快捷菜单选择CHECK约束”,然后在跳出对话框中单击“添加”,在右边单击“表达式”最右侧的小按钮,在“CHECK约束表达式”对话框中输入表达式

 删除数据库表

右击该表,在弹出的快捷菜单中选择“删除”选项可以把该表直接删除,

若删除主表,首先要删除相关的从表保证数据的引用完整性

⑧章

SQL语言主要由以下组成:

1. DMLData Manipulation Language,数据操作语言,称为数据操纵语言)用来插入、修改和删除数据库中的数据

2. DDLData Definition Language ,数据定义语言):用来建立数据库、数据库对象和定义其列,大部分以CREATE开头的命令

3. DQLData Query Language,数据查询语言)用来对数据库中的数据进行查询

4. DCL Data Control Language,数据控制语言):用来控制数据库组件的存取许可,存取权限等

 SQL 中的运算符

1.算术运算符

 包括:+加、- 减、*乘、/除、%模  五个

2. 赋值运算符

只有一个运算符即=”,用于讲一个数或变量或表达式赋值给另一个变量

3.比较运算符

= 等于、>大于、<小于、<>不等于、>=大于等于、<=小于等于、!=不等于

4.逻辑运算符

AND:表示当且仅当两个布尔表达式都为TRUE时,返回TRUE

OR:当且仅当两个布尔表达式都为FALSE时,返回FALSE

NOT:对布尔表达式的值取反,优先级别最高

 使用T-SQL插入数据

 使用INSERT插入数据

语法:INSERT [INTO]表名 [(列名列表)] VALUES (值列表);

其中:[into]是可选的,也可以省略

表名是必需的

表的列名是可选的,如果省略,将依次插入所有列

多个列名和多个值列表用逗号分隔

分号(;)是T-SQL语句终止符,分号不是必需的

 

DEFAULT(默认)关键字来代替插入的数值.

 一次插入多行数据

1.通过INSERT SELECT 语句向表中添加数据

INSERT INTO 表名(列名)

SELECT 列名

FROM 表名

注意:

查询得到的数据个数、顺序、数据类型等,必须与插入的项保持一致

2.通过SELECT INTO 语句将现有表中的数据添加到新表中

创建新的标识列

语法:SELECT IDENTITY(数据类型,标识种子,标识增长量) AS 列名

INTO 新表

FROM 原始表

3.通过UNION关键字合并数据进行插入

 使用T-SQL更新数据

语法:UPDATE 表名 SET 列名=更新值[WHERE 更新条件]

注意:

1.SET后面可以紧随多个“列名=更新值”,修改多个数据列的值,不限一个,使用逗号分隔。

2WHERE 子句是可选的,用来限制更新数据的条件。

使用DELETE删除数据

语法:DELETE [FROM] 表名 [WHERE <删除条件>]

 

使用TRUNCAE TABLE 删除数据

TRUNCATE TABLE 用来删除表中的所有行,功能上它类似于没有WHERE子句的DELETE语句

TRUNCATE TABLE 不能用于有外键约束引用的表

 导入和导出数据

 导出数据

1.右击要导出的数据库,在弹出的菜单中选择“任务”-“导出数据”选项。

2.选择要从何处取得数据,选择SQL Server自身,并在下方选择要导出的数据库

3.在“目标”中选择“平面文件目标”选项,然后在“文件名”文本框中输入文件名,确认

4.选择复制一个或多个表或视图的数据,下一步

5. 选择表名并设置文本文件的格式

6.确定是否立即运行,下一步,至完成

导入数据

1.首先准备数据

2.右击要导入的数据库,在菜单中选择“任务”-“导入数据”

3.数据源选择数据文件,选择路径

4.选择将数据源复制到目标远,单击“编辑映射”按钮,进行目标列的对应选择

 

第九章

使用SELECT 语句进行查询

语法:SELECT <列名>

FROM <表名>

[WHERE <查询条件表达式>]

[ORDER BY <排序的列名>[ASC或DESC]]

查询所有的数据行和列

 使用*表示

查询部分行或列

需要使用where条件限制

在查询中使用列的别名

AS后面加别名

查询空值

采用“IS NULL”或“IS NOT NULL”来判断是否为空值

在查询中使用常量列

将一些常来的默认值添加到查询输出中

查询返回限制的行数

使用TOP 关键字来约束

还有百分比PERCENT关键字

 如何使用ORDER BY

asc为升序排列,默认, DESC为降序

在查询中使用函数

字符串函数

CHARINDEX:用来寻找一个指定的字符串在另一个字符串中起始位置

LEN:返回传递给它的字符串长度

UPPER:把传递给它的字符串转换为大写

LTRIM:清除字符左边的空格

RTRIM:清除字符串右边的空格

RIGHT:从字符串右边返回指定数目的字符

REPLACE:替换一个字符串中的字符

STUFF:在一个字符串中,删除指定长度的字符,并在该位置插入一个新的字符串

日期函数

GETDATE:取得当前的系统日期

DATEADD:将指定的数值添加到指定的日期部分后的日期

DATEDIFF:两个日期之间的指定日期部分的间隔

DATENAME:日期中指定日期部分的字符串形式

DATEPART:日期中指定日期部分的整数形式

数学函数

RAND:返回从0到1之间的随机float值

ABS:取数值表达式的绝对值

CEILING:向上取整,取大于或等于指定数值、表达式的最小整数

FLOOR:向下取整,取大于或等于指定数值、表达式的最大整数

POWER:取数值表达式的幂值

ROUND:将数值表达式四舍五入为指定精度

SIGN:对于正数返回+1,对于负数返回—1,对于0则返回0

SQRT:取浮点表达式的平方根

系统函数

CONVERT:用来转变数据类型

CURRENT_USER:返回当前用户的名字

DATALENGHT:返回用于指定表达式的字节数

HOST_NAME:返回当前用户所登录的计算机名字

SYSTEM_USER:返回当前所登录的用户名称

USER_NAME:从给定的用户ID返回用户名

 

 

第十章

—:一个字符

%:任意长度的字符串

[]:括号中所指定范围内的一个字符

[^]:不在括号中所指定范围内的任意一个字符

使用LIKE进行模糊查询

LIKE运算符用于匹配字符串或字符串的一部分

使用BETWEEN 在某个范围内进行查询

须知道查找的初值和终值,并且初值要小于等于终值,初值和终值用AND关键字分开

使用IN在列举值内进行查询

使用带列举值的IN关键字来进行查询,将列举值放在圆括号里,用逗号分开

SUM()函数

SUM()函数返回表达式中所欲数值的总和,空值将被忽略。只能用于数字类型的列,不能够汇总字符、日期等其他数据类型。

AVG()函数

AVG()函数返回表达式中所有数值的平均值,空值将被忽略,只能用于数字类型的列

 MAX()函数和MIN()函数

MAX()函数返回表达式中的最大值,MIN()函数返回表达式中的最小值,忽略空值。只能用于数字型、字符型、及日期/时间类型的列

COUNT()函数

COUNT()函数返回提供的组或记录集中的计数。可以用于除去textimagentext以外任何类型的列。可以使用(*)作为COUNT的表达式。使用星号可以不必指定特定的列而计算所有的行数吗,当对所有的行进行计数时,则包括包含空值的行

 

第十一章

 使用GROUP BY 进行分组查询

通常会结合聚合函数一起来使用

多列分组查询

使用GROUP BY关键字时,在SELECT 列表中可以指定的列是有限制的:

被分组的列

为每个分组返回一个值的表达式,如聚合函数计算出的列

使用HAVING子句进行分组筛选

HAVING子句用来对分组后的数据进行筛选,将“组”看作“列”来限定条件

使用顺序:WHEREGROUP BY HAVING

多表连接查询的分类

常用的连接查询方式:内连接,外连接

内连接查询

内连接查询通常会使用=”或“<>”等比较运算符来判断两列数据值是否相等

WHERE 子句中指定连接条件

FROM子句中使用INNER JOIN... ON

INNER JOIN用来连接两个表

INNER 可以省略

ON 用来设置条件

AS指定表的“别名”

外连接查询

在外连接查询中参与连接的表有主从之分,以主表的每行数据匹配从表的数据列,将符合连接条件的数据直接返回到结果集中,对那些不符合连接条件的列,将被填上NULL值后再返回到结果集中

1. 左外连接查询

左外连接查询的结果集包括LEFT JOIN 子句中指定的左表的所有行,而不仅是连接列所匹配的行。若左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列均为空值

使用LEFT JOIN..ON LEFT OUTER JOIN ..ON关键字进行表之间的关联

2. 右外连接查询

使用RIGHT JOIN..ON RIGHT OUTER JOIN ..ON关键字进行表之间的关联

所有的语法和语句总结

SQL SELECT 语句

SELECT 语句用于从表中选取数据。

结果被存储在一个结果表中(称为结果集)。

SQL SELECT 语法

SELECT 列名称 FROM 表名称

以及:

SELECT * FROM 表名称

注释:SQL 语句对大小写不敏感。SELECT 等效于 select。

SQL SELECT 实例

如需获取名为 "LastName" 和 "FirstName" 的列的内容(从名为 "Persons" 的数据库表),请使用类似这样的 SELECT 语句:

SELECT LastName,FirstName FROM Persons

"Persons" :

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

结果:

LastName

FirstName

Adams

John

Bush

George

Carter

Thomas

SQL SELECT * 实例

现在我们希望从 "Persons" 表中选取所有的列。

请使用符号 * 取代列的名称,就像这样:

SELECT * FROM Persons

提示:星号(*)是选取所有列的快捷方式。

结果:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

在结果集(result-set)中导航

SQL 查询程序获得的结果被存放在一个结果集中。大多数数据库软件系统都允许使用编程函数在结果集中进行导航,比如:Move-To-First-Record、Get-Record-Content、Move-To-Next-Record 等等。

类似这些编程函数不在本教程讲解之列。如需学习通过函数调用访问数据的知识,请访问我们的 ADO 教程 和 PHP 教程

 

 

 

SQL SELECT DISTINCT 语句

在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。

关键词 DISTINCT 用于返回唯一不同的值。

语法:

SELECT DISTINCT 列名称 FROM 表名称

使用 DISTINCT 关键词

如果要从 "Company" 列中选取所有的值,我们需要使用 SELECT 语句:

SELECT Company FROM Orders

"Orders"表:

Company

OrderNumber

IBM

3532

W3School

2356

Apple

4698

W3School

6953

结果:

Company

IBM

W3School

Apple

W3School

请注意,在结果集中,W3School 被列出了两次。

如需从 Company" 列中仅选取唯一不同的值,我们需要使用 SELECT DISTINCT 语句:

SELECT DISTINCT Company FROM Orders

结果:

Company

IBM

W3School

Apple

现在,在结果集中,"W3School" 仅被列出了一次。

 

 

WHERE 子句用于规定选择的标准。

WHERE 子句

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。

语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

下面的运算符可在 WHERE 子句中使用:

操作符

描述

=

等于

<>

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

BETWEEN

在某个范围内

LIKE

搜索某种模式

注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。

使用 WHERE 子句

如果只希望选取居住在城市 "Beijing" 中的人,我们需要向 SELECT 语句添加 WHERE 子句:

SELECT * FROM Persons WHERE City='Beijing'

"Persons"

LastName

FirstName

Address

City

Year

Adams

John

Oxford Street

London

1970

Bush

George

Fifth Avenue

New York

1975

Carter

Thomas

Changan Street

Beijing

1980

Gates

Bill

Xuanwumen 10

Beijing

1985

结果:

LastName

FirstName

Address

City

Year

Carter

Thomas

Changan Street

Beijing

1980

Gates

Bill

Xuanwumen 10

Beijing

1985

引号的使用

请注意,我们在例子中的条件值周围使用的是单引号。

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

文本值:

这是正确的:

SELECT * FROM Persons WHERE FirstName='Bush'

 

这是错误的:

SELECT * FROM Persons WHERE FirstName=Bush

数值:

这是正确的:

SELECT * FROM Persons WHERE Year>1965

 

这是错误的:

SELECT * FROM Persons WHERE Year>'1965'

WHERE 子句用于规定选择的标准。

WHERE 子句

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。

语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

下面的运算符可在 WHERE 子句中使用:

操作符

描述

=

等于

<>

不等于

>

大于

<

小于

>=

大于等于

<=

小于等于

BETWEEN

在某个范围内

LIKE

搜索某种模式

注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。

使用 WHERE 子句

如果只希望选取居住在城市 "Beijing" 中的人,我们需要向 SELECT 语句添加 WHERE 子句:

SELECT * FROM Persons WHERE City='Beijing'

"Persons"

LastName

FirstName

Address

City

Year

Adams

John

Oxford Street

London

1970

Bush

George

Fifth Avenue

New York

1975

Carter

Thomas

Changan Street

Beijing

1980

Gates

Bill

Xuanwumen 10

Beijing

1985

结果:

LastName

FirstName

Address

City

Year

Carter

Thomas

Changan Street

Beijing

1980

Gates

Bill

Xuanwumen 10

Beijing

1985

引号的使用

请注意,我们在例子中的条件值周围使用的是单引号。

SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。

文本值:

这是正确的:

SELECT * FROM Persons WHERE FirstName='Bush'

 

这是错误的:

SELECT * FROM Persons WHERE FirstName=Bush

数值:

这是正确的:

SELECT * FROM Persons WHERE Year>1965

 

这是错误的:

SELECT * FROM Persons WHERE Year>'1965'

ORDER BY 语句用于对结果集进行排序。

ORDER BY 语句

ORDER BY 语句用于根据指定的列对结果集进行排序。

ORDER BY 语句默认按照升序对记录进行排序。

如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。

原始的表 (用在例子中的):

Orders 表:

Company

OrderNumber

IBM

3532

W3School

2356

Apple

4698

W3School

6953

实例 1

以字母顺序显示公司名称:

SELECT Company, OrderNumber FROM Orders ORDER BY Company

结果:

Company

OrderNumber

Apple

4698

IBM

3532

W3School

6953

W3School

2356

实例 2

以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):

SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber

结果:

Company

OrderNumber

Apple

4698

IBM

3532

W3School

2356

W3School

6953

实例 3

以逆字母顺序显示公司名称:

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC

结果:

Company

OrderNumber

W3School

6953

W3School

2356

IBM

3532

Apple

4698

实例 4

以逆字母顺序显示公司名称,并以数字顺序显示顺序号:

SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC

结果:

Company

OrderNumber

W3School

2356

W3School

6953

IBM

3532

Apple

4698

注意:在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。

· 

INSERT INTO 语句

INSERT INTO 语句用于向表格中插入新的行。

语法

INSERT INTO 表名称 VALUES (值1, 值2,....)

我们也可以指定所要插入数据的列:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

插入新的行

"Persons" 表:

LastName

FirstName

Address

City

Carter

Thomas

Changan Street

Beijing

SQL 语句:

INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')

结果:

LastName

FirstName

Address

City

Carter

Thomas

Changan Street

Beijing

Gates

Bill

Xuanwumen 10

Beijing

在指定的列中插入数据

"Persons" 表:

LastName

FirstName

Address

City

Carter

Thomas

Changan Street

Beijing

Gates

Bill

Xuanwumen 10

Beijing

SQL 语句:

INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')

结果:

LastName

FirstName

Address

City

Carter

Thomas

Changan Street

Beijing

Gates

Bill

Xuanwumen 10

Beijing

Wilson

 

Champs-Elysees

 

Update 语句

Update 语句用于修改表中的数据。

语法:

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

Person:

LastName

FirstName

Address

City

Gates

Bill

Xuanwumen 10

Beijing

Wilson

 

Champs-Elysees

 

更新某一行中的一个列

我们为 lastname 是 "Wilson" 的人添加 firstname:

UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'

结果:

LastName

FirstName

Address

City

Gates

Bill

Xuanwumen 10

Beijing

Wilson

Fred

Champs-Elysees

 

更新某一行中的若干列

我们会修改地址(address),并添加城市名称(city):

UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'

WHERE LastName = 'Wilson'

结果:

LastName

FirstName

Address

City

Gates

Bill

Xuanwumen 10

Beijing

Wilson

Fred

Zhongshan 23

Nanjing

DELETE 语句

DELETE 语句用于删除表中的行。

语法

DELETE FROM 表名称 WHERE 列名称 = 值

Person:

LastName

FirstName

Address

City

Gates

Bill

Xuanwumen 10

Beijing

Wilson

Fred

Zhongshan 23

Nanjing

删除某行

"Fred Wilson" 会被删除:

DELETE FROM Person WHERE LastName = 'Wilson'

结果:

LastName

FirstName

Address

City

Gates

Bill

Xuanwumen 10

Beijing

删除所有行

可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:

DELETE FROM table_name

或者:

DELETE * FROM table_name

TOP 子句

TOP 子句用于规定要返回的记录的数目。

对于拥有数千条记录的大型表来说,TOP 子句是非常有用的。

注释:并非所有的数据库系统都支持 TOP 子句。

SQL Server 的语法:

SELECT TOP number|percent column_name(s)

FROM table_name

MySQL 和 Oracle 中的 SQL SELECT TOP 是等价的

MySQL 语法

SELECT column_name(s)

FROM table_name

LIMIT number

例子

SELECT *

FROM Persons

LIMIT 5

Oracle 语法

SELECT column_name(s)

FROM table_name

WHERE ROWNUM <= number

例子

SELECT *

FROM Persons

WHERE ROWNUM <= 5

原始的表 (用在例子中的):

Persons 表:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

4

Obama

Barack

Pennsylvania Avenue

Washington

SQL TOP 实例

现在,我们希望从上面的 "Persons" 表中选取头两条记录。

我们可以使用下面的 SELECT 语句:

SELECT TOP 2 * FROM Persons

结果:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

SQL TOP PERCENT 实例

现在,我们希望从上面的 "Persons" 表中选取 50% 的记录。

我们可以使用下面的 SELECT 语句:

SELECT TOP 50 PERCENT * FROM Persons

结果:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

SQL LIKE 操作符语法

SELECT column_name(s)

FROM table_name

WHERE column_name LIKE pattern

原始的表 (用在例子中的):

Persons 表:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

LIKE 操作符实例

例子 1

现在,我们希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE 'N%'

提示:"%" 可用于定义通配符(模式中缺少的字母)。

结果集:

Id

LastName

FirstName

Address

City

2

Bush

George

Fifth Avenue

New York

例子 2

接下来,我们希望从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE '%g'

结果集:

Id

LastName

FirstName

Address

City

3

Carter

Thomas

Changan Street

Beijing

例子 3

接下来,我们希望从 "Persons" 表中选取居住在包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE '%lon%'

结果集:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

例子 4

通过使用 NOT 关键字,我们可以从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City NOT LIKE '%lon%'

结果集:

Id

LastName

FirstName

Address

City

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

SQL LIKE 操作符语法

SELECT column_name(s)

FROM table_name

WHERE column_name LIKE pattern

原始的表 (用在例子中的):

Persons 表:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

LIKE 操作符实例

例子 1

现在,我们希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE 'N%'

提示:"%" 可用于定义通配符(模式中缺少的字母)。

结果集:

Id

LastName

FirstName

Address

City

2

Bush

George

Fifth Avenue

New York

例子 2

接下来,我们希望从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE '%g'

结果集:

Id

LastName

FirstName

Address

City

3

Carter

Thomas

Changan Street

Beijing

例子 3

接下来,我们希望从 "Persons" 表中选取居住在包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE '%lon%'

结果集:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

例子 4

通过使用 NOT 关键字,我们可以从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City NOT LIKE '%lon%'

结果集:

Id

LastName

FirstName

Address

City

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

·    

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

SQL LIKE 操作符语法

SELECT column_name(s)

FROM table_name

WHERE column_name LIKE pattern

原始的表 (用在例子中的):

Persons 表:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

LIKE 操作符实例

例子 1

现在,我们希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE 'N%'

提示:"%" 可用于定义通配符(模式中缺少的字母)。

结果集:

Id

LastName

FirstName

Address

City

2

Bush

George

Fifth Avenue

New York

例子 2

接下来,我们希望从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE '%g'

结果集:

Id

LastName

FirstName

Address

City

3

Carter

Thomas

Changan Street

Beijing

例子 3

接下来,我们希望从 "Persons" 表中选取居住在包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE '%lon%'

结果集:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

例子 4

通过使用 NOT 关键字,我们可以从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City NOT LIKE '%lon%'

结果集:

Id

LastName

FirstName

Address

City

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

· 

· 

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

LIKE 操作符

LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

SQL LIKE 操作符语法

SELECT column_name(s)

FROM table_name

WHERE column_name LIKE pattern

原始的表 (用在例子中的):

Persons 表:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

LIKE 操作符实例

例子 1

现在,我们希望从上面的 "Persons" 表中选取居住在以 "N" 开始的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE 'N%'

提示:"%" 可用于定义通配符(模式中缺少的字母)。

结果集:

Id

LastName

FirstName

Address

City

2

Bush

George

Fifth Avenue

New York

例子 2

接下来,我们希望从 "Persons" 表中选取居住在以 "g" 结尾的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE '%g'

结果集:

Id

LastName

FirstName

Address

City

3

Carter

Thomas

Changan Street

Beijing

例子 3

接下来,我们希望从 "Persons" 表中选取居住在包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City LIKE '%lon%'

结果集:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

例子 4

通过使用 NOT 关键字,我们可以从 "Persons" 表中选取居住在不包含 "lon" 的城市里的人:

我们可以使用下面的 SELECT 语句:

SELECT * FROM Persons

WHERE City NOT LIKE '%lon%'

结果集:

Id

LastName

FirstName

Address

City

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

· 

通过使用 SQL,可以为列名称和表名称指定别名(Alias)。

SQL Alias

表的 SQL Alias 语法

SELECT column_name(s)

FROM table_name

AS alias_name

列的 SQL Alias 语法

SELECT column_name AS alias_name

FROM table_name

Alias 实例: 使用表名称别名

假设我们有两个表分别是:"Persons" 和 "Product_Orders"。我们分别为它们指定别名 "p" 和 "po"。

现在,我们希望列出 "John Adams" 的所有定单。

我们可以使用下面的 SELECT 语句:

SELECT po.OrderID, p.LastName, p.FirstName

FROM Persons AS p, Product_Orders AS po

WHERE p.LastName='Adams' AND p.FirstName='John'

不使用别名的 SELECT 语句:

SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName

FROM Persons, Product_Orders

WHERE Persons.LastName='Adams' AND Persons.FirstName='John'

从上面两条 SELECT 语句您可以看到,别名使查询程序更易阅读和书写。

Alias 实例: 使用一个列名别名

Persons:

Id

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

SQL:

SELECT LastName AS Family, FirstName AS Name

FROM Persons

结果:

Family

Name

Adams

John

Bush

George

Carter

Thomas

SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

Join 和 Key

有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行 join。

数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。

请看 "Persons" 表:

Id_P

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

请注意,"Id_P" 列是 Persons 表中的的主键。这意味着没有两行能够拥有相同的 Id_P。即使两个人的姓名完全相同,Id_P 也可以区分他们。

接下来请看 "Orders" 表:

Id_O

OrderNo

Id_P

1

77895

3

2

44678

3

3

22456

1

4

24562

1

5

34764

65

请注意,"Id_O" 列是 Orders 表中的的主键,同时,"Orders" 表中的 "Id_P" 列用于引用 "Persons" 表中的人,而无需使用他们的确切姓名。

请留意,"Id_P" 列把上面的两个表联系了起来。

引用两个表

我们可以通过引用两个表的方式,从两个表中获取数据:

谁订购了产品,并且他们订购了什么产品?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons, Orders

WHERE Persons.Id_P = Orders.Id_P

结果集:

LastName

FirstName

OrderNo

Adams

John

22456

Adams

John

24562

Carter

Thomas

77895

Carter

Thomas

44678

SQL JOIN - 使用 Join

除了上面的方法,我们也可以使用关键词 JOIN 来从两个表中获取数据。

如果我们希望列出所有人的定购,可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM PersonsINNER JOIN Orders

ON Persons.Id_P = Orders.Id_P

ORDER BY Persons.LastName

结果集:

LastName

FirstName

OrderNo

Adams

John

22456

Adams

John

24562

Carter

Thomas

77895

Carter

Thomas

44678

不同的 SQL JOIN

除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。

下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。

· JOIN: 如果表中有至少一个匹配,则返回行

· LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

· RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

· FULL JOIN: 只要其中一个表中存在匹配,就返回行

SQL INNER JOIN 关键字

在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

INNER JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

INNER JOIN table_name2

ON table_name1.column_name=table_name2.column_name

注释:INNER JOIN 与 JOIN 是相同的。

原始的表 (用在例子中的):

"Persons" 表:

Id_P

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

"Orders" 表:

Id_O

OrderNo

Id_P

1

77895

3

2

44678

3

3

22456

1

4

24562

1

5

34764

65

内连接(INNER JOIN)实例

现在,我们希望列出所有人的定购。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

INNER JOIN Orders

ON Persons.Id_P=Orders.Id_P

ORDER BY Persons.LastName

结果集:

LastName

FirstName

OrderNo

Adams

John

22456

Adams

John

24562

Carter

Thomas

77895

Carter

Thomas

44678

INNER JOIN 关键字在表中存在至少一个匹配时返回行。如果 "Persons" 中的行在 "Orders" 中没有匹配,就不会列出这些行。

SQL LEFT JOIN 关键字

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

LEFT JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

LEFT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。

原始的表 (用在例子中的):

"Persons" 表:

Id_P

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

"Orders" 表:

Id_O

OrderNo

Id_P

1

77895

3

2

44678

3

3

22456

1

4

24562

1

5

34764

65

左连接(LEFT JOIN)实例

现在,我们希望列出所有的人,以及他们的定购 - 如果有的话。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

LEFT JOIN Orders

ON Persons.Id_P=Orders.Id_P

ORDER BY Persons.LastName

结果集:

LastName

FirstName

OrderNo

Adams

John

22456

Adams

John

24562

Carter

Thomas

77895

Carter

Thomas

44678

Bush

George

 

LEFT JOIN 关键字会从左表 (Persons) 那里返回所有的行,即使在右表 (Orders) 中没有匹配的行。

 

SQL RIGHT JOIN 关键字

RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

RIGHT JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

RIGHT JOIN table_name2

ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, RIGHT JOIN 称为 RIGHT OUTER JOIN。

原始的表 (用在例子中的):

"Persons" 表:

Id_P

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

"Orders" 表:

Id_O

OrderNo

Id_P

1

77895

3

2

44678

3

3

22456

1

4

24562

1

5

34764

65

右连接(RIGHT JOIN)实例

现在,我们希望列出所有的定单,以及定购它们的人 - 如果有的话。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

RIGHT JOIN Orders

ON Persons.Id_P=Orders.Id_P

ORDER BY Persons.LastName

结果集:

LastName

FirstName

OrderNo

Adams

John

22456

Adams

John

24562

Carter

Thomas

77895

Carter

Thomas

44678

 

 

34764

RIGHT JOIN 关键字会从右表 (Orders) 那里返回所有的行,即使在左表 (Persons) 中没有匹配的行。

SQL FULL JOIN 关键字

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

FULL JOIN 关键字语法

SELECT column_name(s)

FROM table_name1

FULL JOIN table_name2

ON table_name1.column_name=table_name2.column_name

注释:在某些数据库中, FULL JOIN 称为 FULL OUTER JOIN。

原始的表 (用在例子中的):

"Persons" 表:

Id_P

LastName

FirstName

Address

City

1

Adams

John

Oxford Street

London

2

Bush

George

Fifth Avenue

New York

3

Carter

Thomas

Changan Street

Beijing

"Orders" 表:

Id_O

OrderNo

Id_P

1

77895

3

2

44678

3

3

22456

1

4

24562

1

5

34764

65

全连接(FULL JOIN)实例

现在,我们希望列出所有的人,以及他们的定单,以及所有的定单,以及定购它们的人。

您可以使用下面的 SELECT 语句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo

FROM Persons

FULL JOIN Orders

ON Persons.Id_P=Orders.Id_P

ORDER BY Persons.LastName

结果集:

LastName

FirstName

OrderNo

Adams

John

22456

Adams

John

24562

Carter

Thomas

77895

Carter

Thomas

44678

Bush

George

 

 

 

34764

FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

· 

SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1

UNION

SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1

UNION ALL

SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

下面的例子中使用的原始表:

Employees_China:

E_ID

E_Name

01

Zhang, Hua

02

Wang, Wei

03

Carter, Thomas

04

Yang, Ming

Employees_USA:

E_ID

E_Name

01

Adams, John

02

Bush, George

03

Carter, Thomas

04

Gates, Bill

使用 UNION 命令

实例

列出所有在中国和美国的不同的雇员名:

SELECT E_Name FROM Employees_ChinaUNION

SELECT E_Name FROM Employees_USA

结果

E_Name

Zhang, Hua

Wang, Wei

Carter, Thomas

Yang, Ming

Adams, John

Bush, George

Gates, Bill

注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。

UNION ALL

UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

SQL Statement 1

UNION ALL

SQL Statement 2

使用 UNION ALL 命令

实例:

列出在中国和美国的所有的雇员:

SELECT E_Name FROM Employees_ChinaUNION ALL

SELECT E_Name FROM Employees_USA

结果

E_Name

Zhang, Hua

Wang, Wei

Carter, Thomas

Yang, Ming

Adams, John

Bush, George

Carter, Thomas

Gates, Bill

 

SQL SELECT INTO 语句可用于创建表的备份复件。

SELECT INTO 语句

SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。

SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

SQL SELECT INTO 语法

您可以把所有的列插入新表:

SELECT *

INTO new_table_name [IN externaldatabase]

FROM old_tablename

或者只把希望的列插入新表:

SELECT column_name(s)

INTO new_table_name [IN externaldatabase]

FROM old_tablename

SQL SELECT INTO 实例 - 制作备份复件

下面的例子会制作 "Persons" 表的备份复件:

SELECT *INTO Persons_backup

FROM Persons

IN 子句可用于向另一个数据库中拷贝表:

SELECT *INTO Persons IN 'Backup.mdb'

FROM Persons

如果我们希望拷贝某些域,可以在 SELECT 语句后列出这些域:

SELECT LastName,FirstNameINTO Persons_backup

FROM Persons

SQL SELECT INTO 实例 - 带有 WHERE 子句

我们也可以添加 WHERE 子句。

下面的例子通过从 "Persons" 表中提取居住在 "Beijing" 的人的信息,创建了一个带有两个列的名为 "Persons_backup" 的表:

SELECT LastName,FirstnameINTO Persons_backup

FROM PersonsWHERE City='Beijing'

SQL SELECT INTO 实例 - 被连接的表

从一个以上的表中选取数据也是可以做到的。

下面的例子会创建一个名为 "Persons_Order_Backup" 的新表,其中包含了从 Persons 和 Orders 两个表中取得的信息:

SELECT Persons.LastName,Orders.OrderNoINTO Persons_Order_BackupFROM PersonsINNER JOIN OrdersON Persons.Id_P=Orders.Id_P

CREATE DATABASE 语句

CREATE DATABASE 用于创建数据库。

SQL CREATE DATABASE 语法

CREATE DATABASE database_name

SQL CREATE DATABASE 实例

现在我们希望创建一个名为 "my_db" 的数据库。

我们使用下面的 CREATE DATABASE 语句:

CREATE DATABASE my_db

可以通过 CREATE TABLE 来添加数据库表。

CREATE TABLE 语句

CREATE TABLE 语句用于创建数据库中的表。

SQL CREATE TABLE 语法

CREATE TABLE 表名称

(

列名称1 数据类型,

列名称2 数据类型,

列名称3 数据类型,

....

)

数据类型(data_type)规定了列可容纳何种数据类型。下面的表格包含了SQL中最常用的数据类型:

数据类型

描述

· integer(size)

· int(size)

· smallint(size)

· tinyint(size)

仅容纳整数。在括号内规定数字的最大位数。

· decimal(size,d)

· numeric(size,d)

容纳带有小数的数字。

"size" 规定数字的最大位数。"d" 规定小数点右侧的最大位数。

char(size)

容纳固定长度的字符串(可容纳字母、数字以及特殊字符)。

在括号中规定字符串的长度。

varchar(size)

容纳可变长度的字符串(可容纳字母、数字以及特殊的字符)。

在括号中规定字符串的最大长度。

date(yyyymmdd)

容纳日期。

SQL CREATE TABLE 实例

本例演示如何创建名为 "Person" 的表。

该表包含 5 个列,列名分别是:"Id_P"、"LastName"、"FirstName"、"Address" 以及 "City":

CREATE TABLE Persons

(

Id_P int,

LastName varchar(255),

FirstName varchar(255),

Address varchar(255),

City varchar(255)

)

Id_P 列的数据类型是 int,包含整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符。

空的 "Persons" 表类似这样:

Id_P

LastName

FirstName

Address

City

 

 

 

 

 

可使用 INSERT INTO 语句向空表写入数据。

SQL 约束

约束用于限制加入表的数据的类型。

可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。

我们将主要探讨以下几种约束:

· NOT NULL

· UNIQUE

· PRIMARY KEY

· FOREIGN KEY

· CHECK

· DEFAULT

SQL NOT NULL 约束

NOT NULL 约束强制列不接受 NULL 值。

NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

下面的 SQL 语句强制 "Id_P" 列和 "LastName" 列不接受 NULL 值:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255)

)

SQL UNIQUE 约束

UNIQUE 约束唯一标识数据库表中的每条记录。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

SQL UNIQUE Constraint on CREATE TABLE

下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 UNIQUE 约束:

MySQL:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),UNIQUE (Id_P)

)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons

(

Id_P int NOT NULL UNIQUE,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255)

)

如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

)

SQL UNIQUE Constraint on ALTER TABLE

当表已被创建时,如需在 "Id_P" 列创建 UNIQUE 约束,请使用下列 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE PersonsADD UNIQUE (Id_P)

如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE PersonsADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

撤销 UNIQUE 约束

如需撤销 UNIQUE 约束,请使用下面的 SQL:

MySQL:

ALTER TABLE PersonsDROP INDEX uc_PersonID

SQL Server / Oracle / MS Access:

ALTER TABLE PersonsDROP CONSTRAINT uc_PersonID

SQL PRIMARY KEY 约束

PRIMARY KEY 约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。

主键列不能包含 NULL 值。

每个表都应该有一个主键,并且每个表只能有一个主键。

SQL PRIMARY KEY Constraint on CREATE TABLE

下面的 SQL 在 "Persons" 表创建时在 "Id_P" 列创建 PRIMARY KEY 约束:

MySQL:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),PRIMARY KEY (Id_P)

)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons

(

Id_P int NOT NULL PRIMARY KEY,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255)

)

如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons

(

Id_P int NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255),CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

)

SQL PRIMARY KEY Constraint on ALTER TABLE

如果在表已存在的情况下为 "Id_P" 列创建 PRIMARY KEY 约束,请使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE PersonsADD PRIMARY KEY (Id_P)

如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE PersonsADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。

撤销 PRIMARY KEY 约束

如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:

MySQL:

ALTER TABLE PersonsDROP PRIMARY KEY

SQL Server / Oracle / MS Access:

ALTER TABLE PersonsDROP CONSTRAINT pk_PersonID

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值