Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 43

SQL Advance

<Trainer-Name>

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Agenda
 Advanced DML Statements
UNION
MINUS
Use CASE structure in SELECT
Joins: Cross, Self, Inner and Outer Joins
Sub Queries
Exist & NOT Exist
 SQL Optimization Tips

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
UNION

 The UNION operator is used to combine


the result-set of two or more SELECT
statements.
 UNION:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2
 UNION ALL:
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2
© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4
Advanced DML Statements
MINUS 1/2

 The MINUS query returns all rows in the


first query that are not returned in the
second query.
 Syntax:
SELECT field1, field2, . field_n
FROM tables
MINUS
SELECT field1, field2, . field_n
FROM tables;

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
MINUS 2/2

 Display the employee IDs of those


employees who have not changed their
jobs even once

SELECT employee_id, job_id


FROM employees
MINUS
SELECT employee_id, job_id
FROM job_history;
© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4
Advanced DML Statements
Use CASE structure in SELECT

 Syntax:
CASE biểu_thức
WHEN biểu_thức_kiểm_tra THEN kết_quả
[ ... ]
[ELSE kết_quả_của_else]
END

SELECT masv,hodem,ten,
CASE gioitinh
WHEN 1 THEN 'Nam'
ELSE 'Nữ'
END AS gioitinh
FROM sinhvien
© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4
Advanced DML Statements
Joins

 Cross Join
 Cartesian product. Simply merges two tables.
 Self Join
 Joining a table with itself
 Inner Join
 Cross join with a condition. Used to find matching
records in the two tables
 Outer Join
 Used to find un matched rows in the two tables
 Join types: left joint, right join, full join

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Cross Join
There are two tables A and B
A has a column Id and data (1,2,3)
B has a column Id and data (A,B)

If I put
Select A.Id, B.Id from A,B
This generates output as
A1
B1
C1
A2
B2
C2

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Self Join

There is a table called Emp with the following structure:


empid ename mgrid
1 A null
2 B 1
3 C 1
4 D 2

If I want to print all managers using self join, I should write query as:

select e1.ename from


emp e1,emp e2
where e1.mgrid = e2.empid

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Inner Join
 The INNER JOIN keyword return rows when there is at least one
match in both tables
 Syntax:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name

 Example:
I have 2 tables Student(sid, Name) and Marks(Sid, Subject, Score)
If I want to print the marks of all students in the following format,
Name Subject Score

SELECT Name, Subject, Score


FROM Student s INNER Marks m
ON s.sid = m.sid

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Outer Join

 Right outer Join


 Returns all the rows from the right table (table2), even
if there are no matches in the left table (table1)
 Left outer Join
 Returns all rows from the left table (table1), even if
there are no matches in the right table (table2)
 Full outer Join
 Return rows when there is a match in one of the
tables

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Left Join 1/3
 The LEFT JOIN keyword returns all rows from the
left table (table1), even if there are no matches in
the right table (table2).
 Syntax:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Left Join 2/3

I have a table Employee (Eid, Ename, Mid) and


a table Machine (Mid,ManufacturerName)

Employee
Eid EName Mid
1 ABC 1
2 DEF 3

Machine
Mid ManufacturerName
1 Zenith
2 HP

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Left Join 3/3

I want to print the employee name and machine name.

If I write a query using inner join, then the second employee will
not be displayed as the mid in his record is not avilable with the second
table.

So I go for left outer join. The query is as shown below:

Select Ename, ManufacturerName from Employee e left outer join


Machine m on e.Mid = m.Mid

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Right Join 1/3
 The RIGHT JOIN keyword returns all the rows
from the right table (table2), even if there are no
matches in the left table (table1).
 Syntax:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Right Join 2/3

Assume data in the tables like this:


Employee
Eid EName Mid
1 ABC 1
2 DEF

Machine
Mid ManufacturerName
1 Zenith
2 HP

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Right Join 3/3

If I want to find which machine is unallocated, I can use right outer join.

The query is as follows:

Select Ename, ManufacturerName from Employee e right outer join


Machine m on e.Mid = m.Mid

This yields a result


ABC Zenith
HP

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Full Join 1/3
 The FULL JOIN keyword return rows when there
is a match in one of the tables.
 Syntax:
SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name=table2.column_name

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Full Join 2/3

Assume data in the tables like this:


Employee
Eid EName Mid
1 ABC 1
2 DEF
3 GHI2
Machine
Mid ManufacturerName
1 Zenith
2 HP
3 Compaq

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Joins - Full Join 3/3

If I want to find people who have been un allocated with a system and
machines that are been un allocated, I can go for full outer join.

Query is like this:


Select Ename, ManufacturerName from Employee e full outer join
Machine m on e.Mid = m.Mid

This yields a result


ABC Zenith
DEF
GHI HP
Compaq

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Sub Queries

 Inner query is independent of outer query.


 Inner query is executed first and the
results are stored.
 Outer query then runs on the stored
results.

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Using sub-queries

SELECT SNAME
FROM S
WHERE SNO IN
(SELECT SNO
FROM SP
WHERE PNO =‘P2’)

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Using sub-queries (2)

SELECT SNO
FROM S
WHERE STATUS <
(SELECT STATUS
FROM S
WHERE SNO=‘S1’)

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Using sub-queries (3)

SELECT SNO
FROM S
WHERE STATUS <
(SELECT MAX(STATUS)
FROM S)

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
Using sub-queries (4)

SELECT DISTINCT SNO


FROM SPJ X
WHERE PNO=‘P1’
AND QTY> (SELECT AVG(QTY)
FROM SPJ Y
WHERE PNO=‘P1’
AND X.JNO=Y.JNO)

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


Advanced DML Statements
EXIST & NOT EXIST

 Used in sub-query
SELECT hodem,ten
FROM sinhvien JOIN lop on sinhvien.malop=lop.malop
WHERE tenlop='Tin K25' AND
year(ngaysinh)IN(SELECT year(ngaysinh)
FROM sinhvien JOIN lop
ON sinhvien.malop=lop.malop
WHERE lop.tenlop='Toán K25')

SELECT hodem,ten
FROM sinhvien
WHERE NOT EXISTS(SELECT masv FROM diemthi
WHERE diemthi.masv=sinhvien.masv)

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 1/12

The sql query becomes faster if you


use the actual columns names in
SELECT statement instead of than '*'.
Using:
SELECT id, first_name, last_name, age,
subject FROM student_details;
Instead of:
 SELECT * FROM student_details;

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 2/12
 HAVING clause is used to filter the rows after all the
rows are selected. It is just like a filter. Do not use
HAVING clause for any other purposes.
Using:
SELECT subject, count(subject) FROM student_details
WHERE subject != 'Science'
AND subject != 'Maths'
GROUP BY subject;
Instead of:
SELECT subject, count(subject) FROM student_details
GROUP BY subject
HAVING subject!= 'Vancouver' AND subject!= 'Toronto';

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 3/12
 Sometimes you may have more than one subqueries in your
main query. Try to minimize the number of subquery block in
your query.

 Using:
SELECT name FROM employee
WHERE (salary, age) = (SELECT MAX (salary), MAX (age)
FROM employee_details) AND dept = 'Electronics';
Instead of:
SELECT name FROM employee
WHERE salary = (SELECT MAX(salary) FROM employee_details)
AND age = (SELECT MAX(age) FROM employee_details)
AND emp_dept = 'Electronics';

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 4.1/12

 Use operator EXISTS, IN and table


joins appropriately in your query.
a) Usually IN has the slowest
performance.
b) IN is efficient when most of the
filter criteria is in the sub-query.
c) EXISTS is efficient when most of
the filter criteria is in the main query.

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 4.2/12

Using:
Select * from product p
where EXISTS (select * from order_items
o
where o.product_id = p.product_id)
Instead of:
Select * from product p
where product_id IN
(select product_id from order_items )

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 5/12
 Use EXISTS instead of DISTINCT when using joins
which involves tables having one-to-many
relationship.
Using:
SELECT d.dept_id, d.dept
FROM dept d
WHERE EXISTS ( SELECT 'X' FROM employee e
WHERE e.dept = d.dept);
Instead of:
SELECT DISTINCT d.dept_id, d.dept
FROM dept d,employee e
WHERE e.dept = e.dept;

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 6/12
 Try to use UNION ALL in place of UNION
Using:
SELECT id, first_name FROM
student_details_class10
UNION ALL
SELECT id, first_name FROM sports_team;
Instead of:
SELECT id, first_name, subject FROM
student_details_class10
UNION
SELECT id, first_name FROM sports_team;
© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4
SQL Optimization Tips 7.1/12
 Be careful while using conditions in WHERE
clause.
Using:
SELECT id, first_name, age
FROM student_details
WHERE first_name LIKE 'Chan%';
Instead of:
SELECT id, first_name, age
FROM student_details
WHERE SUBSTR(first_name,1,3) = 'Cha';
© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4
SQL Optimization Tips 7.2/12

Using:
SELECT product_id, product_name
FROM product
WHERE unit_price BETWEEN MAX(unit_price)
and MIN(unit_price)
 Instead of:
SELECT product_id, product_name
FROM product
WHERE unit_price >= MAX(unit_price)
and unit_price <= MIN(unit_price)

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 7.3/12

Use non-column expression on one side of the


query because it will be processed earlier.
Using:
SELECT id, name, salary
FROM employee
WHERE salary < 25000;
Instead of:
SELECT id, name, salary
FROM employee
WHERE salary + 10000 < 35000;
© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4
SQL Optimization Tips 8/12
 Use DECODE to avoid the scanning of same rows or
joining the same table repetitively. DECODE can also
be made used in place of GROUP BY or ORDER BY
clause.
Using:
 SELECT id FROM employee
WHERE name LIKE 'Ramesh%'
and location = 'Bangalore';
 Instead of:
 SELECT DECODE(location,'Bangalore',id,NULL) id
FROM employee
WHERE name LIKE 'Ramesh%';

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 9/12
 To store large binary objects, first place
them in the file system and add the file
path in the database.

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 10/12
 To write queries which provide efficient
performance follow the general SQL
standard rules.
a) Use single case for all SQL verbs
b) Begin all SQL verbs on a new line
c) Separate all words with a single space
d) Right or left aligning verbs within the
initial SQL verb

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 11/12

Nhất thiết phải chỉ định item trong câu lệnh INSERT.
  Table-A
Key1  
   
CHAR(1)
Col1  
CHAR(1)
 ①  INSERT
Col2     INTO   Table-A   VALUES ( ‘1’ ,‘A’,‘X’ )
 ②  INSERT
CHAR(1)   INTO   Table-A  ( Key1,Col1,Col2 )
      VALUES ( ‘1’ ,‘A’,‘X’ )

  Cả ① và ② đều output ra kết quả giống nhau nhưng,


  ① là trường hợp số item trong Table-A tăng thì bị lỗi.
  ② là trường hợp số item trong Table-A tăng thì không bị lỗi.
⇒   Nhất định phải chỉ định item.

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4


SQL Optimization Tips 12.1/12

Hãy sử dụng mệnh đề ON cho điều kiện kết hợp


 
   Table-A Table-B
Key1   Key1  
CHAR(1) CHAR(1)
Col1   Col3  
CHAR(1) CHAR(1)
 ① 
Col2 SELECT
  A.Key1 , B.Col3
CHAR(1)
     FROM   Table-A   as   A   ,Table-B as B
     WHERE   A.Key1 = B.Key1
        AND   A.Col1   = ‘x’

 ②  SELECT A.Key1 , B.Col3


     FROM   Table-A   as   A  
     INNER JOIN   Table-B as B
       ON   A.Key1   = B.Key1
     WHERE   A.Col1   =‘x’

 
© ©FPT
FPTSOFTWARE
SOFTWARE– –TRAINING 41 – Internal use
TRAINING MATERIAL
MATERIAL 04e-BM/DT/HDCV/FSOFT
04e-BM/NS/HDCV/FSOFT v2/4
v2.2
SQL Optimization Tips 12.2/12

Ví dụ sử dụng mệnh đề ON
SQL không dùng mệnh đề ON SQL có sử dùng mệnh đề ON

SELECT A.Key1 , B.Col1 , C.Col2 SELECT A.Key1 , B.Col1 , C.Col2


FROM A-Table A FROM A-Table A
INNER JOIN B-Table B INNER JOIN B-Table B
INNER JOIN C-Table C ON A.Key1 = B.Key1
INNER JOIN C-Table C
WHERE A.Key1 = B.Key1 ON A.Key1 = C.Key1
AND A.Key1 = C.Key2 WHERE A.Col1 = '123'
AND A.Col1 = '123' AND B.Col2 like 'A%‘
AND B.Col2 like 'A%‘

Bảng thực hiện JOIN và các điều kiện Bảng thực hiện JOIN và các điều kiện
của nó bị tách ra nên khó đọc câu lệnh của nó ở cùng một chỗ thì sẽ dễ đọc câu
SQL . lệnh SQL.

© ©FPT
FPTSOFTWARE
SOFTWARE– –TRAINING 42 – Internal use
TRAINING MATERIAL
MATERIAL 04e-BM/DT/HDCV/FSOFT
04e-BM/NS/HDCV/FSOFT v2/4
v2.2
Q&A

Q&A

© FPT SOFTWARE – TRAINING MATERIAL – Internal use 04e-BM/NS/HDCV/FSOFT v2/4

You might also like