第一章
.net与c#
.NET是Microsoft.NET的简称,包含了能在.NET Framework平台运行的所有编程语言。
C# 是专门为.NET平台设计的一种语言。
c#第一个成绩
(1)使用Visual Studio2012 创建并运行控制台应用程序包括是三步:新建项目--- 生成可执行文件--- 运行。
.NET Framework提供的快捷键:
F5:启动
Ctrl+F5:开始执行不调试;
(2)Program.cs:为项目的启动文件,在该文件中定义项目的启动入口,即Main()方法。在C#中,程序源文件以.cs作为扩展名。
(3)
1. namespace关键字(命名空间),类似与Java中的package。
2. using 关键字 类似与Java中的import关键字
3. class 关键字 表示类
4. Main()方法 跟Java中main()方法一样的效果。
5.关键代码 console.WriteLine(); 表示从控制台输出内容
Console.RealLine(); 从控制台输入
数据类型
整型:int 浮点型: float; 双精度型:double; 字符串型:string;
布尔型:bool
其中 C#中布尔的关键字与Java不同,使用bool ,字符串关键字是小写开头
C# 语言要求给浮点变量赋值时,必须以字母f或F结束。
C#中的变量
语法: 数据类型 变量名称;
命名规则:
1. 组成: 由字母(A-Z,a-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结构
(条件表达式1)
{
代码块
}
条件表达式2)
{
代码块
}
条件表达式3)
{
代码块
}
else
{
代码块
}
4.嵌套if结构
条件表达式1)
{
条件表达式2)
{
代码块1
}
Else
{
代码块2
}
}
Else
{
代码块3
}
Switch
对比:Java中允许case中没有break语句。但是C#语言中要求每个case和default语句中都必须有break语句。
语法:Java中
表达式)
{
常量表达式1:
语句1;
; //可以没有
常量表达式2:
语句2;
; //可以没有
……
:
语句n
}
中
表达式)
{
常量表达式1:
语句1;
; //必须有
常量表达式2:
语句2;
; //必须有
……
:
语句n;
必须有
}
表达式)
{
常量表达式1:
常量表达式2:
语句1;
; //必须有
……
:
语句n;
必须有
}
数组
语法: 数据类型[] 数据名;
对比:在C#中不能把方括号放在数组名的后面。
循环
1. while 循环
循环是先判断条件是否满足,如果条件成立再执行循环体。
语法: while(条件表达式)
{
代码块
}
2. do-while 循环
循环是先执行再判断条件,所以至少会执行一次循环体中的语句。
语法:
{
代码块
}while(条件表达式);
3. for 循环
循环常常用在确定循环次数的情况中,
语法: for(表达式1;表达式2; 表达式3)
{
代码块
}
4. foreach 循环
Foreach结构的执行过程是循环体依次取出数组中的每一个元素,然后对每个元素都执行一次循环体的操作。
语法: foreach(元素类型 元素变量名 in 数组)
{
代码块
}
冒泡语法
语法:for(int=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访问器
读写属性; 包含get和set访问器
4. 在编码中如何快速的创建属性
快捷键 ctrl+r+e 选中字段右击,在弹出快捷菜单中选择“重构”-“封装字段”选项
C#中,字段和属性的区别是什么?
通常将字段指定为private,在类内部使用,将属性指定为public,对外部公开,通过get或set访问器对字段提供安全、有效范围的保护。
中,属性和方法的区别是什么?
C#中的属性set访问器和get访问器后不使用“()”,因为访问器没有返回值,所以也不需要指定void。
5. 对象初始化器
提供对象初始化器,可以更方便的为对象的属性赋值。
语法: Student student =new Student(){Age=-20};
面向对象的特征——封装
封装的好处:
1. 避免使用非法数据赋值
2. 保证数据的完整性
3. 避免类内部发生修改时,导致整个程序的修改
4. 方法的参数传递有两种方式,即按值传递和按引用传递
按引用传递参数
5. 在C#中,利用按引用传递参数的方式可以在方法调用之后,仍然保留对参数值的修改,需要使用ref 关键字来修饰参数。
比较值传递与引用传递
6. 值传递是将变量的值复制传递给方法,使得该方法的形参和实参的值相同,在调用的方法中修改形参也只是对实参复制品的数据做更新,并没有真正改变实参的值。
7. 引用传递是将要传递的对象的引用复制给方法的形参,使用被调用的方法直接对引用对象进行更改,会影响实参原来的值。
8.
第四章
字符串的处理
1. 字符串转换为数值型 /*字符和数字转换*/
转换为整数型 int.Parse(string)
转换为单精度浮点型 float。Parse(string)
转换为双精度浮点型 double.Parse(string)
2 . 数值型转换为字符串
String age =age。ToString();
Bool Equals(string value) 比较一个字符串与另一个字符串value的值是否相等。若相等,则返回true,若不相等,则返回false。
Int Compare(string strA,string strB)比较两个字符串的大小关系,返回一个整数,若A小于B,返回小于0;若等于,返回0; 若大于,返回大于0
Int IndexOf(string value) 获取指定的value字符串在当前字符串第一个匹配项的位置,如果找到value,返回它的位置,如果没有,返回-1;
Int LastIndexOf(string value)获取指定的value字符串在当前字符串最后一个匹配项的位置,如果找到value,返回它的位置,如果没有,返回-1;
String Join(string separator, string[] value)把字符串数组value中的每个字符串用指定的分隔符separate连接,返回连接后的字符串。
String[] Split(char sepatator) 用指定的分隔符separator分割字符串,返回分割后的字符串数组;
string Substring(int starIndex, int length)从指定的位置starIndex开始检索长度诶length的子字符串
string ToLower() 获得字符串的小写形式
string ToUpper() 获得字符串的大写形式
string Trim() 去掉字符串前后两端多余的空格
4.1.4 format格式化
语法:String myString=String。Format(“格式字符串”, 参数列表)
其中 格式字符串包含固定文本和格式项: {索引[,对齐][:格式字符串]}
其中,索引从0开始,与变量列表对应;对齐部分设置显示的宽度和对齐的方式,是一个带符号的整数,整数大小表示数据的宽度,正数为右对齐,负数为左对齐,格式字符串部分包含格式说明符
格式化数值结果表
C 货币格式 String.Format(“{0:C3}”,2000) ¥2000.000
D 十进制格式String.Format(“{0:D3}”,2000) 2000
F 小数点后的位数固定String.Format(“{0:F3}”,2000) 2000.000
N 用逗号,隔开的数字String.Format(“{0:N}”,250000) 250,000
P 百分比计数法String.Format(“{0:P3}”,0.24545) 24.545
X 十六进制格式String.Format(“{0:X000}”,12) C
常用Convert类的类型转换方法
Convert。ToInt32() 转换为整型(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所必需的数据库,用户数据库是用户自己建立的数据库
提供的系统数据库
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 中建立数据库表
右击数据库下的“表”选项,选择“新建表”
确定列的数据类型
二进制数据类型:用来存储非字符和文本的数据
固定长度的二进制数据
:可变长度的二进制数据
:可用来存储图像
文本书库类型:字符数据包括任意字母、符号或数字字符的组合
:固定长度的非Unicode字符数据
:可变长度的非Unicode字符数据
:固定长度的Unicode字符数据
:可变长度的Unicode字符数据
:存储长文本信息
:存储可变长度的长文本
日期和时间数据类型:用于存储日期和时间
Datetime:从1753年1月1日到9999年12月31日,准确度为三百分之一或3.33毫秒
数字数据类型:该数据仅包含数字,包括正数、负数及分数
Int、smallint、tinyint、bigint:整数
Float、real:浮点数
货币数据类型:货币数据类型用于十进制货币值,并且精确到小数点后面4位数
Money
Bit数据类型:表示是/否的数据,在SQL Server中用1和0表示,一般1表示是,0表示否
Bit:存储布尔数据类型
标识列
标识列的实现方式如下:
1. 只能是数据属于数字类型,
2. 定义成标识列后,需要分别指定:“标识种子”和“标识增量”,默认值是1
3. 定义标识后,该列随数据行的增加而自动增加数值
如何建立表间关系
步骤如下:
1. 在设计表的时候,在表中点击右键,在弹出的快捷菜单中选择“关系”选项,弹出“外键关系”,,单击“添加”按钮可以添加新的关系
2. 单击“表和列规范”最右侧的小按钮,弹出要建立关系的主键表及主键列对话框
3. 选择主键表,主键列,对应的外键表和列
建立检查约束
设计表的时候,在快捷菜单选择“CHECK约束”,然后在跳出对话框中单击“添加”,在右边单击“表达式”最右侧的小按钮,在“CHECK约束表达式”对话框中输入表达式
删除数据库表
右击该表,在弹出的快捷菜单中选择“删除”选项可以把该表直接删除,
若删除主表,首先要删除相关的从表保证数据的引用完整性
第⑧章
SQL语言主要由以下组成:
1. DML(Data Manipulation Language,数据操作语言,称为数据操纵语言)用来插入、修改和删除数据库中的数据
2. DDL(Data Definition Language ,数据定义语言):用来建立数据库、数据库对象和定义其列,大部分以CREATE开头的命令
3. DQL(Data Query Language,数据查询语言)用来对数据库中的数据进行查询
4. DCL (Data Control Language,数据控制语言):用来控制数据库组件的存取许可,存取权限等
中的运算符
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 列名
新表
原始表
3.通过UNION关键字合并数据进行插入
使用T-SQL更新数据
语法:UPDATE 表名 SET 列名=更新值[WHERE 更新条件]
注意:
1.SET后面可以紧随多个“列名=更新值”,修改多个数据列的值,不限一个,使用逗号分隔。
2.WHERE 子句是可选的,用来限制更新数据的条件。
使用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()函数返回表达式中所有数值的平均值,空值将被忽略,只能用于数字类型的列
()函数和MIN()函数
MAX()函数返回表达式中的最大值,MIN()函数返回表达式中的最小值,忽略空值。只能用于数字型、字符型、及日期/时间类型的列
COUNT()函数
COUNT()函数返回提供的组或记录集中的计数。可以用于除去text、image、ntext以外任何类型的列。可以使用(*)作为COUNT的表达式。使用星号可以不必指定特定的列而计算所有的行数吗,当对所有的行进行计数时,则包括包含空值的行
第十一章
使用GROUP BY 进行分组查询
通常会结合聚合函数一起来使用
多列分组查询
使用GROUP BY关键字时,在SELECT 列表中可以指定的列是有限制的:
被分组的列
为每个分组返回一个值的表达式,如聚合函数计算出的列
使用HAVING子句进行分组筛选
HAVING子句用来对分组后的数据进行筛选,将“组”看作“列”来限定条件
使用顺序:WHERE—GROUP 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 实例
如需获取名为
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 * 实例
现在我们希望从
请使用符号
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)中导航
由
类似这些编程函数不在本教程讲解之列。如需学习通过函数调用访问数据的知识,请访问我们的ADO 教程 和 PHP 教程。
SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词
语法:
SELECT DISTINCT 列名称 FROM 表名称
使用
如果要从
SELECT Company FROM Orders
"Orders"表:
Company | OrderNumber |
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
结果:
Company |
IBM |
W3School |
Apple |
W3School |
请注意,在结果集中,W3School 被列出了两次。
如需从
SELECT DISTINCT Company FROM Orders
结果:
Company |
IBM |
W3School |
Apple |
现在,在结果集中,"W3School" 仅被列出了一次。
WHERE 子句用于规定选择的标准。
WHERE 子句
如需有条件地从表中选取数据,可将
语法
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在
操作符 | 描述 |
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
注释:在某些版本的
使用
如果只希望选取居住在城市
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 子句
如需有条件地从表中选取数据,可将
语法
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在
操作符 | 描述 |
= | 等于 |
<> | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LIKE | 搜索某种模式 |
注释:在某些版本的
使用
如果只希望选取居住在城市
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 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用
原始的表
Orders 表:
Company | OrderNumber |
IBM | 3532 |
W3School | 2356 |
Apple | 4698 |
W3School | 6953 |
实例
以字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
结果:
Company | OrderNumber |
Apple | 4698 |
IBM | 3532 |
W3School | 6953 |
W3School | 2356 |
实例
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
结果:
Company | OrderNumber |
Apple | 4698 |
IBM | 3532 |
W3School | 2356 |
W3School | 6953 |
实例
以逆字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
结果:
Company | OrderNumber |
W3School | 6953 |
W3School | 2356 |
IBM | 3532 |
Apple | 4698 |
实例
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
结果:
Company | OrderNumber |
W3School | 2356 |
W3School | 6953 |
IBM | 3532 |
Apple | 4698 |
注意:在以上的结果中有两个相等的公司名称
·
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 |
|
更新某一行中的一个列
我们为
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 子句是非常有用的。
注释:并非所有的数据库系统都支持
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 实例
现在,我们希望从上面的
我们可以使用下面的
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 实例
现在,我们希望从上面的
我们可以使用下面的
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 操作符实例
例子
现在,我们希望从上面的
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE 'N%'
提示:"%" 可用于定义通配符(模式中缺少的字母)。
结果集:
Id | LastName | FirstName | Address | City |
2 | Bush | George | Fifth Avenue | New York |
例子
接下来,我们希望从
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE '%g'
结果集:
Id | LastName | FirstName | Address | City |
3 | Carter | Thomas | Changan Street | Beijing |
例子
接下来,我们希望从
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE '%lon%'
结果集:
Id | LastName | FirstName | Address | City |
1 | Adams | John | Oxford Street | London |
例子
通过使用不包含 "lon" 的城市里的人:
我们可以使用下面的
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 操作符实例
例子
现在,我们希望从上面的
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE 'N%'
提示:"%" 可用于定义通配符(模式中缺少的字母)。
结果集:
Id | LastName | FirstName | Address | City |
2 | Bush | George | Fifth Avenue | New York |
例子
接下来,我们希望从
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE '%g'
结果集:
Id | LastName | FirstName | Address | City |
3 | Carter | Thomas | Changan Street | Beijing |
例子
接下来,我们希望从
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE '%lon%'
结果集:
Id | LastName | FirstName | Address | City |
1 | Adams | John | Oxford Street | London |
例子
通过使用不包含 "lon" 的城市里的人:
我们可以使用下面的
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 操作符实例
例子
现在,我们希望从上面的
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE 'N%'
提示:"%" 可用于定义通配符(模式中缺少的字母)。
结果集:
Id | LastName | FirstName | Address | City |
2 | Bush | George | Fifth Avenue | New York |
例子
接下来,我们希望从
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE '%g'
结果集:
Id | LastName | FirstName | Address | City |
3 | Carter | Thomas | Changan Street | Beijing |
例子
接下来,我们希望从
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE '%lon%'
结果集:
Id | LastName | FirstName | Address | City |
1 | Adams | John | Oxford Street | London |
例子
通过使用不包含 "lon" 的城市里的人:
我们可以使用下面的
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 操作符实例
例子
现在,我们希望从上面的
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE 'N%'
提示:"%" 可用于定义通配符(模式中缺少的字母)。
结果集:
Id | LastName | FirstName | Address | City |
2 | Bush | George | Fifth Avenue | New York |
例子
接下来,我们希望从
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE '%g'
结果集:
Id | LastName | FirstName | Address | City |
3 | Carter | Thomas | Changan Street | Beijing |
例子
接下来,我们希望从
我们可以使用下面的
SELECT * FROM Persons
WHERE City LIKE '%lon%'
结果集:
Id | LastName | FirstName | Address | City |
1 | Adams | John | Oxford Street | London |
例子
通过使用不包含 "lon" 的城市里的人:
我们可以使用下面的
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"。
现在,我们希望列出
我们可以使用下面的
SELECT po.OrderID, p.LastName, p.FirstName
FROM Persons AS p, Product_Orders AS po
WHERE p.LastName='Adams' AND p.FirstName='John'
不使用别名的
SELECT Product_Orders.OrderID, Persons.LastName, Persons.FirstName
FROM Persons, Product_Orders
WHERE Persons.LastName='Adams' AND Persons.FirstName='John'
从上面两条
Alias 实例: 使用一个列名别名
表
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
有时为了得到完整的结果,我们需要从两个或更多的表中获取结果。我们就需要执行
数据库中的表可通过键将彼此联系起来。主键(Primary Key)是一个列,在这个列中的每一行的值都是唯一的。在表中,每个主键的值都是唯一的。这样做的目的是在不重复每个表中的所有数据的情况下,把表间的数据交叉捆绑在一起。
请看
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 也可以区分他们。
接下来请看
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
除了上面的方法,我们也可以使用关键词
如果我们希望列出所有人的定购,可以使用下面的
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 |
不同的
除了我们在上面的例子中使用的
下面列出了您可以使用的
· 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 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
注释:在某些数据库中,
原始的表
"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 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
注释:在某些数据库中,
原始的表
"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 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
注释:在某些数据库中,
原始的表
"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 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 |
使用
实例
列出所有在中国和美国的不同的雇员名:
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
使用
实例:
列出在中国和美国的所有的雇员:
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 实例 - 制作备份复件
下面的例子会制作
SELECT *INTO Persons_backup
FROM Persons
IN 子句可用于向另一个数据库中拷贝表:
SELECT *INTO Persons IN 'Backup.mdb'
FROM Persons
如果我们希望拷贝某些域,可以在
SELECT LastName,FirstNameINTO Persons_backup
FROM Persons
SQL SELECT INTO 实例 - 带有 WHERE 子句
我们也可以添加
下面的例子通过从
SELECT LastName,FirstnameINTO Persons_backup
FROM PersonsWHERE City='Beijing'
SQL SELECT INTO 实例 - 被连接的表
从一个以上的表中选取数据也是可以做到的。
下面的例子会创建一个名为
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 实例
现在我们希望创建一个名为
我们使用下面的
CREATE DATABASE my_db
可以通过
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 实例
本例演示如何创建名为
该表包含
CREATE TABLE Persons
(
Id_P int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
Id_P 列的数据类型是 int,包含整数。其余 4 列的数据类型是 varchar,最大长度为 255 个字符。
空的
Id_P | LastName | FirstName | Address | City |
|
|
|
|
|
可使用
SQL 约束
约束用于限制加入表的数据的类型。
可以在创建表时规定约束(通过
我们将主要探讨以下几种约束:
· NOT NULL
· UNIQUE
· PRIMARY KEY
· FOREIGN KEY
· CHECK
· DEFAULT
SQL NOT NULL 约束
NOT NULL 约束强制列不接受 NULL 值。
NOT 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 约束。
请注意,每个表可以有多个
SQL UNIQUE Constraint on CREATE TABLE
下面的
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)
)
如果需要命名
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
当表已被创建时,如需在
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD UNIQUE (Id_P)
如需命名
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)
撤销
如需撤销
MySQL:
ALTER TABLE PersonsDROP INDEX uc_PersonID
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT uc_PersonID
SQL PRIMARY KEY 约束
PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含
每个表都应该有一个主键,并且每个表只能有一个主键。
SQL PRIMARY KEY Constraint on CREATE TABLE
下面的
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)
)
如果需要命名
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
如果在表已存在的情况下为
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD PRIMARY KEY (Id_P)
如果需要命名
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE PersonsADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
注释:如果您使用
撤销
如需撤销
MySQL:
ALTER TABLE PersonsDROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE PersonsDROP CONSTRAINT pk_PersonID