SQL Udemy
SQL Udemy
- Data integrity
- Can handle massive amounts of data
- Quickly combine different datasets
- Automate steps for re-use
- Can support data for websites and applications
Use count:
Where
Order by
LIMIT
Between:
The BETWEEN operator can be used to match a value against a range of values:
Value between low and high
select * from country where country_id between 5 and 15;
IN
We can use the IN operator to create a condition that checks to see if a value in included in a
list of multiple options.
Select colour From table WHERE colour IN(‘red’,’blue’)
select * from payment where customer_id in(341,342 );
select * from payment where amount in(0.99,1.98,1.98);
Like operator allows us to perform pattern matching against string data with the use of
wildcard characters:
- Percent%
Matches any sequence of characters
Underscore_
- Matches any single character
All names begin with an ‘A’ : where name LIKE ‘A%’
All names that end with an ‘a’: Where name LIKE ‘%a”
_____ that LIKE is case-sensitive, we can use ILIKE which is case-insensitive
Using the underscore allows us to replace just a single character
o Get all mission impossible films
o Where title LIKE “Mission Impossible_”
Where name LIKE ‘_her%’
o Cheryl
o Theresa
o Sherri
select * from customer where first_name like 'J%'
select * from customer where first_name like '_a%'
select * from customer where first_name like '_a%'and last_name like 'S%';
select * from customer where first_name like '%r%';
select * from film where title like '%Truman%';
Group By:
AS CLAUSE:
INNER JOINT
id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
4 Spaghetti 4 Ninja
ON TableA.name = TableB.name
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja
left joint
right joint
Union:
id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
4 Spaghetti 4 Ninja
Let's join these tables by the name field in a few different ways and see if we
can get a conceptual match to those nifty Venn diagrams.
SELECT * FROM TableA
ON TableA.name = TableB.name
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja
ON TableA.name = TableB.name
id name id name
SELECT * FROM TableA
ON TableA.name = TableB.name
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja
ON TableA.name = TableB.name
id name id name
-- ---- -- ----
1 Pirate 2 Pirate
SELECT * FROM TableA
ON TableA.name = TableB.name
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja
ON TableA.name = TableB.name
id name id name
SELECT * FROM TableA
ON TableA.name = TableB.name
id name id name
1 Pirate 2 Pirate
3 Ninja 4 Ninja
ON TableA.name = TableB.name
OR TableB.id IS null
id name id name
There's also a cartesian product or cross join, which as far as I can tell, can't
be expressed as a Venn diagram:
There's also a cartesian product or cross join, which as far as I can tell, can't be expressed as
a Venn diagram:
This joins "everything to everything", resulting in 4 x 4 = 16 rows, far more than we had in
the original sets. If you do the math, you can see why this is a very dangerous join to run
against large tables.
NEXT
Advanced Concepts of SQL:
Some Datatypes:
Time--- Contains only time
Date----Contains only Date
Timestamp--- contains date and time
Timestamptz--- contains data,time and timezon
- show timezone
- select now()
- select timeofday()
- select current_time
- select current_date
Extract------------------------------EXTRACT():
TO_CHAR()
TO_CHAR(date_col, ‘mm-dd-yyyy’)
Age:
select age(payment_date) from payment;
To_char(timestamp,__________)
Table 9.24. Formatting Functions
Return
Function Type Description Example
Note
There is also a single-argument to_timestamp function; see Table 9.31.
Tip
to_timestamp and to_date exist to handle input formats that cannot be converted by
simple casting. For most standard date/time formats, simply casting the source string to the
required data type works, and is much easier. Similarly, to_number is unnecessary for
standard numeric representations.
In a to_char output template string, there are certain patterns that are recognized and
replaced with appropriately-formatted data based on the given value. Any text that is not a
template pattern is simply copied verbatim. Similarly, in an input template string (for the other
functions), template patterns identify the values to be supplied by the input data string. If
there are characters in the template string that are not template patterns, the corresponding
characters in the input data string are simply skipped over (whether or not they are equal to
the template string characters).
Table 9.25 shows the template patterns available for formatting date and time values.
Pattern Description
midnight; see Section B.7)
Q quarter
RM month in upper case Roman numerals (I-XII; I=January)
rm month in lower case Roman numerals (i-xii; i=January)
TZ upper case time-zone abbreviation (only supported in to_char)
tz lower case time-zone abbreviation (only supported in to_char)
TZH time-zone hours
TZM time-zone minutes
OF time-zone offset from UTC (only supported in to_char)
Modifiers can be applied to any template pattern to alter its behavior. For
example, FMMonth is the Month pattern with the FM modifier. Table 9.26 shows the modifier
patterns for date/time formatting.
FM prefix fill mode (suppress leading zeroes and padding blanks) FMMonth
TM prefix translation mode (print localized day and month names based TMMonth
on lc_time)
SP suffix spell mode (not implemented) DDSP
FM suppresses leading zeroes and trailing blanks that would otherwise be added to
make the output of a pattern be fixed-width. In PostgreSQL, FM modifies only the
next specification, while in Oracle FM affects all subsequent specifications, and
repeated FM modifiers toggle fill mode on and off.
TM does not include trailing blanks. to_timestamp and to_date ignore
the TM modifier.
to_timestamp and to_date skip multiple blank spaces at the beginning of the
input string and around date and time values unless the FX option is used. For
example, to_timestamp(' 2000 JUN', 'YYYY
MON') and to_timestamp('2000 - JUN', 'YYYY-MON') work,
but to_timestamp('2000 JUN', 'FXYYYY MON') returns an error
because to_timestamp expects only a single space. FX must be specified as the
first item in the template.
A separator (a space or non-letter/non-digit character) in the template string
of to_timestamp and to_date matches any single separator in the input string or
is skipped, unless the FX option is used. For
example, to_timestamp('2000JUN',
'YYYY///MON') and to_timestamp('2000/JUN', 'YYYY MON') work,
but to_timestamp('2000//JUN', 'YYYY/MON') returns an error because the
number of separators in the input string exceeds the number of separators in the
template.
If FX is specified, a separator in the template string matches exactly one character in
the input string. But note that the input string character is not required to be the same
as the separator from the template string. For
example, to_timestamp('2000/JUN', 'FXYYYY MON') works,
but to_timestamp('2000/JUN', 'FXYYYY MON') returns an error because
the second space in the template string consumes the letter J from the input string.
Tip
Prior to PostgreSQL 12, it was possible to skip arbitrary text in the input string using
non-letter or non-digit characters. For example, to_timestamp('2000y6m1d',
'yyyy-MM-DD') used to work. Now you can only use letter characters for this
purpose. For example, to_timestamp('2000y6m1d',
'yyyytMMtDDt') and to_timestamp('2000y6m1d',
'yyyy"y"MM"m"DD"d"') skip y, m, and d.
If you want to have a double quote in the output you must precede it with a
backslash, for example '\"YYYY Month\"'. Backslashes are not otherwise special
outside of double-quoted strings. Within a double-quoted string, a backslash causes
the next character to be taken literally, whatever it is (but this has no special effect
unless the next character is a double quote or another backslash).
In to_timestamp and to_date, if the year format specification is less than four
digits, e.g., YYY, and the supplied year is less than four digits, the year will be
adjusted to be nearest to the year 2020, e.g., 95 becomes 1995.
In to_timestamp and to_date, negative years are treated as signifying BC. If you
write both a negative year and an explicit BC field, you get AD again. An input of year
zero is treated as 1 BC.
In to_timestamp and to_date, the YYYY conversion has a restriction when
processing years with more than 4 digits. You must use some non-digit character or
template after YYYY, otherwise the year is always interpreted as 4 digits. For
example (with the year 20000): to_date('200001131', 'YYYYMMDD') will be
interpreted as a 4-digit year; instead use a non-digit separator after the year,
like to_date('20000-1131', 'YYYY-MMDD') or to_date('20000Nov31',
'YYYYMonDD').
In to_timestamp and to_date, the CC (century) field is accepted but ignored if
there is a YYY, YYYY or Y,YYY field. If CC is used with YY or Y then the result is
computed as that year in the specified century. If the century is specified but the year
is not, the first year of the century is assumed.
In to_timestamp and to_date, weekday names or numbers (DAY, D, and related
field types) are accepted but are ignored for purposes of computing the result. The
same is true for quarter (Q) fields.
In to_timestamp and to_date, an ISO 8601 week-numbering date (as distinct
from a Gregorian date) can be specified in one of two ways:
o Year, week number, and weekday: for example to_date('2006-42-4',
'IYYY-IW-ID') returns the date 2006-10-19. If you omit the weekday it is
assumed to be 1 (Monday).
o Year and day of year: for example to_date('2006-291', 'IYYY-
IDDD') also returns 2006-10-19.
Attempting to enter a date using a mixture of ISO 8601 week-numbering fields and
Gregorian date fields is nonsensical, and will cause an error. In the context of an ISO
8601 week-numbering year, the concept of a “month” or “day of month” has no
meaning. In the context of a Gregorian year, the ISO week has no meaning.
Caution
While to_date will reject a mixture of Gregorian and ISO week-numbering date
fields, to_char will not, since output format specifications like YYYY-MM-DD
(IYYY-IDDD) can be useful. But avoid writing something like IYYY-MM-DD; that
would yield surprising results near the start of the year. (See Section 9.9.1 for more
information.)
In to_timestamp, millisecond (MS) or microsecond (US) fields are used as the
seconds digits after the decimal point. For example to_timestamp('12.3',
'SS.MS') is not 3 milliseconds, but 300, because the conversion treats it as 12 +
0.3 seconds. So, for the format SS.MS, the input values 12.3, 12.30,
and 12.300 specify the same number of milliseconds. To get three milliseconds, one
must write 12.003, which the conversion treats as 12 + 0.003 = 12.003 seconds.
Pattern Description
Certain modifiers can be applied to any template pattern to alter its behavior. For
example, FM99.99 is the 99.99 pattern with the FM modifier. Table 9.28 shows the modifier
patterns for numeric formatting.
Modifie
r Description Example
FM prefix fill mode (suppress trailing zeroes and padding blanks) FM99.99
TH suffix upper case ordinal number suffix 999TH
Table 9.29. to_char Examples
Expression Result
to_char(current_timestamp, 'Tuesday , 06 05:39:18'
'Day, DD HH12:MI:SS')
to_char(current_timestamp, 'Tuesday, 6 05:39:18'
'FMDay, FMDD HH12:MI:SS')
to_char(-0.1, '99.99') ' -.10'
to_char(-0.1, 'FM9.99') '-.1'
to_char(-0.1, 'FM90.99') '-0.1'
to_char(0.1, '0.9') ' 0.1'
Expression Result
Prev
select distinct(to_char(payment_date,'MONTH')) from payment;
SubQuery:
Select student,grade from test_scores where student IN (select student from
honor_roll_table)
select title from film where rental_rate >(select avg(rental_rate) from film);
SELF-join
Select tableA.col,tableB.col from table AS tableA JOIN table AS tableB on
tableA.some_col =table.other_col
BASIC COMMANDS:
PrimaryKey
A Primary key is a column or a group of columns used to identify a row uniquely in a table.
For example, in our dvdrental database we saw customers had a unique, non-null
customer_id column as their primary key.
Foreign Key:
A foreign key is a field or group of fields in a table that uniquely identifies a row in another
table.
A foreign key is defined in a table that references to primary key of the other table.
Constraints:
Constraints can be divided into two main categories:
- Column constraints--- constrains the data in a column to adhere to certain
conditions.
- Table Constraints---- applied to the entire table rather than to an individual column.
- NOT NULL---- no null values
- UNIQUE------ all values are different
- Primary key
- Foreign key
- Check---- ensures that all values in a column satisfy certain conditions
- EXCLUSION----- ensures that if any two rows are compared on the specified column
or expression using the specified operator, not all of these comparisons will return
TRUE
SERIAL:
- A sequence is a special kind of database object that generates a sequence of
integers.
- If a row is later removed, the column with the serial data type will not adjust,
marking the fact that a row was removed from the sequence, for ex:::: 1,2,3,5,6,7,
CREATE ____
INSERT______
insert into job(job_name)values('police')
insert into job(job_name)values('police')
insert into job(job_name)values('begger')
update______
DELET_______
ALTER TABLE__________
Ater table tablename condition
Drop
Check--------------------
Check and give condition
Means (age int check (age>30))
Assessment Test 3
Welcome to your final assessment test! This will test your knowledge of the
previous section, focused on creating databases and table operations. This test will
actually consist of a more open-ended assignment below:
The constraints are mostly up to you, but your table constraints do have to consider
the following:
Once you've made the tables, insert a student named Mark Watney (student_id=1)
who has a phone number of 777-555-1234 and doesn't have an email. He graduates
in 2035 and has 5 as a homeroom number.
Then you can use the following SQL scripts to execute the tasks:
To create the students table:
1. CREATE TABLE students(
2. student_id serial PRIMARY KEY,
3. first_name VARCHAR(45) NOT NULL,
4. last_name VARCHAR(45) NOT NULL,
5. homeroom_number integer,
6. phone VARCHAR(20) UNIQUE NOT NULL,
7. email VARCHAR(115) UNIQUE,
8. grad_year integer);
CASE-------
There are two main ways to use CASE statement, either a general CASE or a CASE
expression.
GENERAL CASE
select * from customer;
select customer_id,
CASE
when (customer_id<=100) then 'Premium'
when (customer_id between 100 and 200) then 'plus'
else 'Normal'
END
from customer;
select customer_id,
CASE
when (customer_id<=100) then 'Premium'
when (customer_id between 100 and 200) then 'plus'
else 'Normal'
END as membership
from customer;
select customer_id,
CASE customer_id
when 2 then 'winner'
when 5 then 'second place'
else 'normal'
END as results
from customer;
COALESCE::::::::
Example
Select coalesce(1,2)
=1
Select coalesce(null,2,3)
=2
Or
You can then use this in a SELECT query with a column name instead of a single instance
------ select cast(date as timestamp) from table
NULLIF
The NULLIF function takes in 2 inputs and returns NULL if both are equal, otherwise it
returns the first argument passed.
- NULLIF(arg1,arg2)
- Explw
- NULLIF(10,12)
- Returns 10