Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 12

Fast DB2/SQL and Practical with QMF for Windows—28.02.

2017
sql: structure query language

DML- data manipulation lang: selet,update,insert, delete, truncate


DDL- definition: create, alter
DCL – control

column: group by
scalar: case
DB2: IBM product

ERM AND ERD


each table contains data abaout a specific person or entity
The columns are the attribute of the entity
each row is a particular instance of the entity

Entity: table=department
Attribute: column
Instance of ENTITY: row

tables= entity
column= attribute
row= is a particular instance of an entity

index – is separately stored from the table like association

unique key can be also a mix between columns


primary key

delete vs drop
delete: eliminate the valus inside the table
drop: elimante the table

ACY

JOIN- Method to connect 2 tables

CREATE- syx.”create table DB2C.ACY0STAFF”

Data typ:

VARCHAR(9)- daca nu stim valoarea campului: nume---varying length—more then 254 bytes
SMALLINT: year id ---binary integer—16 Bit
INTEGER--
DECIMAL(7,2): sallary, comm
CHAR(5): job--- alphanumeric fix length—254 bytes
DecFloat- decimal floating point

1
Clause:
SELECT--- attributes
FROM which table---* all tables
WHERE—condition, fillter
ORDER BY
CRUD: CREATE , READ, UPDATE, DELETE

ID
NAME
DEPT
JOB
YEARS
SALARY
COMM

SELECT NAME, YEARS, SALARY


FROM DB2
WHERE DEPT = 38
WHERE DEPART (38,39)----- inlocuieste OR
WHERE NAME= ‘SANDERS’
WHERE COMM >=100
WHERE JOB <> ‘MGR’ ---- not equal
WHERE JOB != ‘MGR’—not equal
WHERE (JOB =”MGM” AND SALARY>1200) OR NAME= ‘SANDERS’
WHERE YEARS BETWEEN 9 AND 11
WHERE NAME LIKE ’G%’----only name that starts with G
WHERE NAME LIKE ‘%SON’----ends with SON
WHERE NAME LIKE ‘__’ ----numele care au doar 2 caractere LU
WHERE NAME LIKE ‘_R’--- all name that begin with any letter followed by R
WHERE NAME LIKE ‘%A%’—contains A in the mane
WHERE NAME LIKE ‘%’----fack condition

DENY USING NOT ---not recommender fro performenace

ORDER BY -----default ASC

DISTINCT—Show not duplicate rows

SELECT DISTINCTDEPT, JOB—the two column are treated as a single string


result

10 mario
20 mario
20 martin

SELECT ID, SALARY, SALARY+COMM


FROM DB2
WHERE DEPT = 20

suma +
minus -
divided /
inmultit *
SELECT ID , SALARY, COMM AS COMMISSION—rename the column in commission

2
so:
SALARY+COMM AS ‘TOTAL INCOME’

SELECT ID, SALARY, COMM AS COMMISSION, SALARY+COMM AS ‘TOTAL INCOME’


FROM DB2
WHERE DEPT = 20
ORDER BY ‘TOTAL INCOME’ DESC

SELECT NAME, SALARY+COMM


FROM DB2
WHERE SALARY+COMM>2000
ORDER BY 2 DESC----- salary+comm este in pozitia 2

QUERY 2 TBL

SELEC *
FROM DB2
WHERE JOB=’SALES’ AND ( COMM<250 OR COMM IS NULL)

WHERE job in (‘clerk’, ‘manager’ , ‘ analyst’)

SELECT TIPO, CAT, NUM, SUB, DT_REG,ATT_IMPORTO, OPER_TERM

Column function vs Scalar function


Column: SUM, AVG, MIN, MAX AND COUNT, STANDARD DEVIATION--- sum or aggregation of
values into a sg value
works on a column

scalar works only on a cell

SELECT SUM (SALARY), AVG(SALARY)


FROM DB2
WHERE DEPT=66

SO SELECT SALARY AND SUM(SALARY)--- NU SE POATE EXECTUTA SUNT COMENZI


CONTRADICTORII

IS OK
SELECT DEPT,SUM(SALARY) AS TOTAL_SALARY
FROM DB2
WHERE JOB<> ‘MGR’
GROUP BY DEPT

IS NOT OK
SELECT DEPT, JOB, YEARS
FROM DB2
WHERE JOB<>’MGR”
GROUP BY DEPT----- should be GROUP BY DEPT,JOB, YEARS

COUNT(*) --- count the no of rows that satisfy the where condition
COUNT(DISTINCT column name)

NULL values are omitted when SUM, MIN, MAX,AVG

3
COUNT considera NULL

GROUP BY DEPT

SELECT SUM(SALARY), SUM(COMM)


FROM DB2
WHERE JOB<> ‘MGR’
GROUP BY DEPT

EXAMPLES

SELECT AC01_CAT, AC01_NUM, AC01_SUB, AC01_DT_REG, AC01_ATT_IMPORTO,


AC01_OPER_TERM
FROM DB2C.ACY0TA01
WHERE AC01_DT_REG IN ('2013-10-31','2013-11-29 ' , '2013-12-31)

SELECT AC01_CAT, AC01_NUM, AC01_SUB, AC01_DT_REG, AC01_ATT_IMPORTO,


AC01_OPER_TERM
FROM DB2C.ACY0TA01
where AC01_DT_REG BETWEEN '2013-10-01' AND '2013-10-15' AND AC01_OPER_TERM LIKE '%WEB
%'

SELECT COUNT(*)
FROM DB2C.ACY0TA01
WHERE AC01_DT_REG >= '2013-10-01' AND AC01_OPER_TERM LIKE 'FIN%' AND
AC01_ATT_IMPORTO<>0

SELECT COUNT(DISTINCT AC01_DT_REG )


FROM DB2C.ACY0TA01
WHERE AC01_DT_REG >= '2013-10-01' AND AC01_OPER_TERM LIKE 'FIN%' AND
AC01_ATT_IMPORTO<>0

SELECT LASTNAME, HIREDATES


FROM DB2C.ACY0TA01
ORDER BY HIREDATE

SELECT AC01_TIPO, AC01_CAT, AC01_NUM, AC01_SUB, AC01_DT_REG, AC01_ATT_IMPORTO,


AC01_OPER_TERM,
AC01_ATT_IMPORTO,
AC01_IMPO,
DECIMAL (AC01_IMPO,17,1) AS INPUT
FROM DB2C.ACY0TA01
WHERE AC01_DT_REG BETWEEN '2013-10-01' AND '2013-11-30' AND AC01_OPER_TERM LIKE
'%WEB%' AND AC01_ATT_IMPORTO>0

SELECT
AC01_TIPO,
AC01_CAT,
AC01_NUM,

4
AC01_SUB,
AC01_DT_REG,
AC01_OPER_TERM,
AC01_ATT_IMPORTO AS "FIRST_AMOUNT",
AC01_IMPO AS "SECOND_AMOUNT",
DECIMAL (AC01_ATT_IMPORTO-AC01_IMPO,17,1) AS "DIFF"
FROM DB2C.ACY0TA01
WHERE AC01_DT_REG BETWEEN '2013-10-01' AND '2013-11-30' AND AC01_OPER_TERM LIKE
GROUP BY …HAVING

WHERE vs HAVING

WHERE is a group level IN,BETWEEN, LIKE, DISTINCT


HAVING at group level

SELECT….WHERE
GROUP BY…HAVING

SELECT DEPT, SUM(SALARY)


FROM DB2
GROUP BY DEPT
HAVING SUM(SALARY) >2000

CUM TREBUIE SCRISE CUM SUNT EXECUTATE


SELECT FROM
FROM WHERE
WHERE GROUP BY
GROUP BY HAVING
HAVING SELECT
ORDER BY ORDER BY

SCALAR FUNCTION

can be used in SELECT or in WHERE clause

SUBSTR, CONCAT, LENGTH, DECIMAL, INTEGER, DATE, TIME, TIMSTAMP

SUBSTR (DEPARTMENT, 1,4)—1 de unde citesti, 4 pana unde


EX: HEAD OFFICE- HEAD
WHERE SUBSTR (DIVISION,3) ‘stern’
EX: eastern

CONCAT ||
SELECT NAME || ‘HAS A JOB OF’ || JOB OF POSITION, SALARY
FROM DBORDER BY 1

Mario HAS A JOB OF clerck

COALESCE
Useful when we have NULL value
takes the first NOT NULL value in the argument list
SELECT ID, COALESCE(COMM, 0)

DECIMAL and INTEGER convert numeric data in decimal or integer format


digits converts numeric into character format. usful for using the SUBSTR and CONCAT
SELECT DECIMAL(SALARY,6,1), INTEGER(SALARY)
DECIMAL(p,s) - precision, s- scale

current date-- today

5
current time--- now
current timestamp—current date and current time that are converted in timestamp

DATE yyymmdd
TIME hhmmss
TIMESTAMP yyymmddhhmmssmm
DATE date-date= date duration
clumn function like: min , max opr count can be used with DATA/TIME

Fast DB2/SQL and Practical with QMF for Windows—01.03.2017


DML:SELECT, UPDATE, INSERT, DELETE, MERGE, TRUNCATE
DDL:CREATE, ALTER(modify), DROP
DCL: GRANT, REVOKE

DAY(expersion)

SELECT
AC01_TIPO,
AC01_CAT,
AC01_NUM,
AC01_SUB,
AC01_DT_REG,
AC01_OPER_TERM,
AC01_ATT_IMPORTO,
CURRENT DATE AS Today,
CURRENT DATE- AC01_DT_REG as "DURATION"
FROM DB2C.ACY0TA01
WHERE AC01_DT_REG BETWEEN '2013-10-01' AND '2013-11-30' AND AC01_OPER_TERM LIKE
'%WEB%' AND AC01_ATT_IMPORTO>0

2013-11-07 vs 2017-03-01

30324 : 3 years, 3 months and 24 days

24 diferenta in zile dinte

SELECT
AC01_CAT,
DECIMAL (MAX (AC01_ATT_IMPORTO),17,2) AS MAX,
DECIMAL (MIN (AC01_ATT_IMPORTO),17,2) AS MIN,
DECIMAL (AVG (AC01_ATT_IMPORTO),17,2) AS AVG
FROM DB2C.ACY0TA01
WHERE AC01_DT_REG >='2013-01-01' AND AC01_OPER_TERM LIKE '%WEB%' AND
AC01_ATT_IMPORTO<>0
GROUP BY AC01_CAT

trebuie sa avem aceleasi tabele in SELECT si in GROUP BY

SELECT
AC01_SUB,
DECIMAL (MAX (AC01_ATT_IMPORTO),17,2) AS MAX,
DECIMAL (MIN (AC01_ATT_IMPORTO),17,2) AS MIN,
DECIMAL (AVG (AC01_ATT_IMPORTO),17,2) AS AVG
FROM DB2C.ACY0TA01

6
WHERE AC01_DT_REG >='2013-01-01' AND AC01_OPER_TERM LIKE '%WEB%' AND
AC01_ATT_IMPORTO<>0
GROUP BY AC01_SUB
HAVING AVG (AC01_ATT_IMPORTO)>2000

HAVING works only at group level—so we need avg

CASE

is applied to SELECT

WHEN… THEN… AS
or
WHEN… THEN… ELSE --- cand nu avem valorile prestabilite in CASE clause

SELECT EVENTDATE, EVENTNAME, COUNTRYID


CASE
WHEN COUNTRYID=18 THEN 'US'
WHEN COUNTRYID=17 THEN 'UK'
ELSE 'SOMEWHERE ELSE'
END AS TYPE OF EVENT

JOIN Operation on Tables

SELECT NAME, DEPTNAME


FROM DB2, DB3
WHERE NAME=’SANDERS’
AND DEPT =DEPTNUMB

join predicate---- connect the two table dept =deptnumb


min join predicate are n-1 ( where n is the no of tables)

when we have problems with the same name in two or more tables

select name , deptname


from db2 , db3
where dept=dept

solution is to assign an alias to the tbl


FROM DB2 S,
DB3 O
WHERE S DPT, O DPET

INNER JOIN ..ON

- select comunn data

SELECT NAME, DEPTNAME


FROM DB2 S,
INNER JOIN DB3 O
ON S.DEPT=O.DPT
WHERE NAME=’SANDERS’

7
outer join
Left
column data from both tbl but also the rows of the first tbl
SELECT
FROM DB2 S, LEFT OUTER JOIN DB3 O
ON S.KEY=O.KEY

right

column data from both tbl but also the rows of the second tbl
SELECT D.DEPTNAME, E. LASTNAME
FROM ACY0EMPLOYEE E, INNER JOIN ACY0DEPARTMENT D
ON E.WORKDEPT=D.DEPTNO
WHERE E.JOB =’Manager’

index table

SELECT
E. LASTNAME,
E.FIRSTNAME,
D. DEPTNAME
FROM ACY0EMPLOYEE E,
INNER JOIN ACY0DEPARTMENT.D
ON E.WORKDEPT=D.DEPTNO
ORDER BY D.DEPTNAME,
E.LASTNAME,
E.FIRSTNAME

SELECT
E.LASTNAME,
E.FIRSTNME,
D.DEPTNAME,
E.JOB
FROM DB2C.ACY0EMPLOYEE E
INNER JOIN DB2C.ACY0DEPARTMENT D
ON E.WORKDEPT=D.DEPTNO
where E.worKDEPT between 'A02' AND 'D22' and e.job<>'Manager'
ORDER BY D.DEPTNAME,
E.LASTNAME,
E.FIRSTNME,
E.JOB

SELECT
D.DEPTNAME,
E.LASTNAME,
E.FIRSTNME
FROM DB2C.ACY0EMPLOYEE E
INNER JOIN DB2C.ACY0DEPARTMENT D
on E.EMPNO=D.MGRNO
ORDER BY D.DEPTNAME,
E.LASTNAME,
E.FIRSTNME

8
Fast DB2/SQL and Practical with QMF for Windows—02.03.2017

CASE

SELECT ID, NAME,


CASE JOB
WHEN ‘MGR’ THEN ‘MANAGER’
WHEN ‘SALES’ THEN ‘SALES REPRESENTATIVE’
ELSE ‘INVALID VALUE’
END
FROM DB2

Cartesian product
SELECT NAME, DEPTNAME,
FROM STAFF,ORG

correlation name---- renaming the table for the ones that have commune attribute

UNION
works with multiple select
the two tbl that are merged needs to have the same no of columns

SELECT A,B
FROM DB2
FROM A2=’Z’
UNION
SELECT B3,B4+B2
FROM DB3
WHERE B1>’N’
ORDER BY 2

UNION ALL

not delete the duplicates

EXCEPT
the rows that are present into the first tbl and not present into seconf tbl ( also known as
minus command)
INTERSECT
only the rows present into both tbls

SUBQUERY
queries executed into other SELECT,
can be executed into WHERE, HAVING OR FROM ( to create a new table for our analysis)
SELECT
MAX(SALARY) AS MAX

9
SELECT NAME, SALARY
FROM DB2
WHERE SALARY = ( SELECT MAX(SALARY)
FROM DB2)

ANY, IN , ALL

select name
from staf
where salary< all(select avg(salary)
from staf
group by dept
order by name

1. SELECT THE NAME AND THE JOB TITELS OF ALL EMPLOYESS WITH THE SAME JOB
AS JONES.

SELECT LASTNAME, JOB


FROM DB2C. ACY0EMPLOYEE
WHERE JOB = ( SELECT JOB
FROM DB2C. ACY0EMPLOYEE
WHERE LASTNAME='JONES')

2. select the name of the employee whose salary is the lowest


SELECT LASTNAME
FROM DB2C. ACY0EMPLOYEE
WHERE salary = ( SELECT min (salary)
FROM DB2C. ACY0EMPLOYEE)

3, THE NAME, SALARY AND WORKDEPT OF THE EMPLOYEE THAT HAS THE SALLARY HIGHEST
THEN THE AVG SALARY OF ALL DEPARTMENT

SELECT LASTNAME, salary, workdept


FROM DB2C. ACY0EMPLOYEE
WHERE salary >all ( SELECT avg (salary)
FROM DB2C. ACY0EMPLOYEE
GROUP BY WORKDEPT)

4. THE NAME, SALARY AND WORKDEPT of the employee whose salary is higher than the avg salary
of any department

SELECT LASTNAME,salary, workdept


FROM DB2C. ACY0EMPLOYEE
WHERE salary >any ( SELECT avg (salary)
FROM DB2C. ACY0EMPLOYEE
GROUP BY WORKDEPT)

5.
SELECT LASTNAME,EMPNO
FROM DB2C. ACY0EMPLOYEE
WHERE EMPNO IN ( SELECT DISTINCT EMPNO
FROM DB2C. ACY0EMPLOYEE
INNER JOIN DB2C.ACY0DEPARTMENT
ON WORKDEPT=DEPTNO
WHERE JOB = 'SALESMAN' OR JOB =' MANAGER')

10
6. DISPLAY THE NAME OF ALL EMPLOYEES OF THE SAME DEPARTMENT WHOSE
LOCATION IS NEW YORK

SELECT LASTNAME
FROM DB2C. ACY0EMPLOYEE
WHERE WORKDEPT = ( SELECT WORKDEPT
FROM DB2C. ACY0EMPLOYEE
INNER JOIN DB2C.ACY0DEPARTMENT
ON WORKDEPT=DEPTNO
WHERE LOCATION = 'NEW YORK')

CREATION AND MANAGEMENT –DDL

CREATE TABLE DB2C,


(ID SMALLINT NOT NULL,
NAME VARCHAR(9) NOT NULL,
DEPT SMALLINT ,

NOT NULL DEFAULT-1

NOT NULL WITH DEFAULT

CHART default is space


integer default is zero
check (job in( ‘nord’ , ‘south’)

ALTER change the structure of a table


CREATE VIEW : is not populated , stay inactive until is first time used
insert – insert row

insert into db2


values (‘mama’, ‘ ‘ )

insert into db2 (deptno, projno, projname)


values (‘b01’, ‘ma0’, ‘ma8’)

TRUNCATE – quick deletion of all rows

CREATION AND MANAGEMENT DATA – DCL

select * from db2c.acy0ta15


where ac15_tipo=’aa’
and ac15_userid = ‘UQ00788’

insert into db2c.acy0ta15


(ac15_tipo, ac15_rap, ac15_torre, ac15_userid)
values (‘aa’, 101, ‘xx’, ‘uq00788”)

11
update db2c.acy0ta15
set ac15_torre =’yy’
where ac15_tipo=’aa’ and ac15_rap=101
and ac15_userid=’uq00788’

delete from db2c.acy0ta15


where ac15_tipo = ‘aa’
and ac15_rap = 101 and ac15_torre =’yy’
and ac15_userid=’uq00788’
group by cat
total

SELECT AC16_TIP,
AC16_CAT,
AC16_NUM,
AC16_IMPO_EROG
FROM ACY0TA16
WHERE C16_CAT= 0 AS ‘A’
union
SELECT AC16_TIP,
AC16_CAT,
AC16_NUM,
AC16_IMPO_EROG
FROM ACY0TA16
WHERE C16_CAT= 6 as ‘B’
GROUP BY
AC16_TIP,
AC16_CAT,
HAVING SUM (AC16_NUM) AS Total A

SUM (AC16_IMPO_EROG) as Total B

12

You might also like