CS157a
Chris Pollett
Nov 8, 2023
INSERT INTO R(A_1, A_2, ..., A_n) VALUES (v_1, v_2, ..., v_n);
CREATE TABLE R( A VARCHAR(20) PRIMARY KEY, B VARCHAR(20), C INT DEFAULT 7 );
INSERT INTO R VALUES ('hi', 'there', 7); INSERT INTO R(A,B,C) VALUES ('hi', 'there', 7); INSERT INTO R(B,A,C) VALUES ('there', 'hi', 7); INSERT INTO R(B,A) VALUES ('there', 'hi'); INSERT INTO R(A,B) VALUES ('hi', 'there');
INSERT INTO R(A,B) VALUES ('hi', 'there'), ('good', 'bye');
INSERT INTO Studio(name) SELECT DISTINCT studioName FROM Movies WHERE studioName NOT IN (SELECT name FROM Studio);
DELETE FROM R WHERE <condition>;
DELETE FROM Movies WHERE title LIKE '%Star%' AND year < 1970;
UPDATE R SET <new-value asssignment > WHERE <condition>
UPDATE MovieExec SET name = 'Pres. ' || name /*Remember || is concatenation in SQL */ WHERE cert# IN (SELECT presC# FROM Studio);
CREATE DATABASE <some_database_name>;to create a database, then have some syntax (for example, USE <some_database_name>) to specify which database our CREATE TABLE commands are intended for.
CREATE TABLESPACE <some_name> LOCATION 'some_folder';This can be useful if we want some tables on SSD versus spin drive.
CREATE DATABASE foo WITH TABLESPACE = blah;
CREATE TABLE t1 (i INT) ENGINE = INNODB; CREATE TABLE t2 (i INT) ENGINE = CSV; CREATE TABLE t3 (i INT) ENGINE = MEMORY;
CREATE TABLE Studio ( name CHAR(30) PRIMARY KEY, address VARCHAR(255) NOT NULL, presC# INT, FOREIGN KEY (presC#) REFERENCES MovieExec(cert#) );
CREATE TABLE Studio ( name CHAR(30) PRIMARY KEY, address VARCHAR(255), presC# INT REFERENCES MovieExec(cert#) ON DELETE SET NULL ON UPDATE CASCADE );
CREATE TABLE MovieExec ( name VARCHAR(30) PRIMARY KEY, gender CHAR(1) CHECK (gender IN ('F', 'M', 'O')), salary INT CHECK (salary >= 10000000); );
CREATE TABLE MovieStar ( name CHAR(30) PRIMARY KEY, address VARCHAR(255), gender CHAR(1), birthdate DATE, CHECK (gender = 'F' OR name NOT LIKE 'Boring %') );
CREATE TABLE MovieExec ( name VARCHAR(30) PRIMARY KEY, gender CHAR(1) CHECK (gender IN ('F', 'M', 'O')), salary INT CONSTRAINT KEEP_RICH CHECK (salary >= 10000000); );
ALTER CONSTRAINT KEEP_RICH CHECK(salary >= 15000000);
ALTER TABLE MovieExec DROP CONSTRAINT KEEP_RICH; ALTER TABLE MovieExec ADD CONSTRAINT NOT_TOO_RICH CHECK (salary <= 10000000);
CREATE ASSERTION <assertion-name> CHECK (<condition>);
CREATE ASSERTION RichPres CHECK (NOT EXISTS (SELECT Studio.name FROM Studio, MovieExec WHERE presC# = cert# AND netWorth < 10000000 ) );
DROP ASSERTION <assertion-name>
CREATE TRIGGER NetWorthTrigger AFTER UPDATE OF netWorth ON MovieExec REFERENCING OLD ROW AS OldTuple, NEW ROW AS NewTuple FOR EACH ROW WHEN (OldTuple.netWorth > NewTuple.netWorth) UPDATE MovieExec SET netWorth = OldTuple.netWorth WHERE cert# = NewTuple.cert#;
CREATE TABLE LOG_DATA ( LEVEL CHAR(1), MESSAGE VARCHAR(30) ); CREATE TABLE LOG_COUNTS_BY_LEVEL ( LEVEL CHAR(1), NUM_MESSAGES INT ); CREATE TRIGGER UPDATE_LOG_COUNTS AFTER INSERT ON LOG_DATA BEGIN UPDATE LOG_COUNTS_BY_LEVEL SET NUM_MESSAGES = NUM_MESSAGES + 1 WHERE LEVEL = NEW.LEVEL; END; INSERT INTO LOG_COUNTS_BY_LEVEL VALUES ('E', 0), ('W', 0), ('I', 0); INSERT INTO LOG_DATA VALUES ('W', 'Oh! No! I forgot the camembert!'); SELECT * FROM LOG_COUNTS_BY_LEVEL;
DELIMITER // CREATE TRIGGER UPDATE_LOG_COUNTS AFTER INSERT ON LOG_DATA FOR EACH ROW BEGIN UPDATE LOG_COUNTS_BY_LEVEL SET NUM_MESSAGES = NUM_MESSAGES + 1 WHERE LEVEL = NEW.LEVEL; END // DELIMITER ;