Creating Database Tables CS 320 Review: Levels of data models Conceptual: describes WHAT data the system contains 2. Logical: describes HOW the database will be structured, regardless of the DBMS 3. Physical: describes HOW the database will be implemented using a specific DBMS 1. Required Software MySQL DBMS MySQL Workbench SQL editor (or another command-line SQL query editor) Review: Web/Database Architecture 2. Request for Web page that requires database data 1. Request for Web page that requires database data Network 5. Web page HTML file containing database data downloaded to client Web server 3. Runs a program that makes a data request 4. Data response Database server 6. Web page HTML file downloaded to client Web browser MySQL Workbench Architecture 2. SQL command 1. SQL command Network 3. Response (error or confirmation) Database server 4. Response (error or confirmation) Client running Workbench Workbench uses: Running commands to create tables (only way) Testing queries to use in PHP pages (later) MySQL Database Structure A MySQL database consists of multiple user accounts Also called database schemas MySQL databases in general: A user account can contains different databases UWEC MySQL database: In our configuration, you can't create new databases All of your tables are in the same database MySQL Database Structure UWEC MySQL database: In our configuration, you can't create new databases All of your tables are in the same database Issues? All tables must have a unique name For your projects, you'll use a group database account SQL Command Types Data Definition Language (DDL) Used to create and modify database objects Data Manipulation Language (DML) Used to insert, update, delete, and view the data in database objects DDL Commands Used to create and modify database objects CREATE ALTER DROP DDL commands execute as soon as they are issued, and do not need to be explicitly saved Creating a New Database CREATE DATABASE database_name - General syntax CREATE DATABASE candy - Specific example **You won't do this with the UWEC MySQL database Specifying Which Database to Use For Creating Tables USE database_name USE candy You'll need to specify to USE your database: USE morrisjp; Creating a Database Table CREATE TABLE table_name (field1_name datatype size, field2_name datatype size, …) CREATE TABLE candy_product (prod_id BIGINT, prod_desc VARCHAR(30), prod_cost DECIMAL(5,2), prod_price DECIMAL(5,2)) General Notes on SQL Commands Not case-sensitive Can span multiple lines in a text editor To run multiple statements in the editor window, separate each statement with ; To "comment out" (not execute) a statement, enclose it in /* … */ Naming Tables and Fields Database table and field name rules 1 to 64 characters long Can contain letters, numbers, or underscores Can't contain certain characters (/ \ ,) or characters not permitted in file names Every table in your database must have a unique name Every field in a table must have a unique name Good* Table Naming Practices Name every table using a combination of 2 words, separated by an underscore This approach avoids using reserved words Use the same descriptive first word for all tables in a related database *Required in this class Good* Field Naming Practices Name every field using a combination of 2 words, with the first word indicating the table name Avoids creating homonyms What about foreign keys? Use the name that is in the parent table *Required in this class Database Field Data Types Specify: Type of data the field stores Maximum data size Purpose: Specify internal encoding Optimize internal storage use Provide error checking Main Data Types Text data types CHAR VARCHAR Number data types Integers: INT and variations Floating point numbers: DECIMAL, FLOAT Dates & times DATE, TIME, and variations CHAR Data Type For fixed-width character fields (1-255 characters) Fields in which you know the exact number of characters Pads out the remaining characters with blank spaces Removes the trailing blank spaces when data is retrieved fieldname CHAR(size) cust_type CHAR(1) VARCHAR Data Type For variable-width character fields (1-255 characters) Number of characters varies for individual data values Values are not padded with blank spaces fieldname VARCHAR(maxsize) cust_name VARCHAR(30) MySQL Number Data Types: Integers TINYINT SMALLINT Signed: -32768 to 32767 Unsigned: 0 to 65535 INT Signed: -128 to 127 Unsigned: 0 to 255 Signed: -2147483648 to 2147483647 Unsigned: 0 to 4294967295 BIGINT Signed: -9223372036854775808 to 9223372036854775807 Unsigned: 0 to 18446744073709551615 Integer Data Type Usage Choose the "smallest" integer type (SMALLINT, INT, BIGINT) that is big enough to hold the largest possible value Question: Why not just always use BIGINT? Integer Data Type Examples fieldname integer_data_type prod_id TINYINT cust_id INT purch_id BIGINT MySQL Numeric Data Types: Floating Point Numbers For values that have a decimal portion DOUBLE or FLOAT: very large or very small values that have an indeterminate number of decimal places DOUBLE: takes more space, but is extremely accurate (15 decimal places) FLOAT: takes less space, use when extreme accuracy isn't required DECIMAL: for values that have a predetermined number of decimal places Floating Point Examples fieldname FLOAT fieldname DOUBLE fieldname DECIMAL(precision, scale) pounds FLOAT prod_cost DECIMAL(5,2) Why not just omit the precision and scale? It defaults to the Maximum allowed by your hardware… Think critically: Why not just declare all numeric values using the DOUBLE data type? That will take care of all cases. This doesn't make use of error checking This doesn't optimize use of data storage capacity Character and Numeric Data Type Usage Numeric Surrogate keys (primary key ID values) All numeric data you might use in a calculation (prices, quantities, etc.) Character: Use an appropriate character data type for all fields that are not numbers or dates Names, addresses, etc. Postal codes, telephone numbers, social security numbers MySQL Date and Time Data Types DATE Dates ranging from 1000-01-01 to 9999-12-31 Display in the format YYYY-MM-DD TIME Times ranging from is -838:59:59 to 838:59:59 Can also be used to represent elapsed time intervals Display in the format HH:MI:SS MySQL Date and Time Data Types (continued) DATETIME Used to store both a date and time component ranging from 1000-01-01 00:00:00 to 9999-12-31 23:59:59 Displays in the format YYYY-MM-DD HH:MI:SS YEAR Can store either a 2-digit or 4-digit year 4-digit range: 1901 to 2155 2-digit range: 70 to 69 (1970 – 2069) Review: Creating a Database Table CREATE TABLE table_name (field1_name datatype size, field2_name datatype size, …) CREATE TABLE candy_purchase( purch_id INT, prod_id INT, cust_id INT, purch_date DATE, purch_delivery_date DATE, purch_pounds FLOAT, purch_status VARCHAR(10)) Scripts Text files that contain a series of SQL commands Each command separated by ; Purpose: Write a series of commands and then execute them all at once Create all tables in a database Insert a set of test records into the tables Issue with a script that creates all of the tables in a database: You can't create two tables with the same name in the same database In a script file, you always need to (try to) DROP all tables first before you create them Dropping a Database Table DROP TABLE table_name DROP TABLE IF EXISTS table_name Use IF EXISTS in a script to avoid error messages Example DROP TABLE Commands in a Script /*commands DROP TABLE DROP TABLE DROP TABLE DROP TABLE to IF IF IF IF drop all tables */ EXISTS candy_purchase; EXISTS candy_customer; EXISTS candy_cust_type; EXISTS candy_product; /*commands to create tables */ CREATE TABLE candy_cust_type (… Creating Tables in the MySQL Visual Environment Generates the SQL command to create the table Doesn't save the command or generate a script Test Yourself: What data type declaration would you use to create a database field that stores part descriptions (DESCRIPTION) in the Premiere Products PART table? a. b. c. d. e. VARCHAR(30) CHAR(30) VARCHAR(10) CHAR(10) None of the above Test Yourself: What data type would you use to create a database field that stores part quantities on hand (ON_HAND) in the Premiere Products PARTS table? a. b. c. d. e. INT SMALLINT BIGINT DECIMAL Either a or b ON_HAND 50 45 32 21 8 12 22 12 8 9 Test Yourself: What data type declaration would you use to create a database field that stores part prices (PRICE) in the Premiere Products PARTS table? a. b. c. d. e. VARCHAR(10) DECIMAL(4,2) DECIMAL(5,2) DOUBLE None of the above PRICE $24.95 $794.95 $165.00 $129.95 $495.00 $399.99 $159.95 $349.95 $595.00 $1390.00 Test Yourself: What data type would you use to store ZIP code (ZIP) values in the Premiere Products REP table? a. b. c. d. e. CHAR(5) TINYINT DECIMAL(5,0) VARCHAR(10) None of the above ZIP 33321 33553 33336