一 数据库初识
l SQL是Structured Query Language(结构化查询语言)的缩写。
l SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。
在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。
二 数据库的组成
l 1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义。
l 2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项。
l 3.一个表或者是一个基本表或者是一个视图。基本表是实际存储在数据库的表,而视图是由若干基本表或其他视图构成的表的定义。
l 4.一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。每个存储文件与外部存储上一个物理文件对应。
l 5.用户可以用SQL语句对视图和基本表进行查询等操作。在用户角度来看,视图和基本表是一样的,没有区别,都是关系(表格)。
l 6.SQL用户可以是应用程序,也可以是终端用户。SQL语句可嵌入在宿主语言的程序中使用,宿主语言有FORTRAN,COBOL,PASCAL,PL/I,C和Ada语言等。SQL用户也能作为独立的用户接口,供交互环境下的终端用户使用。
l 7 数据库有三种文件组成 主文件(.mdf)次文件(.ndf)日志文件(.ldf)
数据库中 至少必须有 .mdf 和.ldf 组成。
三 数据库的操作(增删改查)
l 1.数据定义:这一部分又称为“SQL DDL”,定义数据库的逻辑结构,包括定义数据库(database)、基本表(table)、视图(view)和索引4部分。
l 2 数据操纵:这一部分又称为“SQL DML”,其中包括数据查询和数据更新两大类操作,其中数据更新又包括插入、删除和更新三种操作。
l 3数据控制:对用户访问数据的控制有基本表和视图的授权、完整性规则的描述,事务控制语句等。
l 4.嵌入式SQL语言的使用规定:规定SQL语句在宿主语言的程序中使用的规则。
四 数据库用法详解 (增删改查)
create database+数据库名字 创建数据库
对于表的操作:
l 建数据表 create table 表名(列名1 类型,列名2 类型,列名3 类型~~~)
l 说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
l 删除数据表 delete from 表名 where 列名=’’ drop table 表名字 删除表
l 表中插入值insert into 表名 (列名1,列名2··)values(列值1, 列值2,列值3··)
l 更新表中信息
update 表名 set 列名=‘’where 列名=‘’
update 表名 set 列名=列名+‘要添加的信息’where=’’在原有的基
础上添加信息
l 增加一个列:Alter table tabname add column col type
列增加后将不能删除。 唯一能改变的是增加varchar类型的长度。
★★★★★★★★★★★★★★★数据查询★★★★★★★★★★★★★★★
SQL是一种查询功能很强的语言,只要是数据库存在的数据,总能通过适当的方法将它从数据库中查找出来。SQL中的查询语句只有一个:SELECT,它可与其它语句配合完成所有的查询功能。SELECT语句的完整语法,可以有6个子句。完整的语法如下:
SELECT 目标表的列名或列表达式集合
FROM 基本表或(和)视图集合
〔WHERE条件表达式〕
〔GROUP BY列名集合
〔HAVING组条件表达式〕〕
〔ORDER BY列名〔集合〕…〕
说明:简单查询,使用TOP子句;查询结果排序order by;带条件的查询where,使用算术表达式,使用逻辑表达式;使用between关键字;使用in,not in,is, is not等关键字,模糊查询like[3]
整个语句的语义如下:从FROM子句中列出的表中,选择满足WHERE子句中给出的条件表达式的元组,然后按GROUPBY子句(分组子句)中指定列的值分组,再提取满足HAVING子句中组条件表达式的那些组,按SELECT子句给出的列名或列表达式求值输出。ORDER子句(排序子句)是对输出的目标表进行重新排序,并可附加说明ASC(升序)或DESC(降序)排列。
在WHERE子句中的条件表达式F中可出现下列操作符和运算函数:
算术比较运算符:<,<=,>,>=,=,<>。
逻辑运算符:AND,OR,NOT。
集合运算符:UNION(并),INTERSECT(交),EXCEPT(差)。
集合成员资格运算符:IN,NOT IN
谓词:EXISTS(存在量词),ALL,SOME,UNIQUE。
聚合函数:AVG(平均值),MIN(最小值),MAX(最大值),SUM(和),COUNT(计数)。
F中运算对象还可以是另一个SELECT语句,即SELECT语句可以嵌套。
上面只是列出了WHERE子句中可出现的几种主要操作,由于WHERE子句中的条件表达式可以很复杂,因此SELECT句型能表达的语义远比其数学原形要复杂得多。
语句用法罗列:(以一个汽车表为例子)
l select * from Car-- 查询car所有的列
l select distinct oil from Car --消除重复行;
l select Name from Car--只显示某一列
l select distinct brand from Car--只显示某一列并消除本列中重复的值
l select * from car where Brand=‘b003‘ --等值筛选”将与筛选项相等的列选出
l select *from Car where Price>50--不等值筛选数据 将大于某值的数据列出
l select *from Car where Price<30--不等值筛;数据,将小于某值的数据列出
l select *from Car where Price>30and price<50--多条件筛选
l select *from Car where Price>30 and Oil<--逻辑‘与’用单词and
l select *from Car where Price>50 or Price<20--逻辑‘或’用单词or
l select * from Car where price between 30 and 50--筛选出价格在30-50万之间的车
l 说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
A select * from table1 where time between time1 and time2
B select a,b,c, from table1 where a not between 数值1 and 数值2
l select *from Car where Name like‘奥迪%‘--%后面有任意多个。模糊查询 like
l select *from Car where Name like‘%型‘--末尾型查询,模糊查询
l select *from Car where Name like‘%5%‘--中间型查询,模糊查询
l select *from Car where Name like ‘__5%‘--模糊查询 中间第几位数字
l select top 10 *from Car price --筛选出按照价格排名前10名的车子
l select distinct Exhaust from Car where Price>40 and Price<50 --40到50万之间的排量类型
l select *from fruit--显示fruit 这一列
l 说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
l update fruit set numbers=numbers-20 where name=‘桔子‘--直接更改某一列的值
l update fruit set numbers=30 where name=‘苹果‘--直接更改某一项的值
l update fruit set price =5.2,source=‘肥城‘, numbers=50 where name=‘桃子‘--注意更改多项时加逗号;
l select name, price*numbers as ‘成本‘ from fruit--增加列名
--select name ‘成本‘ from price
l select *from Car order by Price asc--按照价格升序
l select *from car order by price desc--按照价格降序
l select *from Car order by Oil asc,price desc --按照油耗有小到大排序同时按照价格由大到小
l 说明:随机取出10条数据
select top 10 * from tablename order by newid()
l 说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
l 说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
l 说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
l 几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count * as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
例句 说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
精妙的sql语句
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in ’"&Server.MapPath(".")&"\data.mdb" &"’ where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
数据查询方式
连接查询: 连接查询是在多表查询操作中常用的必须使用的一种操作。多表查询时,必训使用外部件作为连接属性,当连接查询条件为空时将产生笛卡尔积。
连接查询包括两种,内连接(inner join)外连接
内连接 语法:from 表1 join 表2 on 表1.属性值=表2.属性值
From 表1,表2 where 表1主键值=表二外键值
外连接 外连接 会返回from 子句中提到的至少一个表的所有行只要这些行符合任意where 条件,将检索通过左向外连接引用的左表的所有的行,以及通过右向外连接引用的右表的所有的行,完整外部连接中两个表的所有行都返回。
连接查询:列的扩展
1. 等值连接查询 (内连接)
笛卡尔积 select Info.Code,Info.Name,Nation.Name from Info,Nation where Nation.Code = Info.Nation join on
SELECT Info.Code,Info.Name,Nation.Name,Family.Name from Info JOIN Nation on
Nation.Code = Info.Nation JOIN Family on Info.Code=Family.InfoCode
2. 外连接(left.right.full)
l left左连接: left 左边表为主表 ,右边的为从表,显示的结果集以主表为主 如果从表中没有和它匹配的数据,就以NULL值填充
SELECT Info.Code,Info.Name,Nation.Name from Info right JOIN Nation on
Nation.Code = Info.Nation
l right右连接: right 右边的表为主表
l SELECT Info.Code,Info.Name,Nation.Name from Info full JOIN Nation on Nation.Code = Info.Nation
l full 全连接
每个表都完全显示,互相匹配数据,如果对方没有则以NULL填充
联合查询:行的扩展
SELECT Code,Name from Info
UNION
SELECT code,Name from Nation
用Union将两个查询联合起来显示,追加行的形式在结果集中显示, 必须保证两个查询结果的列的格式是一样的。其中 union 对比必须选择相同的列数相似的数据类型.和相同的顺序。在合并结果时将删除重复行 如果使用all 则全部显示。
详细交流: qq 793059747,相互学习,共同进步!