今天老师简单地讲了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 还是 =。