达内免费Java训练 第七天

今天老师简单地讲了SQL语句,呵呵,以前学过,温习一下。

1、登录数据库:
telnet 192.168.0.200   // 我们连的内网
login: openlab
Password:    // 密码不回显
shanghai% sqlplus   // sqlplus 的Oracle命令
Enter user-name: openlab
Enter password:
SQL>  // 终于可以操作了

2、基础知识:
edit 进入vi 编辑。修改好后 :wq 退出, 输入 / 运行刚才的命令。
锁掉, 同时操作一张表。 这时只有当 一个人commit后才能操作。
字符串两头加单引号
// 严格做数据类型匹配, 避免使用隐式类型转换,因为有时索引不能使用。

DDL:Data Definition Language  定义表头 create table
DML:Data Manipulating Language.  一定要commit; 否则你自己在工作时能看到,但退出后,并没有对数据库做任何任何的更改。
Query : select ...

create table test_zp(
c1 varchar(10),   // , 分隔单个语句
c2 number(4,2),
c3 date);  // ; 表示执行, date类型没有参数.
desc test_zp;  // 查看表头
drop table test_zp;
SQL> clear screen
SQL> update test_zp_01 set c1='ECNU' where c1= 'sql';
insert into test values( 'sql', 90, null);  等价于  insert into test( c1, c2) values ('sql', 100 );


SQL> insert into test values( 'sql', 90, null);  // 可用null代替没有信息的输入
SQL> insert into test( c1, c2) values ('sql', 100 );
SQL> update test set c2 = 89 where c2 = 90;
SQL> rollback;          //把一个事物全部回滚掉,到上一次事务结束(commit , rollback);
SQL> select sysdate from dual;   // sysdate函数返回当前时间。
07-AUG-07   // 缺省显示格式:dd--mm--rr;  插入的07,则为2007, 97为1997; 时间补充为当天开头,零点零分
SQL> alter session set nls_date_format = 'yyyy mm dd hh24:mi:ss';   // 改变当前的连接(session)。日期是格式敏感的(to_date(), to_char() )。
SQL> select sysdate from dual;   // 2007 08 07 11:24:57  

SQL> insert into test_zp_01(c3)
   values( to_date('2005 04 12 15:33:23',  'yyyy mm dd hh24:mi:ss') );   // 加入新的一行,只赋值时间。

SQL> connect openlab/open123  // 重新恢复到默认的session属性。

SQL> select to_char(c3,'yyyy mm dd hh24:mi:ss') from test_zp_01;  // 2005 04 12 15:33:23, 用to_char()改而是变输出格式

SQL> select first_name, salary*12 from s_emp  where dept_id = 42;
SQL> select salary from s_emp where upper(first_name)='BEN';    // select后面可跟字段,表达式,函数。

SQL> select first_name, start_date from s_emp  where to_char( start_date,'yyyy')='1991';   // 选出91年入职的人, 用to_char()转换、过滤记录。
// 当session使用的是默认的日期格式时,可用 where start_date like '%91';

SQL> select first_name, salary from s_emp   where salary between 1550 and 2500;  // 包括1500和2500;
// where salary >=1500 and salary <=2500;   第二个不用where

SQL> select first_name, salary from s_emp  where dept_id in ( 41, 42, 43);   // not in 不在 : 不等于()里的任何一个。

SQL> select first_name, commission_pct from s_emp  where commission_pct is not null; // 找出有提成的。 null 为无提成的。
SQL> select distinct dept_id, title from s_emp;   // 排序再排除,所以得到是升序的。
SQL> select first_name, salary from s_emp order by salary desc;   // 默认升序。

3、表关联信息和组函数:
// 多张表关联信息的查询:
SQL> select first_name, name from s_emp, s_dept;  // 得到的是 25*13=325. row*row 笛卡尔积。
SQL> select e.first_name, e.dept_id, d.id, d.name
    from s_emp e, s_dept d
    where e.dept_id = d.id;    

非等值连接 : 属性值没有相对应的,但可以通过表达式联系起来。
select salary, first_name from s_emp, salgrade  where salary between losal and hisal;

// 外连接: 模拟匹配。 加在后面就是把谁的所有row选出来进行和别人的匹配。
SQL> select e.name, d.name from emp e, dept d
 where e.deptno(+) = d.deptno;

组函数. : avg, sum, count, max , min.    所有的组函数忽略空值。  avg(), sum() 只能是数值性。
SQL> select count(*) from s_emp;    // 得到row数目
SQL> select avg( nvl(commission_pct, 0)  ) from s_emp;     // nvl(,) : 空值转换函数。
SQL> select sum( commission_pct)/count(*) from s_emp;     // 得到 平均提成值

SQL> select dept_id, avg(salary) from s_emp  group by dept_id   // 求每个部门的平均工资。
 having avg(salary)>1000;   
   1) having 过滤的分组后的结果,所以跟的是组函数。 where 过滤的是记录,后面跟的是单行函数,不能放组函数.
   2)有了group by 后 select后只能跟 group by后跟的字段和组函数。
   3)一个字段不能和组函数一起拼(select),除非用group by如 :
SQL> select frist_name, avg(salary) from s_emp;   // ORA-00937: not a single-group group function,

SQL> select d.name, avg(e.salary) from s_dept d, s_emp e
 where e.dept_id = d.id  group by d.name;
//. 也可以修改为 : select max(d.name)   group by d.id;   因为在数据库排组时数值比字符快。  但如果在s_dept 中有多个同名的name(比如对应有不同的区域)。

嵌套查询:
SQL> select first_name from s_emp
 where salary = ( select min(salary) from s_emp )   // 找出谁工资最低。 嵌套查询:比较词的选择,是in 还是 =。

你可能感兴趣的:(JAVA)