Data type P64 ‘’ 转义字符 P67 P68 EXE,选出某个教师的学生中最新的一 个,要姓名, ID (,LIMIT ) EXISTS,NOT EXISTS P409 Q,EXISTS 和 in 的区别( 1000 ,查询结果)
SQL 基础知识 表的基础知识 Insert Select ,内外连接 Update / Delete 子查询 Union Debug 方法 数据备份方法
认识一下表
认识一下表的定义( SQL ) 数据类型( ‘’ ,转义字符),主键, Not Null,Index,Unique
认识一下表的定义(式样书)
INSERT 语句 基本语法 ( 列出所有字段 ) INSERT INTO TBL 名 { 字段名 1 ,字段名 2… 字段名 n} VALUES { 字段值 1 ,字段值 2… 字段值 n} 功能 将字段值插入所选表的相应位置的字段名中 错误可能 ( 1 )字段名和字段值没有一一对应,表现为数量不一致,类型不一致 (前后颠倒,非数值没加 ’’ ,非数值放入数值) ( 2 )一意性制约,输入值与 DB 中存在的主键等具有唯一性的字段的值 是一样的
INSERT 语句(继续) 活用语法 1 INSERT INTO TBL 名 { 字段名 1} VALUES { 字段值 1} 功能 将字段值插入所选表的相应位置的字段名中,没有列出的字段,都插入 Null 错误可能 ( 1 )未选择的字段中有 not null 制约 活用语法 2 INSERT INTO TBL 名 VALUES { 字段值 1 ,字段值 2… 字段值 n} 功能 默认选择了该表的所有字段 错误可能 ( 1 )所有字段都需要有字段值,字段值个数不够 注意:基本语法的错误都会发生在活用语法上
Insert 语句(继续) 活用语法 3 INSERT INTO TBL 名 SELECT 项目1,项目2...项目n FROM TBL 名2 功能 将 Select 语句的执行结果直接插入表中 错误可能 ( 1 )作业: Select 语句本身认为没有问题的情况下 ,列出能想到的所有的错误可能。
SELECT 语句 基本语法 SELECT 项目1,项目2...项目n FROM TBL 名 WHERE 选择条件 GROUP BY 分组条件 HAVING 分组后的选择条件 ORDER BY 排序条件( ASC( 默认 ),DESC ) SELECT 功能 选出客户希望的列,可以用*指代所有的列,也可以自己定义一个数据库里 并不存在的字段(列别名) SELECT * FROM TBL SELECT 1 AS Separator FROM TBL SELECT A. *, 项目 FROM TBL AS A (实际项目里要用真实执行后的 SQL 进行调式) 错误可能 ( 1 )表内该字段不存在,特别是使用了表别名的情况 ( 2 )少逗号,多逗号
SELECT 语句( FROM ) FROM 功能 提供选择范围,可以写多个表,可以用表别名 SELECT * FROM TBL1, TBL2 SELECT * FROM TBL1 A, TBL2 AS B 错误可能 ( 1 )表名不存在 ( 2 )少逗号,多逗号 ( 3 )别名和表名之间需要有一个空格 高级应用(内连接,外连接) ( 1 )内连接 :若不满足条件, TBL1 , TBL2 数据都不能选出 SELECT * FROM TBL1 INNER JOIN TBL2 ON 条件 ( 2 )左外连接 :若不满足条件, TBL1 的数据也能选出, TBL2 的字段值 为NULL SELECT * FROM TBL1 LEFT OUTTER JOIN TBL2 ON 条件 ( 3 )右外连接 :若不满足条件, TBL2 的数据也能选出, TBL1 的字段值 为NULL SELECT * FROM TBL1 RIGHT OUTTER TBL2 ON 条件
SELECT 语句( FROM 继续) 练习
SELECT 语句( SELECT + FROM ) SELECT + FROM 功能 自由选择组合不同表的字段 SELECT * FROM TBL1, TBL2 SELECT A. 项目 1, B. 项目 2, 项目 3 FROM TBL1 AS A, TBL2 AS B 错误可能 ( 1 )项目和表的从属关系有错误 ( 2 )上述项目 3 的情况,如果多表里有同样字段会有问题
Select 语句( WHERE ) WHERE 功能 满足条件的数据才能被选出 SELECT * FROM TBL1 WHERE 选择条件1 AND (选择条件2 OR 选 择条件3) 错误可能 ( 1 )语法miss 各种条件语句 ( 1 )关系比较 =,<>,, =, IS NULL,IS NOT NULL,BETWEEN…AND… , IN , NOT IN, LIKE 问题: NULL 可以比较吗? TBL1. 项目名 <>Null Null=Null 吗? 例: 1)项目1 <> 项目 2 ,项目1 IS NULL 2) BETWEEN :项目1 BETWEEN “A” AND “C” 3) IN :项目1 IN (值1,值2,值3) 注意 ‘’ 4) LIKE : ”%” 代表任意数量的任意字符(包括 0 个), ”_” 代表一个任意字符 项目1 LIKE’% 值1 %’ (部分一致),项目1 LIKE’% 值1 % 值2% ’ ,项目 1 LIKE’ 值1 %’ (前方一致) ,项目1 LIKE’ 值1 ’ (完全一致、项目1 = 值1 ) 项目1 LIKE ‘_’ ‘_’ 代表一位任意字符(必须一位) 转义字符 where USERID like
SELECT 语句( WHERE 继续) ( 2 )条件组合 AND, OR, (),NOT 例: WHERE (NOT( 条件1 AND 条件 2 ) ) OR 条件 3 (项目1=值1 OR 项目1 =值2 )==项目1 IN (值1,值2 ) 以下部分,在 SELECT 语句中也可以使用 ( 3 )数值相关 +,-,*,/,MOD,NVL 例: NVL (项目1, “” )( Oralce 专用), select nvl(sexual,'NULL2'), usertbl.* from usertbl MOD (项目1,2) ( 4 )文本相关 (参见 cse 帮助) ( 5 )日期相关(参见 cse 帮助) sysdate 要问清用 app server 还是 DB server
SELECT 语句( GROUPBY ) GroupBy 是分组语句, 可以结合使用 SUM ,AVG、MIN、MA X等分组函数。 Having 是 GroupBy 的条件
SELECT 语句(子查询) Select 语句本身可以作为子查询,查询结果来 充当 From 表, Where 条件 select B.username,role from usertbl B, (select max(username) AS username from usertbl group by role) A where A.username = B.username select username,role from usertbl, where username in (select max(username) from usertbl group by role)
SELECT 语句(伪列) Oracle 中存在一些系统默认的,但是不会被 直接 Select * 出来的列,称为伪列。 RowID 数据的物理地址,在数据没有被移动过的前 提下,这个数据是不会改变的。而且没有 重复。可以活用当作不会改变的主键。 RowNum 数据的行数,可以活用做选取限定条的数据 SELECT rowid,rownum FROM usertbl WHERE RowNum<2
UPDATE / DELETE 语句 UPDATE TBL 名 SET 项目名 1 =项目值 1, 项目名 2 =项目值 2 WHERE 条件 DELETE TBL 名 WHERE 条件 数据库如有没有自动提交功能,需要手动的调用 COMMIT, ROLLBACK 命令来提交或者取消修改。 如果没有提交的话,只能在自己的进程里看到修正,在外部是看不到的。 另外,提交以后就不能再修改,所以,在书写上述命令时, (1)写出 WHERE 条件 (2)在上面加上 SELECT * 来确认取出数据就是自己想要修正/删除的数据 (3)换成 UPDATE , DELETE 语句并执行 (4)再次确认修正/删除操作是自己想要的范围 (5) COMMIT 或 ROLLBACK 在多人使用一个数据库的时候,上述的谨慎绝对不是多余的。
CASE 语句 SELECT * FROM usertbl WHERE role= CASE WHEN 1<>1 THEN 'T' WHEN 2>1 THEN 'S' END AND versionno=0 IF(No==0){ No=1; } IF(No==1){ }
UNION ( ALL ) SELECT * FROM TBL1 UNION SELECT * FROM TBL2 … UNION SELECT * FROM TBLN ORDER BY 排序条件 功能 把多个查询结果合并到一个表中 游戏规则 ( 1 )每个 SELECT 语句中的选择项目的数量必须一致,对 应位置的项目类型或者一致,或者可以转换 ( 2 ) UNION 会清除掉重复记录 UNION ALL 不会,所以性能上好一点
UNION ( ALL )(继续)
Debug 方法
数据备份方法
数据备份方法(继续)
数据导入方法 数据导入前,需要用 delete 命令删除掉重复数据。 否则,主键重复的数据不会被更新。
作业 将下列需求写成 SQL 验证用户修正密码的正确性(不能等于最近三次的密码) 按照教师和学生的顺序,选出所有人的用户 ID 和用户名,不显示系统管理员 选出 MAXT 下面所有学生中最新的学生的用户 ID 和用户名 选出用户 ID 以A到C为首的用户 ID 和用户名,用用户 id (升)和 Role (降)排序 选出用户 ID 里含有 ‘_’ 的用户 ID 和用户名 为了验证上述 SQL 的正确性,应该准备什么数据?分条写清楚。(用 cse 的导出功能) 回答下列问题 子查询里能不能看到外部查询的内容? EXISTS 和 in 的区别是什么? 内外连接,子查询, Union, 如何决定该选哪个? SELECT 语句本身认为没有问题的情况下 (P8) ,列出能想到的所有的错误可能。 问题: NULL 可以比较吗? TBL1. 项目名 <>Null Null=Null 吗? NOT ( 条件 1 AND 条件 2) 换成不使用 AND 只使用 OR 的条件