\documentclass[10pt,landscape]{article}
\usepackage{multicol}
\usepackage{calc}
\usepackage{ifthen}
\usepackage[landscape]{geometry}
\usepackage{amsmath,amsthm,amsfonts,amssymb}
\usepackage{color,graphicx,overpic}
\usepackage{hyperref}
\usepackage{listings}
\lstset{
  basicstyle=\ttfamily,
  columns=fullflexible,
  frame=single,
  breaklines=true,
  postbreak=\mbox{\textcolor{red}{$\hookrightarrow$}\space},
}
\pdfinfo{
  /Title (example.pdf)
  /Creator (TeX)
  /Producer (pdfTeX 1.40.0)
  /Author (Seamus)
  /Subject (Example)
  /Keywords (pdflatex, latex,pdftex,tex)}
% This sets page margins to .5 inch if using letter paper, and to 1cm
% if using A4 paper. (This probably isn't strictly necessary.)
% If using another size paper, use default 1cm margins.
\ifthenelse{\lengthtest { \paperwidth = 11in}}
    { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} }
    {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}}
        {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} }
        {\geometry{top=1cm,left=1cm,right=1cm,bottom=1cm} }
    }
% Turn off header and footer
\pagestyle{empty}
% Redefine section commands to use less space
\makeatletter
\renewcommand{\section}{\@startsection{section}{1}{0mm}%
                                {-1ex plus -.5ex minus -.2ex}%
                                {0.5ex plus .2ex}%x
                                {\normalfont\large\bfseries}}
\renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}%
                                {-1explus -.5ex minus -.2ex}%
                                {0.5ex plus .2ex}%
                                {\normalfont\normalsize\bfseries}}
\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}%
                                {-1ex plus -.5ex minus -.2ex}%
                                {1ex plus .2ex}%
                                {\normalfont\small\bfseries}}
\makeatother
% Define BibTeX command
\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em
    T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
% Don't print section numbers
\setcounter{secnumdepth}{0}
\setlength{\parindent}{0pt}
\setlength{\parskip}{0pt plus 0.5ex}
%My Environments
\newtheorem{example}[section]{Example}
% -----------------------------------------------------------------------
\begin{document}
\raggedright
\footnotesize
\begin{multicols}{3}
% multicol parameters
% These lengths are set only within the two main columns
%\setlength{\columnseprule}{0.25pt}
\setlength{\premulticols}{1pt}
\setlength{\postmulticols}{1pt}
\setlength{\multicolsep}{1pt}
\setlength{\columnsep}{2pt}
\begin{center}
     \Large{\underline{COMS4111}} \\
\end{center}
\section{Piazza Resources}
Relevant: Chapter 4, sections 1-6 of "Database Systems -- The Complete Book"
\subsection*{Sample question 1}
\subsubsection*{CREATE Syntax}
\begin{lstlisting}[language=SQL]
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
\end{lstlisting}
create\_definition:
\begin{lstlisting}[language=SQL]
col_name column_definition
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
[index_option] ...
| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
[index_option] ...
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
[index_option] ...
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,...) reference_definition
| CHECK (expr)
\end{lstlisting}
column\_definition:
\begin{lstlisting}[language=SQL]
data_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY|DEFAULT}]
[reference_definition]
\end{lstlisting}
Create Table Using Another Table
\begin{lstlisting}[language=SQL]
CREATE TABLE new_table_name AS
    SELECT column1, column2,...
    FROM existing_table_name
    WHERE ....;
\end{lstlisting}
\subsubsection*{Select Syntax}
\begin{lstlisting}[language=SQL]
SELECT col1, col2, col3, ..., FROM table1 
WHERE col4 = 1 AND col5 = 2  
GROUP BY … # aggregate the data
HAVING count(*) > 1 # limit aggregated data
ORDER BY col2
\end{lstlisting}
\subsubsection*{Insert Syntax}
\begin{lstlisting}[language=SQL]
# insert values manually
INSERT INTO table1 (ID, FIRST_NAME, LAST_NAME)
VALUES (1, ‘Rebel’, ‘Labs’);
# or by using the results of a query
INSERT INTO table1 (ID, FIRST_NAME, LAST_NAME)
SELECT id, last_name, first_name FROM table2
\end{lstlisting}
\subsubsection*{Alter table Syntax}
\begin{lstlisting}[language=SQL]
# add a column
alter table tablename
add column_name datatype
# drop a column
alter table tablename
drop col1, drop col2
# alter a column's datatype
alter table tablename
alter column column_name datatype / modify column column_name datatype auto_increment
# add a constraint
alter table tablename
add constraint fk foreign key (col) references tblname2(col2)
\end{lstlisting}
\subsubsection*{Update Syntax}
\begin{lstlisting}[language=SQL]
UPDATE table1 
SET table1col1 = 1 
FROM table2
WHERE col2 = 2
\end{lstlisting}
\subsubsection*{Create index Syntax}
\begin{lstlisting}[language=SQL]
create index idx_name
on table_name(col)
\end{lstlisting}
\subsubsection*{Constraint Syntax}
\subsubsection*{Sample Solution 1}
\begin{enumerate}
\setcounter{enumi}{1}
\item 
\begin{lstlisting}[language=SQL]
create table addresses (
id int auto_increment unique not null,
street_name varchar(100) not null,
city varchar(20) not null,
region varchar(20),
postal_code int(5),
country varchar(20) not null,
constraint uc_address unique(street_name, city, region, postal_code, country),
constraint pk_addresses primary key(id)
)
\end{lstlisting}
\item
\begin{lstlisting}[language=SQL]
insert addresses(addresses, city, region, postal_code, country)
	select addresses, city, region, postal_code, country
    from customers
    group by addresses, city, region, postal_code, country
OR
insert into addresses(...)
    select distinct address, city, region, postal_code, country from customers
\end{lstlisting}
\item
\begin{lstlisting}[language=SQL]
# Clone a table
create table new_customers like customers
# Load the data
insert into new_customers 
select * from customers
\end{lstlisting}
\item
\begin{lstlisting}[language=SQL]
alter table new_customers
add column address_id int
\end{lstlisting}
\item
\begin{lstlisting}[language=SQL]
update table new_customers
set new_customers.address_id = addresses.id
from new_customers join addresses on
new_customers.address = addresses.street_name 
and new_customers.city = addresses.city 
and new_customers.region = addresses.region 
and new_customers.postal_code = addresses.postal_code 
and new_customers.country = addresses.country
OR
`1upda	`Q1E4RTYU7IOP[-\te new_customers
set address_id=(select id from address where
(...AND (... OR (adrresses.region is null or new_customers.region os null)))
\end{lstlisting}
\item
\begin{lstlisting}[language=SQL]
alter table addresses
drop column street_name, 
drop city, 
drop region, 
drop postal_code, 
drop country
\end{lstlisting}
\item
\begin{lstlisting}[language=SQL]
alter table new_customers
add constraint fk_new_customers_addresses foreign key (address_id) 
references addresses(id);
create index idx_new_customer_id on
new_customers(id)
\end{lstlisting}
\end{enumerate}
\subsection*{Sample question 2}
Define a datamodel using the notation we used in class. You should define either a logical or physical model. From your model, create the SQL DDL.
The datamodel is the following.
\begin{itemize}
\item Companies: These are businesses and have properties Name, ID. The ID should be unique and derived from the company name. Companies also have an address.
\item Persons: A Person has a last\_name, first\_name and middle initial. A Person also has an email. A Person also has an address.
\item A Company may be related to one or more Persons. A Person may be related to one or more Companies. A Person-Company relationship has a type, e.g. Employee, Contractor, Consultant. The data model should ONLY allow creation of relationships that conform to one of the types. It must be possible to add new, named types.
\end{itemize}
\subsubsection*{Trigger Syntax}
% \begin{lstlisting}
% CREATE
%     [DEFINER = { user | CURRENT_USER }]
%     TRIGGER trigger_name
%     trigger_time trigger_event
%     ON tbl_name FOR EACH ROW
%     [trigger_order]
%     trigger_body
% trigger_time: { BEFORE | AFTER }
% trigger_event: { INSERT | UPDATE | DELETE }
% trigger_order: { FOLLOWS | PRECEDES } other_trigger_name
% \end{lstlisting}
Example:
\begin{lstlisting}
create definer = `root` @ `localhost` trigger `University`.`enrollment_before_insert` before insert on `enrollment` for each row 
begin
	declare new_day varchar(1);
    declare new_start int;
    declare new_end int;
    
    
    select sections.
	
\end{lstlisting}
\subsubsection*{Function Syntax}
\begin{lstlisting}[language=SQL]
create function function_name(param1, param2 ...)
	returns datatype
    [not] deterministic
statements
\end{lstlisting}
Example:
\begin{lstlisting}
drop function if exists customerlevel;
DELIMITER $$
 
CREATE FUNCTION CustomerLevel(p_creditLimit double) RETURNS VARCHAR(10)
    DETERMINISTIC
BEGIN
    DECLARE lvl varchar(10);
 
    IF p_creditLimit > 50000 THEN
 SET lvl = 'PLATINUM';
    ELSEIF (p_creditLimit <= 50000 AND p_creditLimit >= 10000) THEN
        SET lvl = 'GOLD';
    ELSEIF p_creditLimit < 10000 THEN
        SET lvl = 'SILVER';
    END IF;
 
 RETURN (lvl);
END
create definer='root'@'localhost' trigger 'University'.'person1_BEFORE_INSERT' before insert on 'person1' for each row
begin
	set new.uni = generate_uni_1(new.last_name, new.first_name)
end
create definer='root'@'localhost' function 'generate_uni'(last_name varchar(32), first_name varchar(32)) returns varchar(8) charset utf8
begin
	declare c1 char(2);
    declare c2 char(2);
    declare prefix char(5);
    declare uniCount int;
    declare newUni varchar(6);
    
    set c1 = upper(substr(last_name, 1, 2));
    set c2 = upper(substr(first_name, 1, 2));
    set prefix = concat(c1, c2, '%');
    
    select count(uni) into uniCount from person1 where uni like prefix;
    set newUni = concat(c1, c2, uniCount);
return newUni;
end
\end{lstlisting}
\subsection*{Sample Solution 2}
\begin{lstlisting}[language=SQL]
# Create companies
create table companies(
id varchar(6) not null,
name varchar(100) not null,
address varchar(200),
constraint pk_companies primary key(id)
)
delimiter $$
create definer='root'@'localhost' trigger 'companies'.'companies_before_insert' before insert on companies for each row
begin
	set new.id = generate_id(new.name);
end$$
create function generate_id (name varchar(100))
  returns varchar(6)
  BEGIN
    declare prefix varchar(3);
    declare idcount int(3);
    declare newId varchar(6);
    set prefix = upper(substr(name, 1, 3));
    select count(id) into idcount from companies where id like prefix;
    set newId = concat(prefix, idcount);
  return newId;
  END $$ 
delimiter ;
# Use the procedure to create person
create table persons(
	id int not null auto_increment
    last_name varchar(20) not null,
	first_name varchar(20) not null,
    initial varchar(2),
    email varchar(100),
    address varchar(100),
    typeid int,
    constraint pk_persons primary key (id),
    constriant fk_persons_type foreign key(typeid)
);
delimiter $$
create trigger persons_before_insert before insert on persons for each row
begin
  call procedure(new.last_name, new.first_name, @initial);
  set new.initial = @initial;
end$$
create procedure generate_initial(in last_name varchar(20) first_name varchar(20) ,out initial varchar(2))
begin
	set initial = concat(upper(substr(last_name, 1, 1)), upper(substr(first_name, 1, 1)))
end$$
delimiter ; 
\end{lstlisting}
\subsection*{Sample Question 3}
\subsection*{Sample Solution 3}
\begin{lstlisting}
TO COPY DON's CODE
create view valid1 as select *
from 
(select dish as dish1 from appetizers) as a1 join
(select dish as dish2 from appetizers) as a
create view validorder as
select * from valid1
union
select * from valid2
union 
select * from valid3
create procedure
create function # function can update data like insert
create trigger
\end{lstlisting}
% You can even have references
\rule{0.3\linewidth}{0.25pt}
\scriptsize
\bibliographystyle{abstract}
\bibliography{refFile}
\end{multicols}
\end{document}