Thứ Tư, 5 tháng 8, 2020

SQL Tutorial - Bài 1: SELECT

Các nội dung sẽ đề cập trong 

  • Thiết lập môi trường
  • Ký tự đại diện "*"
  • Cột (column)
  • Bí danh cột
  • Bí danh bảng
  • Hàm
  • Biểu thức
  • Truy vấn vô hướng


Thiết lập

Bạn có thể thực hiện tất cả các truy vấn trực tuyến miễn phí bằng SQL Fiddle .
Các ví dụ trong bài viết này yêu cầu phải có các bảng sau đây.
-DROP TABLE employees PURGE;
--DROP TABLE departments PURGE;

CREATE TABLE departments (
  department_id   NUMBER(2) CONSTRAINT departments_pk PRIMARY KEY,
  department_name VARCHAR2(14),
  location        VARCHAR2(13)
);

INSERT INTO departments VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO departments VALUES (20,'RESEARCH','DALLAS');
INSERT INTO departments VALUES (30,'SALES','CHICAGO');
INSERT INTO departments VALUES (40,'OPERATIONS','BOSTON');
COMMIT;


CREATE TABLE employees (
  employee_id   NUMBER(4) CONSTRAINT employees_pk PRIMARY KEY,
  employee_name VARCHAR2(10),
  job           VARCHAR2(9),
  manager_id    NUMBER(4),
  hiredate      DATE,
  salary        NUMBER(7,2),
  commission    NUMBER(7,2),
  department_id NUMBER(2) CONSTRAINT emp_department_id_fk REFERENCES departments(department_id)
);

INSERT INTO employees VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
INSERT INTO employees VALUES (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
INSERT INTO employees VALUES (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
INSERT INTO employees VALUES (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
INSERT INTO employees VALUES (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
INSERT INTO employees VALUES (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
INSERT INTO employees VALUES (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
INSERT INTO employees VALUES (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87','dd-mm-rr')-85,3000,NULL,20);
INSERT INTO employees VALUES (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
INSERT INTO employees VALUES (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
INSERT INTO employees VALUES (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87', 'dd-mm-rr')-51,1100,NULL,20);
INSERT INTO employees VALUES (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
INSERT INTO employees VALUES (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
INSERT INTO employees VALUES (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
COMMIT;
Các bảng này là một biến thể của các bảng EMP và DEPT từ lược đồ SCOTT khi cài đặt sample của Oracle. Bạn sẽ thấy rất nhiều ví dụ của Oracle trên internet bằng cách sử dụng các bảng từ lược đồ SCOTT. Bạn có thể tìm thấy các định nghĩa bảng gốc trong tập lệnh "$ORACLE_HOME/rdbms/admin/utlsampl.sql".

Ký tự đại diện (Wildcard ) "*"

SELECT *
FROM   employees
ORDER BY employee_id;

EMPLOYEE_ID EMPLOYEE_N JOB       MANAGER_ID HIREDATE                 SALARY COMMISSION DEPARTMENT_ID
----------- ---------- --------- ---------- -------------------- ---------- ---------- -------------
       7369 SMITH      CLERK           7902 17-DEC-1980 00:00:00        800                       20
       7499 ALLEN      SALESMAN        7698 20-FEB-1981 00:00:00       1600        300            30
       7521 WARD       SALESMAN        7698 22-FEB-1981 00:00:00       1250        500            30
       7566 JONES      MANAGER         7839 02-APR-1981 00:00:00       2975                       20
       7654 MARTIN     SALESMAN        7698 28-SEP-1981 00:00:00       1250       1400            30
       7698 BLAKE      MANAGER         7839 01-MAY-1981 00:00:00       2850                       30
       7782 CLARK      MANAGER         7839 09-JUN-1981 00:00:00       2450                       10
       7788 SCOTT      ANALYST         7566 19-APR-1987 00:00:00       3000                       20
       7839 KING       PRESIDENT            17-NOV-1981 00:00:00       5000                       10
       7844 TURNER     SALESMAN        7698 08-SEP-1981 00:00:00       1500          0            30
       7876 ADAMS      CLERK           7788 23-MAY-1987 00:00:00       1100                       20
       7900 JAMES      CLERK           7698 03-DEC-1981 00:00:00        950                       30
       7902 FORD       ANALYST         7566 03-DEC-1981 00:00:00       3000                       20
       7934 MILLER     CLERK           7782 23-JAN-1982 00:00:00       1300                       10

14 rows selected.

SQL>
Bạn có thể thấy từ ví dụ trên, khi chúng tôi thực hiện câu lệnh, tất cả dữ liệu từ tất cả các cột được hiển thị.
Ký tự đại diện cũng có thể được sử dụng cho nhiều bảng trong SELECTTrong ví dụ sau, chúng tôi có hai bảng (EMPLOYEES and DEPARTMENTS) được nối (join) với nhau. Chúng tôi đã cung cấp cho họ cả bí danh bảng (e và d) và sử dụng các bí danh đó trong SELECTd. Khi truy vấn được thực thi, chúng tôi nhận được tất cả các cột từ cả hai bảng.
SELECT e.*, d.*
FROM   employees e
       JOIN departments d ON d.department_id = e.department_id
ORDER BY e.employee_id;

EMPLOYEE_ID EMPLOYEE_N JOB       MANAGER_ID HIREDATE                 SALARY COMMISSION DEPARTMENT_ID DEPARTMENT_ID DEPARTMENT_NAM LOCATION
----------- ---------- --------- ---------- -------------------- ---------- ---------- ------------- ------------- -------------- -------------
       7369 SMITH      CLERK           7902 17-DEC-1980 00:00:00        800                       20            20 RESEARCH       DALLAS
       7499 ALLEN      SALESMAN        7698 20-FEB-1981 00:00:00       1600        300            30            30 SALES          CHICAGO
       7521 WARD       SALESMAN        7698 22-FEB-1981 00:00:00       1250        500            30            30 SALES          CHICAGO
       7566 JONES      MANAGER         7839 02-APR-1981 00:00:00       2975                       20            20 RESEARCH       DALLAS
       7654 MARTIN     SALESMAN        7698 28-SEP-1981 00:00:00       1250       1400            30            30 SALES          CHICAGO
       7698 BLAKE      MANAGER         7839 01-MAY-1981 00:00:00       2850                       30            30 SALES          CHICAGO
       7782 CLARK      MANAGER         7839 09-JUN-1981 00:00:00       2450                       10            10 ACCOUNTING     NEW YORK
       7788 SCOTT      ANALYST         7566 19-APR-1987 00:00:00       3000                       20            20 RESEARCH       DALLAS
       7839 KING       PRESIDENT            17-NOV-1981 00:00:00       5000                       10            10 ACCOUNTING     NEW YORK
       7844 TURNER     SALESMAN        7698 08-SEP-1981 00:00:00       1500          0            30            30 SALES          CHICAGO
       7876 ADAMS      CLERK           7788 23-MAY-1987 00:00:00       1100                       20            20 RESEARCH       DALLAS
       7900 JAMES      CLERK           7698 03-DEC-1981 00:00:00        950                       30            30 SALES          CHICAGO
       7902 FORD       ANALYST         7566 03-DEC-1981 00:00:00       3000                       20            20 RESEARCH       DALLAS
       7934 MILLER     CLERK           7782 23-JAN-1982 00:00:00       1300                       10            10 ACCOUNTING     NEW YORK

14 rows selected.

SQL>

Cột (Columns)

Trong nhiều trường hợp, chúng tôi sẽ tránh các ký tự đại diện và chỉ định các cột theo tên. Trong ví dụ sau, chúng tôi sẽ lấy ra hai cột (EMPLOYEE_ID và EMPLOYEE_NAME) từ bảng. Khi chúng tôi thực hiện truy vấn, chúng tôi chỉ có thể thấy hai cột đó được trả về.
SELECT employee_id, employee_name
FROM   employees
ORDER BY employee_id;

EMPLOYEE_ID EMPLOYEE_N
----------- ----------
       7369 SMITH
       7499 ALLEN
       7521 WARD
       7566 JONES
       7654 MARTIN
       7698 BLAKE
       7782 CLARK
       7788 SCOTT
       7839 KING
       7844 TURNER
       7876 ADAMS
       7900 JAMES
       7902 FORD
       7934 MILLER

14 rows selected.

SQL>

Bí danh cột (alias)

Chúng ta có thể thay đổi tên của các cột được trả về trong tập kết quả bằng cách sử dụng các bí danh cột. Trong ví dụ sau, chúng tôi có hai loại khác nhau. Bí danh đầu tiên không phân biệt chữ hoa chữ thường, nhưng chữ cái thứ hai, sử dụng dấu ngoặc kép, buộc trường hợp của tên cột. Bạn có thể thấy tên cột đã thay đổi trong đầu ra bên dưới.
SELECT employee_id AS employee_no, employee_name AS "Name"
FROM   employees
ORDER BY employee_id;

EMPLOYEE_NO Name
----------- ----------
       7369 SMITH
       7499 ALLEN
       7521 WARD
       7566 JONES
       7654 MARTIN
       7698 BLAKE
       7782 CLARK
       7788 SCOTT
       7839 KING
       7844 TURNER
       7876 ADAMS
       7900 JAMES
       7902 FORD
       7934 MILLER

14 rows selected.

SQL>

Bí danh bảng

Các bí danh bảng làm cho nó dễ dàng hơn nhiều để xem các cột đã đến từ đâu. Trong ví dụ sau, chúng tôi đã sử dụng "e" làm bí danh cho bảng NHÂN VIÊN và "d" làm bí danh cho bảng SỞ HỮU. Các bí danh bảng cũng ngăn chặn các tham chiếu mơ hồ đến các cột. Cả hai bảng EMPLOYEES  và DEPARTMENTS  đều có một cột có tên là DEPARTMENT_ID. Sử dụng bí danh cho thấy chính xác bảng mà chúng ta mong đợi nó đến từ đâu.
SELECT e.employee_id,
       e.employee_name,
       d.department_id,
       d.department_name
FROM   employees e
       JOIN departments d ON e.department_id = d.department_id
ORDER BY e.employee_id;

EMPLOYEE_ID EMPLOYEE_N DEPARTMENT_ID DEPARTMENT_NAM
----------- ---------- ------------- --------------
       7369 SMITH                 20 RESEARCH
       7499 ALLEN                 30 SALES
       7521 WARD                  30 SALES
       7566 JONES                 20 RESEARCH
       7654 MARTIN                30 SALES
       7698 BLAKE                 30 SALES
       7782 CLARK                 10 ACCOUNTING
       7788 SCOTT                 20 RESEARCH
       7839 KING                  10 ACCOUNTING
       7844 TURNER                30 SALES
       7876 ADAMS                 20 RESEARCH
       7900 JAMES                 30 SALES
       7902 FORD                  20 RESEARCH
       7934 MILLER                10 ACCOUNTING

14 rows selected.

SQL>
Chúng ta có thể thấy từ đầu ra ở trên, bí danh bảng không được bao gồm trong tên cột. Nếu bạn cần bất kỳ dấu hiệu nào của bảng nơi cột xuất phát, bạn nên sử dụng bí danh cột.
Một số người thích đủ điều kiện tất cả các cột bằng cách sử dụng tên bảng và tên cột cùng nhau. Điều đó ổn đối với tên bảng nhỏ, nhưng tôi nghĩ nó không ổn đối với tên bảng lớn.
SELECT employees.employee_id,
       employees.employee_name,
       departments.department_id,
       departments.department_name
FROM   employees
       JOIN departments ON employees.department_id = departments.department_id
ORDER BY employees.employee_id;

EMPLOYEE_ID EMPLOYEE_N DEPARTMENT_ID DEPARTMENT_NAM
----------- ---------- ------------- --------------
       7369 SMITH                 20 RESEARCH
       7499 ALLEN                 30 SALES
       7521 WARD                  30 SALES
       7566 JONES                 20 RESEARCH
       7654 MARTIN                30 SALES
       7698 BLAKE                 30 SALES
       7782 CLARK                 10 ACCOUNTING
       7788 SCOTT                 20 RESEARCH
       7839 KING                  10 ACCOUNTING
       7844 TURNER                30 SALES
       7876 ADAMS                 20 RESEARCH
       7900 JAMES                 30 SALES
       7902 FORD                  20 RESEARCH
       7934 MILLER                10 ACCOUNTING

14 rows selected.

SQL>
Giống như các bí danh bảng, tên bảng không được bao gồm trong tên cột được trả về.

Hàm

Các SELECT cũng có thể bao gồm các cuộc gọi chức năng. Chúng có thể là các hàm dựng sẵn hoặc các hàm PL / SQL mà bạn tự mã hóa. Trong ví dụ sau, chúng tôi đã sử dụng hàm  UPPER để chuyển đổi một chuỗi ký tự chứa văn bản chữ thường thành văn bản chữ hoa.
SELECT UPPER('lowercase text') AS text
FROM   dual;

TEXT
--------------
LOWERCASE TEXT

1 row selected.

SQL>
Oracle chứa nhiều hàm dựng sẵn để xử lý chuỗi, số và ngày, v.v ... Mọi thảo luận về chúng đều nằm ngoài phạm vi của bài viết này.

Biểu thức

Các SELECT có thể bao gồm một loạt các biểu thức, trong đó có các hoạt động toán học.
SELECT 1+2 AS addition
FROM   dual;

  ADDITION
----------
         3

1 row selected.

SQL>

Truy vấn vô hướng

Có thể nguồn dữ liệu cho một cột bằng cách sử dụng truy vấn con vô hướng. Truy vấn con vô hướng là một truy vấn trả về một hàng của một cột hoặc đối tượng. Ví dụ dưới đây sử dụng truy vấn con vô hướng để trả về số lượng nhân viên cho mỗi bộ phận.
SELECT d.department_id, d.department_name,
       (SELECT COUNT(*) FROM employees e WHERE e.department_id = d.department_id) AS emp_count
FROM   departments d
ORDER BY d.department_id;

DEPARTMENT_ID DEPARTMENT_NAM  EMP_COUNT
------------- -------------- ----------
           10 ACCOUNTING              3
           20 RESEARCH                5
           30 SALES                   6
           40 OPERATIONS              0

4 rows selected.

SQL>
Có thể sử dụng phép join:
SELECT d.department_id, d.department_name, COUNT(e.employee_id) AS emp_count
FROM   departments d
       LEFT OUTER JOIN employees e ON d.department_id = e.department_id
GROUP BY d.department_id, d.department_name
ORDER BY d.department_id;

DEPARTMENT_ID DEPARTMENT_NAM  EMP_COUNT
------------- -------------- ----------
           10 ACCOUNTING              3
           20 RESEARCH                5
           30 SALES                   6
           40 OPERATIONS              0

4 rows selected.

SQL>

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
SQL Tutorial  - Bài 1: SELECT, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master