Oracle 11g vs. MySQL 5.6 Ingemar Jansson Haverstad Ingemar.haverstad@keystep.no Keystep AS 16.04.2013 2 Skrevet av Michael McLaughlin I hovedsak for utviklere Kan brukes til å migrere begge veier ISBN 978-0-07-176885-6 SQL 3 ANSI SQL-89 ANSI SQL-92 (JOINs) Oracle: PL/SQL MySQL 5.0: SQL/PSM* (ANSI SQL-2003) PSM: Persistent Stored Module SQL er SQL... 4 Finnes kun 16 nøkkelord i SQL Data Definition Language (DDL) ALTER, DROP, RENAME, CREATE og COMMENT Data Control Language (DML) SELECT, INSERT, UPDATE, DELETE og MERGE Transaction Control Language (TCL) SAVEPOINT, ROLLBACK og COMMIT Database og skjema Oracle: Skjema er synonymt med bruker. Skjema er et privat område knyttet til en bruker. Skjemaer MySQL: sys oe hr Databaser Database tilsvarer Oracle skjema. Database er ikke knyttet til en bruker. mysql information_schema oe hr 5 Klientprogrammer Oracle: SQL*Plus SQL*Developer MySQL: MySQL Monitor MySQL Workbench 6 Klientprogrammer Oracle: SQL*Plus oracle@xps:~$ export ORACLE_SID=XE oracle@xps:~$ sqlplus ingemar/password SQL*Plus: Release 11.2.0.2.0 Sat Sep 8 20:23:39 2012 Connected to: Oracle Database 11g Express Edition Release 11.2.0.2.0 ­ 64bit SQL> MySQL: MySQL Monitor mysql@xps:~$ mysql ­u ingemar ­p Enter password: ########## Welcome to the MySQL monitor. Commands end with ; or \g. Server version: 5.6.10 MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL> 7 Oracle: SQL*Developer 8 MySQL: MySQL Workbench 9 MySQL: MySQL Workbench 10 Listener Oracle: Port 1521 ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xps)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl.oraklet.no) ) ) MySQL: Port 3306 localhost ● IP, subdomain eller domain ● % ● [mysql@xps Keystep]$ mysql ­u ingemar ­p ­h xps oe MySQL> 11 ACID transaksjoner ACID: atomicity, consistency, isolation, durability Atomic Betyr at fullfører eller feiler og retter delendringer. Consistent Forandrer seg på samme vise enten det skjer serielt eller i parallel. Isolated Betyr at delendringer ikke vises for andre brukere eller prosesser. Durable Skrives til disk og lagres permanent når transaksjonen er avsluttet. 12 MySQL engines InnoDB er standard nå. MyISAM var standard tidligere. mysql> show engines; +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | Engine | Support | Comment | +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | FEDERATED | NO | Federated MySQL engine | | MRG_MYISAM | YES | Collection of MyISAM tables | | MEMORY | YES | Hash based, stored in memory | | BLACKHOLE | YES | /dev/null storage engine | | MyISAM | YES | MyISAM storage engine | | CSV | YES | CSV storage engine | | ARCHIVE | YES | Archive storage engine | | InnoDB | DEFAULT | ACID | | PERFORMANCE_SCHEMA | YES | Performance Schema | +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ 13 Installere MySQL server 14 Installasjon på Fedora Linux: [ingemar@xps Nedlastinger]$ sudo yum install mysql­server Loaded plugins: langpacks, presto, refresh­packagekit Resolving Dependencies ­­> Running transaction check ­­­> Package mysql­server.x86_64 0:5.5.27­1.fc17 will be installed ­­> Processing Dependency: perl­DBI for package: mysql­server­5.5.27­1.fc17.x86_64 ­­> Processing Dependency: perl­DBD­MySQL for package: mysql­server­5.5.27­1.fc17.x86_64 ­­> Processing Dependency: perl(DBI) for package: mysql­server­5.5.27­1.fc17.x86_64 ­­> Running transaction check Total download size: 13 M Installed size: 56 M Is this ok [y/N]: y Installed: mysql­server.x86_64 0:5.5.27­1.fc17 Complete! SQL*Plus Lokalt: oracle@xps:~$ export ORACLE_SID=XE oracle@xps:~$ sqlplus system/passord SQL*Plus: Release 11.1.0.7.0 ­ Wed Feb 4 15:37:55 2009 Koblet til: Oracle Database 11g Enterprise Edition 11.1.0.7.0 ­ Production With the Partitioning, OLAP and Real Application Testing options SQL> Fra en klient: oracle@xps:~$ sqlplus system/passord@XE SQL*Plus: Release 11.1.0.7.0 ­ Wed Feb 4 15:40:02 2009 Koblet til: Oracle Database 11g Enterprise Edition 11.1.0.7.0 ­ Production With the Partitioning, OLAP and Real Application Testing options SQL> 15 Noen forskjeller... Oracle: SQL*Plus formattering. ● SQL*Plus har støtte for avansert SQL aggregering. ● Har eksterne prosedyrer. ● SYS bruker eier meta-dataene. ● MySQL: Listener prosessen er en del av database serveren. ● Kan lese og skrive XML-filer. ● root bruker eier meta-datene. ● 16 Klientprogrammer Oracle: SQL*Plus oracle@xps:~$ export ORACLE_SID=XE oracle@xps:~$ sqlplus ingemar oracle@xps:~$ sqlplus ingemar@XE oracle@xps:~$ sqlplus ingemar@xps:1521/XE MySQL: MySQL Monitor mysql@xps:~$ mysql ­u ingemar ­p mysql@xps:~$ mysql ­­user ingemar –password mysql@xps:~$ mysql ­u ingemar ­p ­P 3306 ­h xps mysql@xps:~$ mysql ­­user ingemar ­­password ­­host xps 17 SQL prompt Oracle: Legg inn standardverdier i glogin.sql oracle@xps:~$ cd $ORACLE_HOME/sqlplus/admin /oracle/product/11.2.0.3/db/sqlplus/admin oracle@xps:~$ vi glogin.sql SET SQLPROMPT '_USER"@"_CONNECT_IDENTIFIER SQL> ' oracle@xps:~$ sqlplus petter/smart@XE PETTER@XE SQL> MySQL: Flere muligheter mysql@xps:~$ export MYSQL_PS1="(\u@\h) [\d]> " mysql@xps:~$ mysql ­u ingemar ­p ­h xps hr (ingemar@xps) [hr]> 18 SQL Variabler 19 Oracle: 75 variabler SQL> SHOW ALL; appinfo is OFF and set to "SQL*Plus" arraysize 15 autocommit OFF autoprint OFF ... USER is "STUDENT" verify ON MySQL: 327 variabler MySQL> SHOW VARIABLES; +­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | Variable_name | Value | +­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | auto_increment_increment | 1 | | auto_increment_offset | 1 | | autocommit | ON | | ... Opprette en bruker: Oracle Opprett en bruker SYSTEM@XE SQL> CREATE USER student IDENTIFIED BY student DEFAULT TABLESPACE users QUOTA 50M ON users TEMPORARY TABLESPACE temp; User created. Tildel rettigheter SYSTEM@XE SQL> GRANT create session, create table, create view TO student; Grant succeeded. 20 Opprette en bruker: MySQL Opprett en bruker (root@xps) [(none)]> CREATE USER 'student'@'%' IDENTIFIED BY 'student'; Query OK, 0 rows affected (0.00 sec) Tildele rettigheter (root@xps) [(none)]> GRANT ALL ON hr.* TO 'student'@'%'; Query OK, 0 rows affected (0.00 sec) mysql@xps:~$ mysql ­u student ­p ­h xps (student@xps) [(none)]> USE hr Database changed (student@xps) [hr]> mysql@xps:~$ mysql ­u student ­p ­h xps hr (student@xps) [hr]> 21 Brukere: Oracle vs. MySQL Oracle: sqlnet.ora tcp.validnode_checking = yes tcp.invited_nodes = (192.168.0.91) tcp.validnode_checking = yes tcp.excluded_nodes = (192.168.0.129) MySQL: (root@xps) [(none)]> CREATE USER 'student'@'192.168.0.91' IDENTIFIED BY 'student'; (root@xps) [(none)]> GRANT ALL ON studentdb.* TO 'student'@'192.168.0.91'; (root@xps) [(none)]> CREATE USER 'student'@'*.mydomain.no' IDENTIFIED BY 'student'; (root@xps) [(none)]> GRANT ALL ON studentdb.* TO 'student'@'*.mydomain.no'; 22 Oracle: SQL*Plus miljø Dynamisk miljøparametere i SQL*Plus STUDENT@XE SQL> SHOW ALL; appinfo is OFF and set to "SQL*Plus" arraysize 15 autocommit OFF ... tab ON termout ON timing OFF underline "­" (hex 2d) USER is "STUDENT" verify ON wrap : lines will be wrapped xmloptimizationcheck OFF STUDENT@XE SQL> SHOW feedback FEEDBACK ON for 6 or more rows STUDENT@XE SQL> SET feedback OFF; STUDENT@XE SQL> SET autocommit ON; 23 Oracle: SQL*Plus miljø Standard miljøparametere i SQL*Plus STUDENT@XE SQL> DEFINE DEFINE _DATE = "10­SEP­12" (CHAR) DEFINE _CONNECT_IDENTIFIER = "XE" (CHAR) DEFINE _USER = "STUDENT" (CHAR) DEFINE _PRIVILEGE = "" (CHAR) DEFINE _SQLPLUS_RELEASE = "1102000200" (CHAR) DEFINE _EDITOR = "ed" (CHAR) DEFINE _O_VERSION = "Oracle Database 11g Express Edition Release 11.2.0.2.0 ­ 64bit Production" (CHAR) DEFINE _O_RELEASE = "1102000200" (CHAR) STUDENT@XE SQL> DEFINE _editor=vi STUDENT@XE SQL> DEFINE x=" Her er en tekst!" STUDENT@XE SQL> SELECT '&&x' AS Tekst FROM dual; Tekst ­­­­­­­­­­­­­­­­­ Her er en tekst! 24 Oracle: SQL*Plus hjelp 25 Hjelp i SQL*Plus STUDENT@XE SQL> HELP HELP ­­­­ Accesses this command line help system. Enter HELP INDEX or ? INDEX for a list of topics. You can view SQL*Plus resources at http://www.oracle.com/technology/tech/sql_plus/ and the Oracle Database Library at http://www.oracle.com/technology/documentation/ HELP|? [topic] Oracle: SQL*Plus hjelp 26 Hjelp i SQL*Plus STUDENT@XE SQL> HELP index Enter Help [topic] for help. @ COPY PAUSE SHUTDOWN @@ DEFINE PRINT SPOOL / DEL PROMPT SQLPLUS ACCEPT DESCRIBE QUIT START APPEND DISCONNECT RECOVER STARTUP ARCHIVE LOG EDIT REMARK STORE ATTRIBUTE EXECUTE REPFOOTER TIMING BREAK EXIT REPHEADER TTITLE BTITLE GET RESERVED WORDS (SQL) UNDEFINE CHANGE HELP RESERVED WORDS (PL/SQL) VARIABLE CLEAR HOST RUN WHENEVER ... STUDENT@XE SQL> HELP store Saves attributes of the current SQL*Plus environment in a script. STORE {SET} file_name[.ext] [CRE[ATE] | REP[LACE] | APP[END]] MySQL: Monitor hjelp 27 Hjelp i MYSQL Monitor (student@xps) [hr]> help; For information about MySQL products and services, visit: http://www.mysql.com/ For developer information, including the MySQL Reference Manual, visit: http://dev.mysql.com/ To buy MySQL Enterprise support, training, or other products, visit: https://shop.mysql.com/ List of all MySQL commands: Note that all text commands must be first on line and end with ';' clear (\c) Clear the current input statement. connect (\r) Reconnect to the server. delimiter (\d) Set statement delimiter. edit (\e) Edit command with $EDITOR. ego (\G) Send command to mysql server, display result vertically. exit (\q) Exit mysql. Same as quit. ... MySQL: Monitor hjelp 28 Hjelp i MYSQL Monitor server kommandoer (student@xps) [hr]> HELP contents You asked for help about help category: "Contents" For more information, type 'help <item>', where <item> is one of the following categories: Account Management Administration Compound Statements Data Definition Data Manipulation Data Types Functions Functions and Modifiers for Use with GROUP BY Geographic Features Help Metadata Language Structure Plugins Table Maintenance ... Skrive SQL setninger Oracle: STUDENT@XE SQL> SELECT 'Hello World!' FROM dual; 'HELLOWORLD! ­­­­­­­­­­­­ Hello World! MySQL: (student@xps) [oe]> SELECT 'Hello World!'; +­­­­­­­­­­­­­­+ | Hello World! | +­­­­­­­­­­­­­­+ | Hello World! | +­­­­­­­­­­­­­­+ (student@xps) [oe]> SELECT "Hello World!" FROM dual; +­­­­­­­­­­­­­­+ | Hello World! | +­­­­­­­­­­­­­­+ | Hello World! | +­­­­­­­­­­­­­­+ 29 Lese data i MySQL 30 (student@xps) [hr]> SELECT * FROM EMPLOYEES; +­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­­­+ | EMPLOYEE_ID | FIRST_NAME | LAST_NAME | EMAIL | PHONE_NUMBER |... +­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­­­+ | 100 | Steven | King | SKING | 515.123.4567 |... +­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­+­­­­­­­­­­­­­­+ MySQL: kan benytte \G for å vise kolonner. (student@xps) [hr]> SELECT * FROM EMPLOYEES\G *************************** 1. row *************************** EMPLOYEE_ID: 100 FIRST_NAME: Steven LAST_NAME: King EMAIL: SKING PHONE_NUMBER: 515.123.4567 HIRE_DATE: 2017­06­20 JOB_ID: AD_PRES SALARY: 24000 COMMISSION_PCT: NULL MANAGER_ID: NULL DEPARTMENT_ID: 90 MySQL monitor status (student@xps) [hr]> STATUS ­­­­­­­­­­­­­­ mysql Ver 14.14 Distrib 5.6.10, for Linux (x86_64) Connection id: 33 Current database: ougn Current user: student@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.6.10 MySQL Community Server (GPL) Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 7 days 6 hours 54 min 58 sec Threads: 2 Questions: 211 Slow queries: 0 Opens: 81 Flush tables: 1 Open tables: 68 Queries per second avg: 0.000 ­­­­­­­­­­­­­­ 31 Kjøre SQL programmer Oracle: STUDENT@XE SQL> @create_data.sql STUDENT@XE SQL> @/home/oracle/bin/create_data.sql STUDENT@XE SQL> START create_data.sql STUDENT@XE SQL> ?/rdbms/admin/somescript.sql MySQL: (student@xps) [oe]> source create_data.sql (student@xps) [oe]> source /home/oracle/bin/create_data.sql 32 Håndtere sessions variabler 33 Oracle kan benytte «anonyme» PL/SQL prosedyrer. INGEMAR@XE SQL> SET SERVEROUTPUT ON SIZE UNLIMITED; INGEMAR@XE SQL> BEGIN dbms_output.put_line('Hello World!'); END; / Hello World! PL/SQL procedure successfully completed. INGEMAR@XE SQL> VARIABLE whom VARCHAR2(20); BEGIN :whom := 'Ola'; END; / INGEMAR@XE SQL> SELECT 'Play it again. ' || :whom || '!' FROM dual; 'PLAYITAGAIN.'||:WHOM||'!' ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Play it again. Ola! Håndtere sessions variabler «FROM dual» ikke nødvendig i MySQL. (student@xps) [hr]> SELECT 1 INTO @myint; (student@xps) [hr]> SELECT 'Hello World' INTO @mystring; (student@xps) [hr]> SELECT @myint, @mystring; +­­­­­­­­+­­­­­­­­­­­­­­+ | @myint | @mystring | +­­­­­­­­+­­­­­­­­­­­­­­+ | 1 | Hello World! | +­­­­­­­­+­­­­­­­­­­­­­­+ (student@xps) [hr]> SET @myint := 1; (student@xps) [hr]> SET @mystring := 'Hello World!'; (student@xps) [hr]> SELECT @myint, @mystring FROM dual; +­­­­­­­­+­­­­­­­­­­­+ | @myint | @mystring | +­­­­­­­­+­­­­­­­­­­­+ | NULL | Ola | +­­­­­­­­+­­­­­­­­­­­+ 34 Oracle PL/SQL program 35 Oracle funksjon kan benyttes i en SELECT. INGEMAR@XE SQL> CREATE or REPLACE FUNCTION hello_function RETURN VARCHAR2 IS BEGIN RETURN 'Hello World!'; END hello_function; / INGEMAR@XE SQL> SELECT hello_function FROM dual; HELLO_FUNCTION ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ Hello World! Oracle prosedyrer bruker EXECUTE. INGEMAR@XE SQL> SET SERVEROUTPUT ON INGEMAR@XE SQL> EXECUTE hello_prosedure(); ... MySQL SQL/PSM program MySQL har ikke «anonyme pakker». (student@xps) [hr]> DELIMITER $$ (student@xps) [hr]> CREATE FUNCTION hello_function() RETURNS VARCHAR(12) BEGIN RETURN "Hello World!"; END; $$ Query OK, 0 rows affected (0.01 sec) (student@xps) [hr]> DELIMITER ; (student@xps) [hr]> SELECT hello_function(); +­­­­­­­­­­­­­­­­­­+ | hello_function() | +­­­­­­­­­­­­­­­­­­+ | Hello World! | +­­­­­­­­­­­­­­­­­­+ 36 SQL loggfiler Oracle: STUDENT@XE SQL> SET ECHO ON STUDENT@XE SQL> SPOOL /home/oracle/log/Create_data STUDENT@XE SQL> SPOOL /home/oracle/log/Create_data APPEND STUDENT@XE SQL> SPOOL OFF MySQL: (student@xps) [oe]> TEE /home/MySQL/log/Create_data.txt (student@xps) [oe]> NOTEE 37 SQL «escape» Oracle: STUDENT@XE SQL> HOST ls ­ltr ... STUDENT@XE SQL> !ls ­ltr ... MySQL: (student@xps) [oe]> SYSTEM ls ­ltr 38 Rettigheter Oracle MySQL ALTER ANY CLUSTER... ALTER ANY SEQUENCE... ALTER ALTER ALTER ANY PROCEDURE... ALTER ROUTINE CREATE ANY DATABASE... CREATE CREATE ANY PROCEDURE CREATE ROUTINE CREATE USER CREATE USER DELETE ANY TABLE... DELETE DROP ANY TABLE... DROP EXECUTE ANY PROCEDURE EXECUTE SELECT ANY TABLE SELECT SELECT ANY TABLE SUPER CREATE SESSION... USAGE 39 Eksempel: rettigheter Oracle: SYSTEM@XE SQL> GRANT CREATE ANY TABLE TO student; Grant succeeded. SYSTEM@XE SQL> GRANT ALL ON lib.sample TO student; Grant succeeded. MySQL: (root@xps) [(none)]> GRANT CREATE ON hr.* TO student@localhost; Query OK, 0 rows affected (0.00 sec) (root@xps) [(none)]> GRANT CREATE ON hr.* TO student@'%'; Query OK, 0 rows affected (0.00 sec) (root@xps) [(none)]> GRANT ALL ON lib.* TO student@'%'; Query OK, 0 rows affected (0.00 sec) 40 Eksempel: metadata Oracle: LIB@XE SQL> SELECT utp.owner, utp.grantee, utp.privilege FROM user_tab_privs utp WHERE utp.table_name = 'SAMPLE'; OWNER GRANTEE PRIVILEGE ­­­­­­ ­­­­­­­­ ­­­­­­­­­­­­­­­­­­ LIB STUDENT ALTER LIB STUDENT DEBUG LIB STUDENT DELETE LIB STUDENT FLASHBACK LIB STUDENT INDEX LIB STUDENT INSERT LIB STUDENT ON COMMIT REFRESH LIB STUDENT QUERY REWRITE LIB STUDENT REFERENCES LIB STUDENT SELECT LIB STUDENT UPDATE 11 rows selected. 41 Eksempel: metadata MySQL: (student@xps) [lib]> SELECT tp.table_schema, tp.table_name, tp.privilege_type, tp.grantee FROM information_schema.table_privileges tp WHERE tp.table_schema = 'lib' AND tp.table_name = 'sample' AND tp.grantee REGEXP '.*student.*'; +­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+ | table_schema | table_name | privilege_type | grantee | +­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+ | lib | sample | ALTER | 'student'@'%' | | lib | sample | CREATE | 'student'@'%' | | lib | sample | CREATE VIEW | 'student'@'%' | | lib | sample | DELETE | 'student'@'%' | ... | lib | sample | TRIGGER | 'student'@'%' | | lib | sample | UPDATE | 'student'@'%' | +­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+ 12 rows in set (0.00 sec) 42 Eksempel: metadata MySQL: (student@xps) [lib]> SELECT ... WHERE tp.table_schema = 'lib' AND tp.table_name = 'sample' AND tp.grantee REGEXP '.*student.*'; +­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+ | table_schema | table_name | privilege_type | grantee | +­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+ | lib | sample | ALTER | 'student'@'%' | | lib | sample | CREATE | 'student'@'%' | | lib | sample | CREATE VIEW | 'student'@'%' | | lib | sample | DELETE | 'student'@'%' | | lib | sample | DROP | 'student'@'%' | | lib | sample | INDEX | 'student'@'%' | | lib | sample | INSERT | 'student'@'%' | | lib | sample | REFERENCES | 'student'@'%' | | lib | sample | SELECT | 'student'@'%' | | lib | sample | SHOW VIEW | 'student'@'%' | | lib | sample | TRIGGER | 'student'@'%' | | lib | sample | UPDATE | 'student'@'%' | +­­­­­­­­­­­­­­+­­­­­­­­­­­­+­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­+ 43 Eksempel: Tabell 44 ORACLE: SQL> CREATE TABLE member (member_id NUMBER CONSTRAINT pk_member PRIMARY KEY, member_type NUMBER, account_no VARCHAR2(10) CONSTRAINT nn_member_1 NOT NULL, created_by NUMBER CONSTRAINT nn_member_2 NOT NULL, creation_date DATE CONSTRAINT nn_member_3 NOT NULL, CONSTRAINT fk_member_1 FOREIGN KEY(created_by) REFERENCES system_user(system_user_id)); Table created. SQL> CREATE SEQUENCE member_id_seq; Sequence created. SQL> CREATE TRIGGER member_id_trigger ...; Trigger created. Eksempel: Tabell MySQL: MySQL > CREATE TABLE member (member_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, member_type INT UNSIGNED, account_no CHAR(10) NOT NULL, created_by INT UNSIGNED NOT NULL, creation_date DATE NOT NULL, CONSTRAINT fk_member_1 FOREIGN KEY(created_by) REFERENCES system_user(system_user_id)); Query OK, 0 rows affected (0.01 sec) 45 Eksempel: DESCRIBE 46 Oracle: SQL> DESCRIBE member; Name Null? Type ­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­ MEMBER_ID NOT NULL NUMBER MEMBER_TYPE NUMBER ACCOUNT_NO NOT NULL VARCHAR2(10) CREATED_BY NOT NULL NUMBER CREATION_DATE NOT NULL DATE MySQL: MySQL> DESCRIBE member; +­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­­­­­­­­+ | Field | Type | Null | Key | Extra | +­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­­­­­­­­+ | member_id | int(10) unsigned | NO | PRI | auto_increment | | member_type | int(10) unsigned | YES | | | | account_no | char(10) | NO | | | | created_by | int(10) unsigned | NO | MUL | | | creation_date | date | NO | | | +­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­­­­­­­­+ Eksempel: Tabell DDL 47 Oracle: SQL> SET LONG 300000 SQL> SELECT dbms_metadata.get_ddl('TABLE','MEMBER') FROM dual; CREATE TABLE "STUDENT"."MEMBER" ( "MEMBER_ID" NUMBER, "MEMBER_TYPE" NUMBER, "ACCOUNT_NO" VARCHAR2(10) CONSTRAINT "NN_MEMBER_1" NOT NULL ENABLE, "CREATED_BY" NUMBER CONSTRAINT "NN_MEMBER_2" NOT NULL ENABLE, "CREATION_DATE" DATE CONSTRAINT "NN_MEMBER_3" NOT NULL ENABLE, CONSTRAINT "PK_MEMBER" PRIMARY KEY ("MEMBER_ID") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE(...) TABLESPACE "SYSTEM" ENABLE, CONSTRAINT "FK_MEMBER_1" FOREIGN KEY ("CREATED_BY") REFERENCES "STUDENT"."SYSTEM_USER" ("SYSTEM_USER_ID") ENABLE ) SEGMENT CREATION IMMEDIATE ... TABLESPACE "USERS" Eksempel: Tabell DDL 48 MySQL: MySQL> SHOW CREATE TABLE member; +­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | Table | Create Table | +­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | member | CREATE TABLE `member` ( | | `member_id` int(10) unsigned NOT NULL AUTO_INCREMENT, | | `account_number` char(10) NOT NULL, | | `creation_date` date DEFAULT NULL, | | PRIMARY KEY (`member_id`) | |) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ XXX??? 49 Oracle: SYSTEM@XE SQL> CONNECT student/password Connected. STUDENT@XE SQL> CREATE TABLE hr.sample(sample_id NUMBER); Table created. MySQL: mysql@xps:~$ mysql ­u student ­p ­h xps hr (student@xps) [hr]> CREATE TABLE oe.sample(sample_id INT UNSIGNED); Query OK, 0 rows affected (0.00 sec) Datatyper ANSI Data type BLOB CHAR(n) DATE DECIMAL(p,s) DOUBLE PRECISION FLOAT INT INTEGER NUMERIC(p,s) REAL SMALLINT TIMESTAMP VARCHAR(n) 50 Oracle Størrelse BLOB CHAR(n) DATE NUMBER(p,s) FLOAT(126) FLOAT(126) NUMBER(38) NUMBER(38) NUMBER(p,s) FLOAT(63) NUMBER(38) TIMESTAMP VARCHAR2(n) 8-32 TB 2000 bytes 1/100 sekund 1 x 1038 1 x 1026 1 x 1026 1 x 1038 1 x 1038 1 x 1038 1 x 1063 1 x 1038 1/100 sekund 4000 bytes MySQL: Update trigger MySQL> DELIMITER $$ MySQL> CREATE TRIGGER sample_trigger BEFORE INSERT ON sample BEGIN SET new.created = current_timestamp(); END; $$ Query OK, 0 rows affected (0.01 sec) MySQL> DELIMITER ; MySQL> INSERT INTO sample VALUES(NULL, NULL, NULL); Query OK, 1 row affected (0.01 sec) MySQL> SELECT * FROM sample; +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­+ | sample_id | created | updated | +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­+ | 1 | 2012­09­17 15:15:00 | 2012­09­17 15:15:00 | +­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­+ 51 Oracle: CHECK regel Oracle: SQL> CREATE TABLE club_member (club_member_id NUMBER PRIMARY KEY, first_name VARCHAR2(30), last_name VARCHAR2(30), Gender CHAR(1) DEFAULT 'F' CHECK (gender IN ('M', 'F'))); Table created. 52 MYSQL: ENUM regel MySQL: ENUM kan ha 65535 verdier. MySQL> CREATE TABLE indexed_list (var1 ENUM('Female','Male'), var2 ENUM('Female','Male') DEFAULT 'Male', var3 ENUM('Female','Male') NOT NULL); MySQL> INSERT INTO indexed_list VALUES(NULL, NULL, 'Male'); Query OK, 1 row affected (0.00 sec) MySQL> INSERT INTO indexed_list VALUES(NULL, 'Female', 'Male'); Query OK, 1 row affected (0.00 sec) MySQL> INSERT INTO indexed_list VALUES('Female', NULL, 'Male'); Query OK, 1 row affected (0.00 sec) MySQL> SELECT * FROM indexed_list; +­­­­­­­­+­­­­­­­­+­­­­­­+ | var1 | var2 | var3 | +­­­­­­­­+­­­­­­­­+­­­­­­+ | NULL | NULL | Male | | NULL | Female | Male | | Female | NULL | Male | +­­­­­­­­+­­­­­­­­+­­­­­­+ 53 MYSQL: SET regel MySQL: SET kan ha opptil 64 verdier. MySQL> CREATE TABLE inclusive_set (var1 SET('Ham','Pepperoni','Pineapple','Salami')); MySQL> INSERT INTO inclusive_set VALUES('Ham'); Query OK, 1 row affected (0.00 sec) MySQL> INSERT INTO inclusive_set VALUES('Chicken'); Query OK, 1 row affected, 1 warning (0.01 sec) MySQL> SELECT * FROM inclusive_set; +­­­­­­+ | var1 | +­­­­­­+ | Ham | | | +­­­­­­+ 54 Datatyper INT/INTEGER 55 MySQL Undertype Bytes Verdier TINYINT TINYINT SMALLINT SMALLINT MEDIUMINT MEDIUMINT INT SIGNED UNSIGNED SIGNED UNSIGNED SIGNED UNSIGNED SIGNED 1 1 2 2 3 3 4 INT BIGINT BIGINT UNSIGNED SIGNED UNSIGNED 4 8 8 -128..127 0..255 -32.768..32.767 0..65.535 -8.388.608..8.388.607 0..16.777.215 -2.147.483.648.. 2.147.483.648 0..4.294.967.295 -9.2 x 10-18..9.2 x 1018 0..1.8 x 1019 Oracle: Håndtering av tall 56 Oracle: NUMBER mest benyttet. SQL> CREATE TABLE sample_numbers (num1 NUMBER(12,2) CONSTRAINT nn_sample1 NOT NULL, num2 NUMBER, num3 FLOAT(12), num4 NUMBER(38,0) CHECK (num4 >= 0)); ­­ UNSIGNED INT Table created. SQL> INSERT INTO sample_numbers VALUES(24.62, 24, 24.62, 24); SQL> INSERT INTO sample_numbers (num1, num4) VALUES (­1, ­1); INSERT INTO sample_numbers (num1, num4) VALUES (­1, ­1) * ERROR at line 1: ORA­02290: check constraint (STUDENT.SYS_C0010364) violated Oracle: Håndtering av tall Metadata: Bruk ALL_, DBA_ og USERS_ views. SQL> SELECT utc.column_id, utc.column_name, utc.data_type, utc.data_length, utc.data_precision FROM user_tab_columns utc WHERE utc.table_name = 'SAMPLE_NUMBERS'; Column ID # Column Name Data Type Data Length Data Precision ­­­­­­ ­­­­­­­­­­­ ­­­­­­­­­­ ­­­­­­­­­­­ ­­­­­­­­­­­­­­ 1 NUM1 NUMBER 22 12 2 NUM2 NUMBER 22 3 NUM3 FLOAT 22 12 4 NUM4 NUMBER 22 38 57 MySQL: Håndtering av tall MySQL: Bruk DECIMAL, de andre er alias. SQL> CREATE TABLE number_table (num1 DEC(65,2), num2 DECIMAL(65,2), num3 NUMERIC(65,2), num4 FIXED(65,2)); Query OK, 0 rows affected (0.01 sec) MySQL> DESCRIBE number_table; +­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­+ | Field | Type | Null | Key | Default | Extra | +­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­+ | num1 | decimal(65,2) | YES | | NULL | | | num2 | decimal(65,2) | YES | | NULL | | | num3 | decimal(65,2) | YES | | NULL | | | num4 | decimal(65,2) | YES | | NULL | | +­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­+ 4 rows in set (0.00 sec) 58 MySQL: Håndtering av tall 59 Metadata: columns, table_constraints, key_column_usage. MySQL> USE information_schema; MySQL> SELECT c.ordinal_position, c.table_name, c.column_name, c.data_type, IFNULL(c.character_maximum_length,c.numeric_precision) AS Size FROM columns c WHERE c.table_name = 'number_table'; +­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­+ | ordinal_position | table_name | column_name | data_type | Size | +­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­+ | 1 | number_table | num1 | decimal | 65 | | 2 | number_table | num2 | decimal | 65 | | 3 | number_table | num3 | decimal | 65 | | 4 | number_table | num4 | decimal | 65 | +­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­+ MySQL: Unsigned integers 60 MySQL: SQL> CREATE TABLE integer_sample (positive_spectrum INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, full_spectrum INT NOT NULL, fill_full_spectrum INT ZEROFILL, fill_pos_spectrum INT UNSIGNED ZEROFILL); Query OK, 0 rows affected (0.01 sec) MySQL> DESCRIBE integer_sample; +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+... | Field | Type | Null | Key |... +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+... | positive_spectrum | int(10) unsigned | NO | PRI |... | full_spectrum | int(11) | NO | |... | fill_full_spectrum | int(10) unsigned zerofill | YES | |... | fill_pos_spectrum | int(10) unsigned zerofill | YES | |... +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+... 4 rows in set (0.00 sec) MySQL: Unsigned integers 61 MySQL: SQL> CREATE TABLE integer_sample (positive_spectrum INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, full_spectrum INT NOT NULL, fill_full_spectrum INT ZEROFILL, fill_pos_spectrum INT UNSIGNED ZEROFILL); Query OK, 0 rows affected (0.01 sec) MySQL> DESCRIBE integer_sample; +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+... | Field | Type | Null | Key |... +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+... | positive_spectrum | int(10) unsigned | NO | PRI |... | full_spectrum | int(11) | NO | |... | fill_full_spectrum | int(10) unsigned zerofill | YES | |... | fill_pos_spectrum | int(10) unsigned zerofill | YES | |... +­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­­­­­­­­­­­­­­­­­+­­­­­­+­­­­­+... 4 rows in set (0.00 sec) MySQL: Håndtering av tekst MySQL: VARCHAR mest benyttet. SQL> CREATE TABLE variable_width (var1 VARCHAR(10), var2 VARCHAR(10) BINARY, var3 CHARACTER VARYING(10), var4 NVARCHAR(10), var5 NATIONAL CHARACTER(10), var6 VARBINARY(10)); MySQL> DESCRIBE variable_width; +­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­+ | Field | Type | Null | Key | Default | Extra | +­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­+ | var1 | varchar(10) | YES | | NULL | | | var2 | varchar(10) | YES | | NULL | | | var3 | varchar(10) | YES | | NULL | | | var4 | varchar(10) | YES | | NULL | | | var5 | char(10) | YES | | NULL | | | var6 | varbinary(10) | YES | | NULL | | +­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­+­­­­­+­­­­­­­­­+­­­­­­­+ 62 MySQL: DATE/TIME MySQL Format DATE DATETIME TIMESTAMP TIME YEAR 'YYYY-MM-DD' 'YYYY-MM-DD HH24:MI:SS' 'YYYY-MM-DD HH24:MI:SS' 'HH24:MI.SS' 'YYYY' MySQL> SELECT current_date(); +­­­­­­­­­­­­­­­­+ | current_date() | +­­­­­­­­­­­­­­­­+ | 2012­09­17 | +­­­­­­­­­­­­­­­­+ MySQL> SELECT current_timestamp(); +­­­­­­­­­­­­­­­­­­­­­+ | current_timestamp() | +­­­­­­­­­­­­­­­­­­­­­+ | 2012­09­17 13:39:52 | +­­­­­­­­­­­­­­­­­­­­­+ 63 MySQL: DATETIME og TIMESTAMP 64 MySQL: Kan kun ha EN TIMESTAMP kolonne i en tabell. SYSDATE som i Oracle må simuleres. MySQL> CREATE TABLE sample (sample_id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, created DATETIME, updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); Oracle: Partisjonering 65 Oracle: RANGE, LIST, HASH og SAMMENSATT. Eksempel: LIST partisjonering: SQL> CREATE TABLE franchise (franchise_id NUMBER CONSTRAINT pk_franchise PRIMARY KEY, franchise_name VARCHAR2(20), city VARCHAR2(20), state VARCHAR2(20)) PARTITION BY LIST(state) (PARTITION offshore VALUES('Alaska','Hawaii'), PARTITION west VALUES('California','Oregon','Washington'), PARTITION desert VALUES('Arizon','New Mexico'), PARTITION rockies VALUES('Colorado','Idaho','Montana','Wyoming') ...); CREATE TABLE franchise * ERROR at line 1: ORA­00439: feature not enabled: Partitioning MySQL: Partisjonering 66 MySQL supporterer RANGE, LIST, HASH og KEY. Eksempel: RANGE partisjonering: MySQL> CREATE TABLE ordering (ordering_id INT UNSIGNED AUTO_INCREMENT, item_id INT UNSIGNED, rental_amount DECIMAL(15,2), rental_date DATE, index idx(ordering_id)) PARTITION BY RANGE(item_id) (PARTITION jan2012 VALUES LESS THAN(10000), PARTITION feb2012 VALUES LESS THAN(20000), PARTITION mar2012 VALUES LESS THAN(30000)); MySQL: Partisjonering 67 MySQL RANGE slik du er vant til i Oracle. MySQL> CREATE TABLE report_status ( report_id INT NOT NULL, report_status VARCHAR(20) NOT NULL, report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) ( PARTITION jan2012 VALUES LESS THAN ( UNIX_TIMESTAMP('2012­02­01 00:00:00') ), PARTITION feb2012 VALUES LESS THAN ( UNIX_TIMESTAMP('2012­03­01 00:00:00') ), PARTITION mar2012 VALUES LESS THAN ( UNIX_TIMESTAMP('2012­04­01 00:00:00') ), ... PARTITION div2012 VALUES LESS THAN (MAXVALUE)); Query OK, 0 rows affected (0.02 sec) SELECT: Ulike funksjoner CONCAT Oracle: SQL> SELECT i.title AS title, 'MPAA: ' || i.rating AS rating FROM item i; TITLE RATING ­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­ Star Wars I MPAA: PG Star Wars II MPAA: PG MySQL: MySQL> SELECT i.title AS title, CONCAT('MPAA: ', i.rating) AS rating FROM item i; +­­­­­­­­­­­­­­+­­­­­­­­­­+ | title | rating | +­­­­­­­­­­­­­­+­­­­­­­­­­+ | Star Wars I | MPAA: PG | | Star Wars II | MPAA: PG | +­­­­­­­­­­­­­­+­­­­­­­­­­+ 68 SELECT: Ulike funksjoner LIMIT Oracle: SQL> SELECT i.title AS title FROM item i WHERE rownum <= 2; TITLE ­­­­­­­­­­­­­­­ Star Wars I Star Wars II MySQL: LIMIT offset, n MySQL> SELECT i.title AS title FROM item i LIMIT 2; +­­­­­­­­­­­­­­+ | title | +­­­­­­­­­­­­­­+ | Star Wars I | | Star Wars II | +­­­­­­­­­­­­­­+ 69 SELECT: Ulike funksjoner Regulære uttrykk Oracle: SQL> SELECT i.title AS title FROM item i WHERE REGEXP_LIKE(i.title, '^Star Wars.+'); TITLE ­­­­­­­­­­­­­­­ Star Wars I Star Wars II MySQL: SQL> SELECT i.title AS title FROM item i WHERE i.title REGEXP '^Star Wars.+'; +­­­­­­­­­­­­­­+ | title | +­­­­­­­­­­­­­­+ | Star Wars I | | Star Wars II | +­­­­­­­­­­­­­­+ 70 INSERT Oracle SQL> DESCRIBE rental SQL> INSERT INTO rental Name Null? Type VALUES ­­­­­­­­­­­­­­­­­ ­­­­­­­­ ­­­­­­ (rental_seq.nextval, RENTAL_ID NOT NULL NUMBER 1009, CUSTOMER_ID NOT NULL NUMBER SYSDATE, CHECK_OUT_DATE NOT NULL DATE TRUNC(SYSDATE + 5), RETURN_DATE DATE 1, CREATED_BY NOT NULL NUMBER SYSDATE, CREATION_DATE NOT NULL DATE 1, LAST_UPDATED_BY NOT NULL NUMBER SYSDATE); LAST_UPDATE_DATE NOT NULL DATE 71 INSERT 72 Oracle MySQL SQL> INSERT INTO rental VALUES (rental_seq.NEXTVAL, 1009, SYSDATE, TRUNC(SYSDATE + 5), 1, SYSDATE, 1, SYSDATE); MySQL> INSERT INTO rental VALUES (NULL, 1009, NOW(), ADDDATE(UTC_DATE(),INTERVAL 5 DAY), 1, NOW(), 1, NOW()); INSERT MySQL: AUTO_INCREMENT MySQL> SHOW TABLE STATUS LIKE 'rental'\G *************************** 1. row *************************** Name: rental Engine: InnoDB Version: 10 Row_format: Compact Rows: 2 Avg_row_length: 8192 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 5242880 Auto_increment: 2 Create_time: 2012­09­19 08:22:28 Update_time: NULL Check_time: NULL Collation: latin1_swedish_ci 73 INSERT logikk Oracle: 74 MySQL: MySQL> START TRANSACTION; Query OK, 0 rows affected (0.00 sec) SQL> INSERT INTO parent VALUES (parent_seq.NEXTVAL, 'One Parent'); 1 row created. MySQL> INSERT INTO parent VALUES (NULL, 'One Parent'); Query OK, 1 row affected (0.00 sec) SQL> INSERT INTO child VALUES (child_seq.NEXTVAL, parent_seq.CURRVAL, 'One Child'); 1 row created. MySQL> INSERT INTO child VALUES (NULL, last_insert_id(), 'One Child'); Query OK, 1 row affected (0.00 sec) SQL> COMMIT; MySQL> COMMIT; Query OK, 0 rows affected (0.01 sec) Commit complete. UPDATE ORACLE: SET SQL> UPDATE item SET (item_title, item_rating) = (SELECT item_title, item_rating FROM import_item WHERE item_barcode = 'B004A8ZWUG') WHERE item_title = 'Pirates of the Caribbean 4'; MySQL: LIMIT, IGNORE, ORDER BY og runtime priority SQL> UPDATE teeshirt SET teeshirt_size = DEFAULT ORDER BY teeshirt_id DESC LIMIT 2; 75 UPDATE – flere tabeller 76 MySQL: SQL> UPDATE rental_item ri SET ri.rental_item_price = (SELECT p.amount FROM price p CROSS JOIN rental r WHERE p.item_id = ri.item_id AND p.price_type = ri_rental_item_type AND r.rental_id = ri.rental_id AND r.check_out_date BETWEEN p.start_date AND IFNULL(p.end_date, UTC_DATE()); MySQL: (ikke relevant for Oracle) SQL> UPDATE rental_item ri JOIN rental r ON ri.rental_id JOIN price p ON ri.item_id = p.item_id AND ri.rental_item_type = p.price_type AND r.check_out_date BETWEEN p.start_date AND IFNULL(p.end_date, UTC_DATE()) SET ri.rental_item_price = p.amount; DELETE – ANSI SQL-89/92 77 MySQL ANSI SQL-89: SQL> DELETE rental_item FROM rental_item, price p, rental r WHERE p.item_id = rental_item.item_id AND p.price_type = rental_item.rental_item_type AND r.rental_id = rental_item.rental_id AND r.check_out_date BETWEEN p_start_date AND IFNULL(p.end_date, UTC_DATE()); MySQL: ANSI SQL-92: SQL> DELETE ri, p, r FROM rental_item AS ri INNER JOIN price AS p ON ri.item_id = p.item AND ri.rental_item_type = p.price_type INNER JOIN rental AS r ON ri.rental_id = r.rental_id WHERE r.check_out_date BETWEEN p_start_date AND IFNULL(p.end_date, UTC_DATE()); Spørring, føye sammen data ORACLE: ||-tegn (pipe) SQL> SELECT i.item_title AS title, 'MPAA: ' || i.item_rating AS rating FROM item i WHERE i.item_rating = 'PG' AND i.item_title = 'Star Wars%; MySQL: CONCAT-funksjon SQL> SELECT i.item_title AS title, CONCAT('MPAA: ', i.item_rating) AS rating FROM item i WHERE i.item_rating = 'PG' AND i.item_title = 'Star Wars%; CONCAT('Tekst ', CONCAT('Mere tekst ', 'Tekst igjen.')) 78 Spørring, formatering 79 ORACLE: TO_CHAR-funksjon SQL> SELECT t.transaction_date, TO_CHAR(t.transaction_amount, '90.00') AS price, TO_CHAR(t.transaction_amount * .25, '90.00') AS tax FROM transaction t WHERE t.transaction_date = '10­JAN­2013'; MySQL: FORMAT-funksjon SQL> SELECT t.transaction_date, FORMAT(t.transaction_amount, 2) AS price, FORMAT(t.transaction_amount * .25, 2) AS tax FROM transaction t WHERE t.transaction_date = '10­JAN­2013'; Regulære utrykk ORACLE: REGEXP_LIKE-funksjon SQL> SELECT i.item_title AS title, 'MPAA: ' || i.item_rating AS rating FROM item i WHERE i.item_rating = 'PG' AND REGEXP_LIKE(i.item_title, '^Star Wars.+'); MySQL: REGEXP-funksjon SQL> SELECT i.item_title AS title, CONCAT('MPAA: ', i.item_rating) AS rating FROM item i WHERE i.item_rating = 'PG' AND i.item_title REGEXP '^Star Wars.+'; 80 Inline view ORACLE: SQL> SELECT c.first_name || ' ' || c.last_name AS person, inline.street_address, inline.city, inline.state_province FROM contact c INNER JOIN (SELECT a.contact_id, sa.street_address, a.city, a.state_province FROM address a INNER JOIN street_address sa ON a.address_id = sa.address_id) inline ON inline.contact_id = c.contact_id; 81 Inline view MySQL: SQL> SELECT CONCAT(c.first_name, ' ', c.last_name AS person, inline.street_address, inline.city, inline.state_province FROM contact c INNER JOIN (SELECT a.contact_id, sa.street_address, a.city, a.state_province FROM address a INNER JOIN street_address sa ON a.address_id = sa.address_id) inline ON inline.contact_id = c.contact_id; 82 Inline view med WITH ORACLE: ANSI SQL-1999 SQL> WITH inline AS (SELECT a.contact_id, sa.street_address, a.city, a.state_province FROM address a INNER JOIN street_address sa ON a.address_id = sa.address_id) SELECT c.first_name || ' ' || c.last_name AS person, inline.street_address, inline.city, inline.state_province FROM contact c INNER JOIN inline inline ON inline.contact_id = c.contact_id; 83 SQL utvalg 84 ORACLE: DECODE-funksjon SQL> SELECT DECODE('One', 'One', 'Same') AS "Test 1", DECODE('One', 'Two', 'Same') AS "Test 2", DECODE('One', 'One', 'Same','Not same') AS "Test 2", DECODE('One', 'Two', 'Same','Not same') AS "Test 2" FROM dual; Test 1 Test 2 Test 2 Test 2 ­­­­­­­­­­ ­­­­­­­­­­ ­­­­­­­­­­ ­­­­­­­­­­ Same NULL Same Not same ● Ikke portabelt. SQL utvalg ORACLE: DECODE eksempel SQL> WITH inline AS (SELECT 'Single' AS marital_status FROM dual UNION ALL SELECT 'Single' AS marital_status FROM dual UNION ALL SELECT 'Married' AS marital_status FROM dual) SELECT COUNT(DECODE(inline.marital_status,'Single',1)) AS Single FROM inline; SINGLE ­­­­­­­­­­ 2 85 SQL utvalg 86 MySQL: IF SQL> SELECT IF('Star Wars VII' IN (SELECT item_title FROM title) , 'In Stock', 'Out of Stock') AS "Stock"; +­­­­­­­­­­­­­­­­­­­­­­+ | Stock | +­­­­­­­­­­­­­­­­­­­­­­+ | Out og stock | +­­­­­­­­­­­­­­­­­­­­­­+ ● Ikke portabelt. SQL utvalg - ANSI ORACLE: CASE eksempel SQL> SELECT CASE WHEN 'Star Wars VII' IN (SELECT item_title FROM item) THEN 'In­stock' ELSE 'Out­of­stock' END AS yes_no_answer FROM dual; YES_NO_ANSWER ­­­­­­­­­­­­­ In­stock 87 SQL utvalg - ANSI 88 MySQL: CASE student@ougn mySQL> SELECT ­> CASE ­> WHEN 'Star Wars VII' IN (SELECT item_title FROM item) ­> THEN 'In­stock' ­> ELSE 'Out­of­stock' ­> END AS yes_no_answer ­> FROM dual; +­­­­­­­­­­­­­­­+ | yes_no_answer | +­­­­­­­­­­­­­­­+ | In­stock | +­­­­­­­­­­­­­­­+ 1 row in set (0,00 sec) SQL utvalg - Dato 89 ORACLE: DATE funksjon HR@OUGN SQL> SELECT SYSDATE ­ 1 AS Yesterday, SYSDATE AS Today, SYSDATE + 1 AS Tomorrow FROM dual; YESTERDAY TODAY TOMORROW ­­­­­­­­­­ ­­­­­­­­­­ ­­­­­­­­­­ 14/04/2013 15/04/2013 16/04/2013 SQL> ALTER SESSION SET nls_date_format='DD/MM/YYYY HH24:MI:SS'; HR@OUGN SQL> SELECT SYSDATE ­ 1 AS Yesterday, SYSDATE AS Today, SYSDATE + 1 AS Tomorrow FROM dual; YESTERDAY TODAY TOMORROW ­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­ 14/04/2013 07:22:12 15/04/2013 07:22:12 16/04/2013 07:22:12 SQL utvalg - Dato MySQL: DATE funksjon mysql> SELECT DATE_ADD(UTC_DATE(), INTERVAL 6 DAY); +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | DATE_ADD(UTC_DATE(), INTERVAL 6 DAY) | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | 2013­04­21 | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ mysql> SELECT DATE_ADD(UTC_DATE(), INTERVAL 1 WEEK); +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | DATE_ADD(UTC_DATE(), INTERVAL 1 WEEK) | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | 2013­04­22 | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ mysql> SELECT DATEDIFF('2013­01­01','2013­04­01'); +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | DATEDIFF('2013­01­01','2013­04­01') | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | ­90 | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ 90 SQL utvalg – Dato format MySQL: mysql> SELECT DATE_FORMAT(UTC_DATE(), '%D %M %Y'); +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | DATE_FORMAT(UTC_DATE(), '%D %M %Y') | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ | 15th April 2013 | +­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­+ MySQL følger samme system som i Linux og Unix: %b – Måned i kortform %m – Måned, 1-12 %M – Måned %h – Timer, 1-12 %H – Timer, 0-23 %y – År med to tegn %Y – År med fire tegn 91 SQL Inner Join 92 ORACLE: ANSI-89 HR@OUGN SQL> SELECT COUNT(*) FROM member m, contact c WHERE m.member_id = c.member_id; COUNT(*) ­­­­­­­­­­ 123677 ANSI-92 HR@OUGN SQL> SELECT COUNT(*) FROM member m INNER JOIN contact c USING (member_id); COUNT(*) ­­­­­­­­­­ 123677 SQL Inner Join 93 MySQL: ANSI-89 HR@OUGN SQL> SELECT COUNT(*) FROM member m, contact c WHERE m.member_id = c.member_id; +­­­­­­­­­­+ | COUNT(*) | +­­­­­­­­­­+ | 123677 | +­­­­­­­­­­+ ANSI-92 HR@OUGN SQL> SELECT COUNT(*) FROM member m INNER JOIN contact c USING (member_id); +­­­­­­­­­­+ | COUNT(*) | +­­­­­­­­­­+ | 123677 | +­­­­­­­­­­+ SQL Outer Join ORACLE: HR@OUGN SQL> SELECT * FROM food f; ID FOOD Y ANIMAL ­­­ ­­­­­­­­­­­­­­­­ ­ ­­­­­­­­­­­­­­­­ 1 apple Y human 2 oranges Y human 3 apple N dog 4 oranges N dog 5 apple N cat 6 oranges N cat HR@OUGN SQL> SELECT * FROM animals a; NAME WEIGHT ­­­­­­­­­­­­­­­­ ­­­­­­­­­­ cat 12 dog 25 94 SQL Outer Join ORACLE: HR@OUGN SQL> SELECT f.*, a.weight FROM food f, animals a WHERE f.animal = a.name; ID FOOD Y ANIMAL WEIGHT ­­­ ­­­­­­­­­­­­­­­­ ­ ­­­­­­­­­­­­­­­­ ­­­­­­­­­­ 3 apple N dog 25 4 oranges N dog 25 5 apple N cat 12 6 oranges N cat 12 HR@OUGN SQL> SELECT f.*, a.weight FROM food f, animals a WHERE f.animal = a.name(+); ID FOOD Y ANIMAL WEIGHT ­­­ ­­­­­­­­­­­­­­­­ ­ ­­­­­­­­­­­­­­­­ ­­­­­­­­­­ ... 3 apple N dog 25 2 oranges Y human 1 apple Y human 95 SQL Outer Join ORACLE: ANSI-92 HR@OUGN SQL> SELECT f.*, a.weight FROM food f LEFT JOIN animals a ON (f.animal=a.name); ID FOOD Y ANIMAL WEIGHT ­­­ ­­­­­­­­­­­­­­­­ ­ ­­­­­­­­­­­­­­­­ ­­­­­­­­­­ 6 oranges N cat 12 5 apple N cat 12 4 oranges N dog 25 3 apple N dog 25 2 oranges Y human 1 apple Y human HR@OUGN SQL> SELECT f.*, a.weight FROM food f LEFT OUTER JOIN animals a ON (f.animal=a.name); 96 SQL Outer Join MySQL: ANSI-92 HR@OUGN SQL> SELECT f.*, a.weight FROM food f LEFT JOIN animals a ON (f.animal=a.name); +­­­­+­­­­­­­­­+­­­­­­­+­­­­­­­­+­­­­­­­­+ | id | food | yummy | animal | weight | +­­­­+­­­­­­­­­+­­­­­­­+­­­­­­­­+­­­­­­­­+ | 5 | apple | N | cat | 12 | | 6 | oranges | N | cat | 12 | | 3 | apple | N | dog | 25 | | 4 | oranges | N | dog | 25 | | 1 | apple | Y | human | NULL | | 2 | oranges | Y | human | NULL | +­­­­+­­­­­­­­­+­­­­­­­+­­­­­­­­+­­­­­­­­+ HR@OUGN SQL> SELECT f.*, a.weight FROM food f LEFT OUTER JOIN animals a ON (f.animal=a.name); 97