0% found this document useful (0 votes)
2 views28 pages

sql_Day2

The document provides an overview of SQL statements categorized into five types: DQL, DDL, DML, TCL, and DCL, with a focus on Data Query Language (DQL) and its components such as SELECT, PROJECTION, SELECTION, and JOIN. It includes syntax examples for various SQL queries, the use of DISTINCT to remove duplicates, and explanations of expressions and aliases. Additionally, it covers the WHERE clause for filtering records, ORDER BY clause for sorting results, and logical operators for combining conditions in queries.

Uploaded by

rapakareehanth
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views28 pages

sql_Day2

The document provides an overview of SQL statements categorized into five types: DQL, DDL, DML, TCL, and DCL, with a focus on Data Query Language (DQL) and its components such as SELECT, PROJECTION, SELECTION, and JOIN. It includes syntax examples for various SQL queries, the use of DISTINCT to remove duplicates, and explanations of expressions and aliases. Additionally, it covers the WHERE clause for filtering records, ORDER BY clause for sorting results, and logical operators for combining conditions in queries.

Uploaded by

rapakareehanth
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 28

SQL-Day 2

“We are one step closer to our Goal”


( SQL – SUBLANGUAGES/ SQL COMMANDS/ SATATEMENTS )

OVERVIEW OF SQL STATEMENTS :


1. DATA QUERY LANGUAGE ( DQL ) ---- SELECT

2. DATA DEFINITION LANGUAGE ( DDL ) ---CREATE / ALTER / RENAME / TRUNCATE/DROP


3. DATA MANIPULATION LANGUAGE ( DML )– INSERT / UPDATE / DELETE
4. TRANSCATION CONTROL LANGUAGE ( TCL ) – ROLLBACK / COMMIT / SAVEPOINT
5. DATA CONTROL LANGUAGE ( DCL ) --- GRANT , REVOKE

DATA QUERY LANGUAGE ( DQL _) :


" DQL is used to Retrieve OR Fetch the data from the database " . It had 4 statements :
1. SELECT
2. PROJECTION
3. SELECTION
4. JOINS

1. SELECT : "It is used to retrieve the data from the table and display it.
2. PROJECTION : "It is a process of retrieving the data by selecting only the columns is known as Projection "
.
➢ In projection all the records / values present in a particular column are by default selected .
3. SELECTION : "It is a process of retrieving the data by selecting both the columns and rows is known as
Selection " .
4. JOIN :"It is a process of retrieving the data from Multiple tables
simultaneously is known as Join " .
PROJECTION
➢ "It is a process of retrieving the data by selecting only the columns is known as
Projection " .
➢ In projection all the records / values present in a particular column are by default selected
.

SYNTAX ( QUERY ):
NOTE :
SELECT * / [DISTINCT] Column_Name / Expression [ALIAS]
➢ FROM Clause starts the execution .
FROM Table_Name ; ➢ For FROM Clause we can pass Table_Name as an
argument .
ORDER OF EXECUTION ➢ The job of FROM Clause is to go to the Database
and search for the table and put the table under
1. FROM Clause execution .
2. SELECT Clause ( From and Select ---clause / statement/ keywords) ➢ SELECT Clause will execute after the execution of
FROM Clause
➢ For SELECT Clause we pass 3 arguments
Example : Write a query to display names of all the students . ⬥ *
⬥ Column_Name
DATABASE ⬥ Expression
SELECT SNAME ➢ The job of SELECT Clause is to go the table under
Student
FROM STUDENT ; execution and select the columns mentioned .
➢ SELECT Clause is responsible for preparing the
result table .
Output of FROM Clause
Output of SELECT Clause ➢ Asterisk(*) : it means to select all the columns from
Student the table .
SID SNAME BRANCH PER SNAME ➢ Semicolon (;) : it means end of the query .
1 A ECE 60 A
2 B CSE 75 B
3 C ME 50 C
4 D ECE 80 D
5 C CSE 75 C
6 E CIVIL 95 E
Practice Session

➢ WAQTD student id and student names for all the students.

SELECT SID , SNAME


FROM STUDENT ;

➢ WAQTD name and branch of all the students .

SELECT SNAME , BRANCH


FROM STUDENT ;

➢ WAQTD NAME , BRANCH AND PERCENTAGE FOR ALL THE


STUDENTS .

SELECT SNAME , BRANCH , PER


FROM STUDENT ;

➢ WAQTD details of all the students from students table .

SELECT *
FROM STUDENT ;
➢ WAQTD sname , sid , per , branch of all the students .

SELECT SNAME , SID , PER , BRANCH


FROM STUDENT ;
EMP Table :

➢ WAQTD name salary and commission given to all the employees .

Select ename , sal , comm


From emp ;

➢ WAQTD name of the employee along with their date of joining .

Select ename , hiredate


From emp ;
QUESTIONS ON EMP AND DEPT TABLE:
1.WRITE A QUERY TO DISPLAY ALL THE DETAILS
FROM THE EMPLOYEE TABLE.

2. WAQTD NAMES OF ALL THE EMPLOYEES.

3.WAQTD NAME AND SALARY GIVEN TO ALL THE EMPLOYEES.


4.WAQTD NAME AND COMMISSION GIVEN TO ALL THE EMPLOYEES.
5.WAQTD EMPLOYEE ID AND DEPARTMENT NUMBER OF ALL THE EMPLOYEES IN EMP
TABLE.
6.WAQTD ENAME AND HIREDATE OF ALL THE EMPLOYEES .

7.WAQTD NAME AND DESIGNATION OF ALL THE EMPLPOYEES .


8.WAQTD NAME , JOB AND SALARY GIVEN ALL THE EMPLOYEES.
9.WAQTD DNAMES PRESENT IN DEPARTMENT TABLE.
10.WAQTD DNAME AND LOCATION PRESENT IN DEPT TABLE.
DISTINCT Clause
" It is used to remove the duplicate or repeated values from the Result table " .

Note : It should be used before the column name.

Example : ➢ SELECT DISTINCT BRANCH


➢ SELECT DISTINCT SNAME FROM STUDENT ;
Student FROM STUDENT ;
SID SNAME BRANCH PER BRANCH
1 A ECE 60 SNAME BRANCH
SNAME ECE
2 B CSE 75 A ECE
A CSE
3 C ME 50 B CSE
B ME
4 D ECE 80 C ME
C ECE
5 C CSE 75 D CIVIL
D CSE
6 E CIVIL 95 C
E CIVIL
E
EXPRESSION
"A statement which gives result is known as Expression ".
Expression is a combination Operand and Operator .
Operand : These are the values that we pass .

Operator : These are the Symbols which perform some


Operation on The Operand .
5 AND 10 ARE OPERAND. (*) IS CALLED OPERATOR
Example : 5 * 10

EMP
EID ENAME SAL
1 A 100
2 B 200
2 C 100
1. WAQTD name and salary given to the employees .
SELECT ENAME , SAL FROM EMP ;

2. WAQTD name and annual salary of the employees . SELECT


ENAME , SAL * 12
3. FROM EMP ;

ENAME SAL*12
A 1200
B 2400
C 1200

4. WAQTD all the details of the employee along with annual salary
Select eid, ename, sal, sal*12
From emp ;

Select
From emp ;

5. WAQTD name and salary with a hike of 20% . Select ename , Sal +
Sal*20/100
From emp ;

Formulae to calculate percentage :

Sal + Sal * a / 100 Sal * 1.a


ALIAS

"It is an alternate name Which is used to get the user convenient output" .
○ as keyword is used to apply the “alias” and it is optional.
○ Alias can be applied only for the columns in the output, but not in the
table.
○ If the alias contains any special characters, we should used with in double
quotes.
○ Keywords of sql can be used as alias with double quotes.

Example 1 :

Select sal*12 as annsal


From emp;

Example 2:

Select ename as empname


From emp;

Example 3

SELECT SAL*0.25 AS "SELECT" FROM EMP;


Example 4 :

Select comM*12 as anncom


From emp;

Example 5:

select sal*6 as halfsal,comm*6 as halfcomm from


emp;

Example 6

Select sal+1000 as salincrease


From emp;
SELECTION :
"It is a process of fetching all the columns or particular
columns along with a particular rows form the table is called
as “Selection”.
SYNTAX :
SELECT * / [DISTINCT] Column_Name / Expression [ALIAS]
FROM Table_Name
WHERE <Filter_Condition> ;

Condition →LHS (operators) RHS


ORDER OF EXECUTION
1. FROM
2. WHERE
3. SELECT

WHERE Clause

❖ "Where clause is used to filter the records of the table ".

❖ Where clause will check the condition for each and every row in the table ( row-by
– row execution )

❖ If the condition is true, the record will be selected.

❖ If the condition is false the will be rejected.

Example :

➢ WAQTD names of the employees working in dept 20 .


➢ WAQTD names of the employees getting salary More than 300 .
SELECT ENAME, SAL FROM EMP
WHERE SAL > 300 ;

➢WAQTD names and salary of the employees working in dept 10.


SELECT ENAME , SAL FROM EMP
WHERE DEPTNO = 10 ;
➢ WAQTD all the details of the employees whose salary is
Less than 1000 rupees .
SELECT * FROM EMP
WHERE SAL < 1000 ;
➢ WAQTD name and hiredate of an employee hired on '09-JUN-1981'
SELECT ENAME ,HIREDATE FROM EMP
WHERE H I R E DATE = '09-JUN-1981' ;
➢ WAQTD details of the employee whose name is 'Miller’

➢ SELECT *
FROM EMP
WHERE ENAME ='MILLER' ;
➢ WAQTD details of the employee hired after '01-JAN-1982’

➢ SELECT *
FROM EMP
WHERE HIREDATE > '01-JAN-1982' ;
➢ WAQTD name sal and hiredate of the employees who were
Hired before 1985 .

SELECT ENAME , SAL , HIREDATE FROM


EMP
WHERE HIREDATE < '01-JAN-1985' ;

➢ WAQTD name sal and hiredate of the employees who were


Hired after 1985 .

SELECT ENAME , SAL , HIREDATE FROM


EMP
WHERE HIREDATE > '31-DEC-1985' ;

➢ WAQTD name of the employees who was hired on Valentine's


day 2020 .
SELECT ENAME FROM EMP
WHERE HIREDATE = '14-FEB-2020' ;
ASSIGNMENT ON WHERE CLAUSE .

1.WAQTD THE ANNUAL SALARY OF THE EMPLOYEE WHOS NAME IS SMITH

2.WAQTD NAME OF THE EMPLOYEES WORKING AS CLERK

3.WAQTD SALARY OF THE EMPLOYEES WHO ARE WORKING AS SALESMAN

4.WAQTD DETAILS OF THE EMP WHO EARNS MORE THAN 2000

5.WAQTD DETAILS OF THE EMP WHOS NAME IS JONES

6.WAQTD DETAILS OF THE EMP WHO WAS HIRED AFTER 01-JAN-81

7.WAQTD NAME AND SAL ALONG WITH HIS ANNUAL SALARY IF THE ANNUAL
SALARY IS MORE THAN 12000

8.WAQTD EMPNO OF THE EMPLOYEES WHO ARE WORKING IN DEPT 30

9.WAQTD ENAME AND HIREDATE IF THEY ARE HIRED BEFORE 1981

10.WAQTD DETAILS OF THE EMPLOYEES WORKING AS MANAGER


Order by clause
➢ It is used to arrange the data in ascending WAQTD SAL VALUES IN A ACCENDING ORDER
order or descending order. SELECT SAL
FROM EMP
➢ Order by clause will sort the data only in
ORDER BY SAL ASC;
the output but not in the table.
➢ It is the last clause in a query. WAQTD COMM VALUES IN A DESCENDING ORDER
SELECT COMM
➢ It is always executed in the end. FROM EMP
ORDER BY COMM DESC;
➢ asc keyword is optional.

Syntax : 3.) select */ columns


1.) from table name
2.) where condition
4.) order by Colum name asc / des;
OPERATORS IN SQL
CONCATENATION Operator :
1. ARITHEMATIC OPERATORS :- ( + , - , * , / )
2.CONCATENATION OPERATOR :- ( || ) " It is used to join the strings ".
3.COMPARISION OPERATORS :- ( = , != or <> ) Symbol : ||
4.RELATIONAL OPERATOR :- ( > , < , >= , <= )
5.LOGICAL OP : ( AND , OR , NOT )
6.SPECIAL OPERATOR :- Example : SELECT ENAME
FROM EMP
1. IN WHERE JOB ='MANAGER' ;
2.NOT IN
3.BETWEEN Ename
4.NOT BETWEEN ALLEN
5.IS MARTIN
6.IS NOT
SMITH
7.LIKE
8.NOT LIKE SELECT 'Hi ' || ename
7.SUBQUERY OPERATORS:- FROM EMP
1. ALL WHERE JOB ='MANAGER' ;
2.ANY
3.EXISTS Ename
4.NOT EXISTS Hi ALLEN
Hi MARTIN
Hi SMITH
➢ WAQTD name and deptno of the employees hired After '01-JAN-87' . 3. WAQTD name , deptno , salary of the employee working in dept
20 and earning less than 3000 .
SELECT ENAME , DEPTNO FROM EMP SELECT ENAME, DEPTNO , SAL FROM EMP
WHERE HIREDATE > '01-JAN-1987' ; WHERE DEPTNO = 20 AND SAL < 3000 ;
4. WAQTD name and salary of the employee if emp earns More than
➢ WAQTD name and hire date of the employees hired before 31-JUL-88 1250 but less than 3000 .
SELECT ENAME , SAL FROM EMP
SELECT ENAME , HIREDATE FROM EMP WHERE SAL > 1250 AND SAL < 3000 ;
WHERE HIREDATE < '31-JUL-88' ;
5. WAQTD name and deptno of the employees if the works in dept 10
or 20 .
LOGICAL OPERATORS IT IS USED TO WRITE MULTIPLE CONDITION IN THE WHERE CLAUSE.
SELECT ENAME , DEPTNO FROM EMP
1. AND WHERE DEPTNO = 10 OR DEPTNO = 20 ;
2. OR
3. NOT 6. WAQTD name and sal and deptno of the employees
If emp gets more than 1250 but less than 4000 and works in dept 20 .
We use logical operators to write multiple conditions .
SELECT ENAME , SAL , DEPTNO FROM EMP
1. WAQTD name and deptno along with job for the WHERE SAL > 1250 AND SAL < 4000 AND DEPTNO
employee working in dept 10 . =20 ;

SELECT ENAME , DEPTNO , JOB 7. WAQTD name , job , deptno of the employees working as a manager in dept 10 or
FROM EMP 30 .
WHERE DEPTNO = 10 ;
SELECT ENAME , JOB , DEPTNO FROM EMP
2. WAQTD name and deptno along with job for the WHERE JOB ='MANAGER' AND ( DEPTNO = 10 OR DEPTNO = 20 ) ;
employee working as manager in dept 10 .
8. WAQTD name , deptno , job of the employees working in dept 10 or 20 or 30 as a
SELECT ENAME , DEPTNO , JOB clerk .
FROM EMP
WHERE JOB ='MANAGER' AND DEPTNO = 10 ; SELECT ENAME , JOB , DEPTNO FROM EMP
WHERE JOB ='CLERK' AND ( DEPTNO = 10 OR DEPTNO = 20 AND
DEPTNO = 30 ) ;
ASSIGNMENT ON LOGICAL OPERATORS :

1.WAQTD DETAILS OF THE EMPLOYEES WORKING AS CLERK AND EARNING LESS THAN 1500
2.WAQTD NAME AND HIREDATE OF THE EMPLOYEES WORKING AS MANAGER IN DEPT 30

3.WAQTD DETAILS OF THE EMP ALONG WITH ANNUAL SALARY IF THEY ARE WORKING IN DEPT 30 AS SALESMAN
AND THEIR ANNUAL SALARY HAS TO BE GREATER THAN 14000.
4.WAQTD ALL THE DETAILS OF THE EMP WORKING IN DEPT 30 OR AS ANALYST
5.WAQTD NAMES OF THE EMPMLOYEES WHOS SALARY IS LESS THAN 1100 AND THEIR DESIGNATION IS CLERK

6.WAQTD NAME AND SAL , ANNUAL SAL AND DEPTNO IF DEPTNO IS 20 EARNING MORE THAN 1100 AND ANNUAL
SALARY EXCEEDS 12000
7.WAQTD EMPNO AND NAMES OF THE EMPLOYEES WORKING AS MANAGER IN DEPT 20
8.WAQTD DETAILS OF EMPLOYEES WORKING IN DEPT 20 OR 30 .
9.WAQTD DETAILS OF EMPLOYEES WORKING AS ANALYST IN DEPT 10 .
10.WAQTD DETAILS OF EMPLOYEE WORKING AS PRESIDENT WITH SALARY OF RUPEES 4000
SPECIAL OPERATORS :
2. NOT IN : It is a multi-valued operator which can accept
1. IN
2. NOT IN multiple values At the RHS . It is similar to IN op instead of
3. BETWEEN selecting it Rejects the values .
4. NOT BETWEEN
5. IS
6. IS NOT Syntax: Column_Name / Exp NOT IN ( v1 , v2 , . . vn )
7. LIKE
8. NOT LIKE
Example :
1. IN : It is a multi-valued operator which can accept
SELECT ENAME , DEPTNO FROM EMP
multiple values At the RHS . WHERE DEPTNO = 20 AND
JOB NOT IN ( 'CLERK' ,'MANAGER' ) ;
Syntax: Column_Name / Exp IN ( v1 , v2 , . . Vn )

Example :

➢ WAQTD name and deptno of the employees working in


dept 10 or 30 .

SELECT ENAME , DEPTNO


FROM EMP
WHERE DEPTNO = 10 OR DEPTNO = 30 ;

SELECT ENAME , DEPTNO


FROM EMP
WHERE DEPTNO IN ( 10 , 30 ) ;

➢ WAQTD name and job of the employee working as a


clerk or manager Or salesman .

SELECT ENAME , JOB


FROM EMP
WHERE JOB IN ('CLERK' , 'MANAGER' ,
'SALESMAN' ) ;
3.) BETWEEN : "It is used whenever we have range of values "
4. NOT BETWEEN : It is Opposite of Between .
[ Start value and Stop Value ] .

Syntax: Syntax:
Column_Name BETWEEN Lower_Range AND Higher_Range ;
Column_Name NOT BETWEEN Lower_Range AND Higher_Range ;
Between Op works including the range .
Example :
Example :
➢ WAQTD name and salary of the employees if the emp is not
➢ WAQTD name and salary of the employees if the emp is earning earning Salary in the range 1000 to 3000 .
Salary in the range 1000 to 3000 .
SELECT ENAME , SAL
SELECT ENAME , SAL FROM EMP
FROM EMP WHERE SAL NOT BETWEEN 1000 AND 3000 ;
WHERE SAL BETWEEN 1000 AND 3000 ;
➢ WAQTD name and deptno of the employees working in dept 10
➢ WAQTD name and deptno of the employees working in dept 10 And not hired during 2019 .
And hired during 2019 (the entire year of 2019) .
SELECT ENAME , DEPTNO
SELECT ENAME , DEPTNO FROM EMP
FROM EMP WHERE DEPTNO = 10 AND HIREDATE NOT BETWEEN '01-
WHERE DEPTNO = 10 AND HIREDATE BETWEEN '01- JAN-2019' AND '31-DEC-2019' ;
JAN-2019' AND '31-DEC-2019' ;
➢ WAQTD name , sal and hiredate of the employees who were not
➢ WAQTD name , sal and hiredate of the employees hired during
hired during 2017 into dept 20 with a salary greater that 2000 .
2017 into dept 20 with a salary greater that 2000 .
SELECT ENAME , SAL , HIREDATE
SELECT ENAME , SAL , HIREDATE
FROM EMP
FROM EMP
WHERE DEPTNO = 20 AND SAL> 2000 AND HIREDATE WHERE DEPTNO = 20 AND SAL> 2000 AND HIREDATE NOT
BETWEEN '01-JAN2017' AND 31-DEC-2017' ;
BETWEEN '01-JAN2017' AND 31-DEC-2017' ;
5. IS : "It is used to compare only NULL " 6. IS NOT : "It is used to compare the values with NOT NULL ".

Syntax: Column_Name IS NULL ; Syntax: Column_Name IS NOT NULL ;

Example : Example :
➢ WAQTD name of the employee who is getting salary .
EID ENAME SAL COMM
1 A 1000 100 SELECT ENAME
2 B null null FROM EMP
3 C null 200 WHERE SAL IS NOT NULL ;
4 D 2000 null ➢ WAQTD name of the emp who gets commission .

➢ WAQTD name of the employee who is not getting salary . SELECT ENAME
FROM EMP
SELECT ENAME WHERE COMM IS NOT NULL ;
FROM EMP
WHERE SAL IS NULL ; ➢ WAQTD name , sal and comm of the emp if the emp doesn’t earn
commission but gets salary .
➢ WAQTD name of the emp who doesn’t get commission .
SELECT ENAME , SAL , COMM
SELECT ENAME FROM EMP
FROM EMP WHERE COMM IS NULL AND SAL IS NOT NULL ;
WHERE COMM IS NULL ;

➢ WAQTD name , sal and comm of the emp if the emp doesn’t earn
both .

SELECT ENAME , SAL , COMM


FROM EMP
WHERE COMM IS NULL AND SAL IS NULL ;
7. LIKE : "It is used for Pattern Matching ". WHERE ENAME LIKE '%S%' ;

To achieve pattern matching we use special characters . ➢ WAQTD names that starts with 'J' and ends with 'S' .
➢ Percentile (%)
➢ Underscore ( _ ) SELECT ENAME
FROM EMP
Syntax: Column_Name LIKE 'pattern' ; WHERE ENAME LIKE 'J%S' ;

Example : ➢ WAQTD names of the employee if the emp has char 'A' as his
second character .
➢ WAQTD details of an employee whose name is SMITH .
SELECT ENAME
SELECT * FROM EMP
FROM EMP WHERE ENAME LIKE '_A%' ;
WHERE ENAME ='SMITH' ;
➢ WAQTD names of the employee if the emp has char 'A' as his Third
➢ WAQTD details of the employee who's name starts with 'S' . character .

SELECT * SELECT ENAME


FROM EMP FROM EMP
WHERE ENAME LIKE 'S%' ; WHERE ENAME LIKE ' A%' ;

➢ WAQTD details of the employee who's name ends with 'S' . ➢ WAQTD names of the employee if the emp has char 'A' as his
second character and 'S' is last character .
SELECT *
FROM EMP SELECT ENAME
WHERE ENAME LIKE '%S' ; FROM EMP
WHERE ENAME LIKE '_A%S' ;
➢ WAQTD names of the employees who have character 'S' in their names
. ➢ WAQTD names of the employee if the emp has char 'A' present at at
least 2 times .
SELECT * FROM
EMP SELECT ENAME
FROM EMP
WHERE ENAME LIKE '%A%A%' ;
➢ WAQTD names of the employee if the emp's salary's last 2 digit is 50 rupees .

SELECT ENAME
FROM EMP
WHERE SAL LIKE '%50' ;

ASSIGNMENT ON SEPCIAL OPERATORS :

1) LIST ALL THE EMPLOYEES WHOSE COMMISSION IS NULL


2)LIST ALL THE EMPLOYEES WHO DON’T HAVE A REPORTING MANAGER
3)LIST ALL THE SALESMEN IN DEPT 30
4)LIST ALL THE SALESMEN IN DEPT NUMBER 30 AND HAVING SALARY
GREATER THAN 1500
5)LIST ALL THE EMPLOYEES WHOSE NAME STARTS WITH ‘S’ OR ‘A’
6)LIST ALL THE EMPLOYEES EXCEPT THOSE WHO ARE WORKING IN DEPT 10
& 20.
7) LIST THE EMPLOYEES WHOSE NAME DOES NOT START WITH ‘S’
8)LIST ALL THE EMPLOYEES WHO ARE HAVING REPORTING
MANAGERS IN DEPT 10
9)LIST ALL THE EMPLOYEES WHOSE COMMISSION IS NULL AND WORKING
AS CLERK
10)LIST ALL THE EMPLOYEES WHO DON’T HAVE A REPORTING MANAGER
IN DEPTNO 10 OR 30
Thank You

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy