1、Whats SQL,SQL是Structured Query Language(结构化查询语言)的缩写 SQL是操作关系数据库的标准语言 SQL功能强大、简单易学、使用方便,数据表,例如每一列表示一个数据分类。例如学号、姓名、性别、出生日期等,分别表示了“学生”的各种信息。术语称一列为一个字段并且字段名称在表中必须唯一; 而每一行则表示数据的具体描述,例如第一行就记录了学生“李玉红”的基本信息。术语称一行为一条记录。,SQL作用,数据定义:定义数据库、基本表、视图和索引 数据操纵:数据查询、插入、修改、删除 数据控制 我们只关注第二类,数据查询,基本格式: SELECT 目标表的列名或列表达式
2、集合 FROM 基本表或(和)视图集合 WHERE条件表达式 GROUP BY列名集合 HAVING组条件表达式 ORDER BY列名集合,简单查询,有选择地查询某些字段: Select 字段1,字段2,字段3, from 表名 例: Select 编号,姓名,性别,年龄 from 学生表查询所有字段: Select * from 表名例: Select * from 学生表,简单查询,数据库中有个表:Student(学生名单)Select * from 学生表,选出所有的列,没有查询条件,就是要取得表中所有行,Select * from 学生名单 where 性别=女(查出所有的女生) Se
3、lect 姓名 from 学生名单where 性别=女查出所有女生的姓名,通配符,Select 姓名 from 学生表 where 姓名 like 张*是通配符,可以用其来匹配多个字符, 姓名 like 张* 也就是表示所有姓张的。 Select 姓名 from 学生表 where 姓名 like *明则表示找出名字的最后一个字是明的学生。 Select 姓名 from 学生表 where 姓名 like *明*表示找出名字中包含明字的学生,And , Or,Select * from 学生表 where 年龄20 and 性别=男And 表示两个条件都要满足Select * from 学生表
4、 where 年龄20 or 性别=男Or 表示两个条件只要满足其中一个,Order by asc/desc,Select * from 学生表 where 性别=女 order by 学号选出所有女生并且按学号排序(升序,默认) Select * from 学生表 where 性别=女 order by 学号 asc Select * from 学生表 where 性别=女 order by 学号 desc,Ascend 上升 Descend 下降,升序,降序,查询记录应符合的条件;准则表达式,And 与操作 “A” And “B” Or 或操作 “A” Or “B” BetweenAnd
5、指定范围操作 Between “A” And “B” In 指定枚举范围 In(“A,B,C”) Like 指定模式字符串 Like “张*”,BetweenAnd 指定条件范围 Between “A” And “B”,查询年龄在18至20岁学生信息: select * from 学生表 where 年龄 Between 18 And 20,In 指定枚举范围 In(“A,B,C”),select * from 学生表 where 年龄 in(18,19,20)In 前面加上not in,表示不在枚举范围: 比如查询18岁以外所有学生信息 select * from 学生表 where 年龄
6、not in(18),多表查询,假设有三个表:学生表、选课表 一个课程表,三表查询,SELECT 学生表.姓名, 选课表.课程编号, 课程表.课程名称, 选课表.成绩 FROM 学生表 ,课程表 , 选课表,简单连接查询,连接查询在FROM子句中,用于将多个表按照一定的字段关系连接起来 语法是: FROM JOIN ON 连接类型包括:内连接、外连接、交叉连接等 连接条件,往往是两个表之间的关联字段,一般是等值比较,数据库原理与应用,郑捷,18,连接与其他查询手段,对于连接查询而言,经过JOIN的两个表,构成了一个新表 我们在之前所讲述的所有查询手段,都可以应用于这个新表,数据库原理与应用,郑
7、捷,19,多表连接,在实际应用中,参与连接的表可以不止两个,可以为多个 多表连接,一般是分部进行的,以内连接为例,语法如下 FROM INNER JOIN ON INNER JOIN ON 我们可以理解为先连接前两个,形成一个新表,然后新表再连接第三个表,数据库原理与应用,郑捷,20,SELECT 学生表.姓名, 选课表.课程编号, 课程表.课程名称, 选课表.成绩 FROM 学生表 INNER JOIN (课程表 INNER JOIN 选课表 ON 课程表.课程编号 = 选课表.课程编号) ON 学生表.编号 = 选课表.学生编号,聚集函数 (汇总函数),一个聚集函数从多条记录计算出一个结果
8、 count(数目), sum(和),avg(平均值), max(最大值)和min(最小值) 对行集合的特定域进行计算,count,算出符合条件的有多少条记录 SELECT Count(性别) FROM 学生表 WHERE (学生表.性别)=女);,实操,查询:选修英语(102)的有多少? (涉及多表查询、count、子查询),sum,汇总 计算符合条件的所有行的指定域的值的和Select sum(成绩) from 选课表 where 课程编号=101,学生成绩:选课表,avg,计算所有符合条件的行集合的指定域的平均值Select avg(成绩) from 选课表 where 课程编号=101
9、,max,min,计算所有符合条件的行集合的指定域的最大,最小值Select max(成绩) from 选课表 where 课程编号=101,查询经过计算的值,SELECT子句的可以为: 算术表达式 字符串常量 函数 列别名,查全体学生的姓名及其出生年份。(注意,表中只有年龄,没出生日期,那么,出生日期今年年龄) SELECT 姓名,2012-年龄 FROM 学生表输出结果:姓名 2012-年龄李勇 1984刘晨 1985,查询经过计算的值(续),表达式中的计算,A+B 两个数字型字段值相加,两个文本字符串连接 A-B 两个数字型字段值相减 A*B 两个数字型字段值相乘 A/B 两个数字型字段
10、值相除 AB 两个数字型字段值相除四舍五入取整 AB A的B次幂 Mod(A,B) 取余,A除以B得余数 A&B 文本型字段A和B连接,时间及函数,使用日期/时间时,必须要在日期值两边加上“#”。下面写法都是正确的:#Feb12,98#、#2/12/98#、#1221998#。 相关内部函数: Date() 返回系统当前日期 Year() 返回日期中的年份 Month() 返回日期中的月份 Day() 返回日期中的日数 Weekday() 返回日期中的星期数 Hour() 返回时间中的小时数 Now() 返回系统当前的日期与时间,学生成绩:选课表,子查询,查询对象一般是表,也可以是保存的“查询
11、”。有时候不保存“查询”,写一个子查询,再在子查询中查询记录。子查询最常用于SQL命令的WHERE子句中。 例:从“学生表”中查询年龄高于平均年龄的学生的编号,姓名,性别和年龄信息先用一个子查询来计算其平均年龄。再查询年龄大于平均年龄的学生信息 Select avg(年龄) from 学生表 select 编号,姓名,性别,年龄 from 学生表 where 年龄(SELECT Avg(年龄) FROM 学生表);,嵌套最多可达32层,例:查询和学号为“980102”的学生同龄的所有学生的编号,姓名和性别。select 编号,姓名,性别,年龄 from 学生表 where 年龄=(select
12、 年龄 from 学生表 where 编号=“980102“),子查询(嵌套查询),即在一个查询的内部某个部位,有另外一个查询出现 外部的查询语句称为外查询,里面的查询语句称为子查询,数据库原理与应用,郑捷,36,例:查询英语成绩比英语课程平均成绩高的学生记录SELECT 学生编号,成绩 FROM 选课表 WHERE 成绩80),IN子查询(列表子查询),前面的子查询只返回一个值。 创建和使用返回多行的子查询 使用有关的IN和NOT IN运算符。 在外查询的条件中,使用某个子查询作为IN谓词的右端,就构成了IN子查询 这种子查询只允许返回一个字段,但是返回值可以是一个或者多个,甚至是0个记录,
13、返回值之间也允许重复,in子查询,例:查询85分以上考试成绩的课程,显示课程号字段。select distinct 课程编号 from 选课表 where 成绩 in(select 成绩 from 选课表 where 成绩85),子查询,在后面的更新、删除等查询操作再介绍。 思考: 查询英语成绩最高的学生的信息 注意:工资最高的人可能不止一个,有可能几个并列最高,略,可以通过三种语法形式来创建子查询: comparison ANY | ALL | SOME (sqlstatement) expression NOT IN (sqlstatement) NOT EXISTS (sqlstatem
14、ent),更新,UPDATE 表名 SET 字段名=xxx,字段名XXX WHERE 条件表达式,更新(一个记录中)一个数据,UPDATE 学生表 SET 姓名 = “刘小力“ WHERE 姓名=“刘力“(注意,更新时,把表关闭才行),同时改变多列,UPDATE 学生表 SET 姓名=刘红,年龄=20 ,入校日期 = #9/1/2000#, 团员否 = 1 WHERE name=刘小红,修改多个记录的值,例 将所有学生的年龄增加1岁UPDATE 学生表SET 年龄= 年龄+1;,更新语句,例 将全体女学生的英语成绩改为80。UPDATE 学生表 INNER JOIN 选课表 ON 学生表.编号
15、 = 选课表.学生编号 SET 选课表.成绩 = 80 WHERE (学生表.性别)=“女“) AND (选课表.课程编号)=“102“);,插入行,INSERT INTO table_name (column1,column2,.) VALUES ( value1,value2, .) 若没有指定column 系统则会按表格内的栏位顺序填入资料。,Insert into 学生表 values(990404,黄华,女,19,#1985-8-15#,1,u0,777),Insert into 学生表 (编号,年龄,性别,姓名,入校日期) values(990404,18,女,李美丽,#1990-
16、2-2#),插入(续),INTO子句 字段的顺序可与表中字段的顺序不一致 没有指定字段时,按顺序插入 指定部分字段时,注意对应VALUES子句提供的值必须与INTO子句匹配 值的个数 值的类型,删除,DELETE FROM table_name WHERE 条件表达式 删除符合条件的行 注意使条件表达式正确,避免删错行,Delete from 学生表 注意:没有指明条件,删除表中所有行!,Delete from 学生表 where 编号=990404 删除学号为 990404的学生信息,创建表查询,生成表查询可以从一个或多个表/查询的记录中制作一个新表。在下列情况下使用 : 把记录导出到其数据
17、库。如创建一个交易已完成的订单表,以便送到其它部门。 把记录导出到Excel/Word之类的非关系应用系统中。 等,创建表查询的简化:,Select 字段1,字段2,字段3 Into 新表名 From 表名此外,新建表中的数据并不继承原始表中的字段属性或主键设置。 要建立主键、定义数据类型等。使用查询设计器来创建表,ADO,使用Activex数据对象(ADO) ,可以对数据库的数据进行读取和写入等操作。建立一个数据连接:Conn=Server.CreateObject(“ADODB.Connection“),打开和关闭数据库连接,Conn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=“ Persist Security Info=False”由于数据库连接消耗资源,可以在程序解释关闭之。Conn.Close,