一、前置准备:安装Oracle Instant Client与配置环境
instantclient-basiclite-linux.x64-21.x.x.x.x.zip)和SQL*Plus包(如instantclient-sqlplus-linux.x64-21.x.x.x.x.zip),确保版本匹配。/opt/oracle/instantclient),将下载的压缩包解压至此:sudo mkdir -p /opt/oracle/instantclient
sudo unzip instantclient-basiclite-linux.x64-*.zip -d /opt/oracle/instantclient
sudo unzip instantclient-sqlplus-linux.x64-*.zip -d /opt/oracle/instantclient
~/.bashrc(或~/.profile),添加以下内容以设置Oracle环境:export ORACLE_HOME=/opt/oracle/instantclient
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME:$PATH
执行source ~/.bashrc使配置立即生效。sqlplus -v,若显示SQLPlus版本号(如“SQLPlus: Release 21.0.0.0.0”),则说明安装成功。二、连接Oracle数据库
使用sqlplus命令连接远程或本地数据库,格式如下:
sqlplus username/password@//hostname:port/service_name
示例:连接本地Oracle实例(服务名ORCL):
sqlplus scott/tiger@//localhost:1521/ORCL
若需以SYSDBA权限连接,可使用:
sqlplus / as sysdba
```。
**三、基础数据分析操作**
1. **基础查询**
- 查询全表数据:`SELECT * FROM employees;`
- 条件筛选:`SELECT * FROM employees WHERE department_id = 10 AND salary > 5000;`
- 排序与限制:Oracle 12c及以上版本使用`FETCH FIRST`(避免`LIMIT`语法错误):
```sql
SELECT * FROM employees ORDER BY salary DESC FETCH FIRST 10 ROWS ONLY;
```。
2. **数据聚合**
使用`GROUP BY`分组统计,`HAVING`过滤分组结果:
```sql
SELECT department_id, AVG(salary) AS avg_salary, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 6000;
多表关联分析(内连接):
SELECT e.ename, d.dname, e.salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
WHERE e.salary > (SELECT AVG(salary) FROM employees);
```。
3. **事务管理**
- 提交事务:`COMMIT;`(保存修改)
- 回滚事务:`ROLLBACK;`(撤销未提交的修改)。
**四、高级数据分析技巧**
1. **PL/SQL编程**
使用PL/SQL块实现复杂计算(如汇总薪资):
```sql
DECLARE
v_total NUMBER;
BEGIN
SELECT SUM(salary) INTO v_total FROM employees;
DBMS_OUTPUT.PUT_LINE('Total Salary: ' || v_total);
END;
/
执行前需开启输出:SET SERVEROUTPUT ON;。
2. 数据导出
使用SPOOL命令将查询结果保存为CSV文件(适配Excel等工具):
SPOOL /tmp/employees.csv
SELECT * FROM employees WHERE hire_date > TO_DATE('2020-01-01', 'YYYY-MM-DD');
SPOOL OFF
导出的CSV文件可直接用Excel打开。
3. 性能优化
EXPLAIN PLAN分析查询执行计划,识别性能瓶颈:EXPLAIN PLAN FOR SELECT * FROM employees WHERE department_id = 10;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
CREATE INDEX idx_emp_dept ON employees(department_id);
```。
SET LINESIZE 180(设置行宽)、SET PAGESIZE 100(设置每页行数)、SET HEADING ON(显示列标题)。COLUMN employee_name FORMAT A20(设置姓名列宽为20字符)、COLUMN salary FORMAT 999,999.99(格式化薪资为带千位分隔符的数值)。五、安全与脚本集成
sqlplus -S /nolog <<EOF
ACCEPT pwd PROMPT 'Enter password: '
CONNECT test/$pwd
SELECT * FROM employees;
EXIT
EOF
600,防止泄露):echo 'test' > /home/user/u_test.txt
chmod 600 /home/user/u_test.txt
sqlplus -S /nolog <<EOF
CONNECT test/$(cat /home/user/u_test.txt)
SELECT * FROM employees;
EXIT
EOF
```。
VALUE=$(sqlplus -S test/test <<EOF
SET HEADING OFF FEEDBACK OFF VERIFY OFF
SELECT COUNT(*) FROM employees;
EXIT
EOF
)
echo "Employee count: $VALUE"
crontab -e
添加以下内容:0 2 * * * /path/to/export_script.sh
脚本中包含SPOOL命令,将结果导出到指定目录。