This Document Contains Chapters 1 to 6 Chapter 1 Overview of Database Concepts At a Glance Instructor’s Notes • Chapter Overview • Chapter Objectives • Instructor Notes • Troubleshooting Tips • Quick Quizzes • Discussion Questions • Key Terms Chapter Overview In this chapter, you will learn basic database concepts. You will learn how a database management system (DBMS) can be used to create, modify, and store data. Of particular importance is the design process. The design process includes creating an entity-relationship model (E-R model) and normalizing data through various stages. This chapter concludes with an overview of the JustLee Books database that is referenced throughout the book. Chapter Objectives After completing this chapter, you should be able to do the following: • Define database terms • Identify the purpose of a database management system (DBMS) • Explain database design using entity-relationship models and normalization • Explain the purpose of a Structured Query Language (SQL) • Understand how this textbook’s topics are sequenced and how the two sample databases are used Instructor Notes The hands-on exercises at the end of this chapter focus on two topics: getting familiar with the JustLee Books database contents and developing Entity Relationship Diagrams. The case study at the end of this chapter will be quite challenging for students brand new to databases. If this is This Document Contains Chapters 1 to 6 the case, you may wish to have students only address a portion of this design assignment. Point out that this chapter serves only as an introduction to database design, and entire books and courses exist for data modeling topics. The next chapter will present instructions for students to create the database using a provided script. Students will need the capability to create tables and perform DML activity to build the JustLee Books database. Please review the Instructor’s Setup Guide provided in the Instructor Downloads area for suggestions in providing students access to an Oracle server. Database Terminology In a relational database model, data are stored in tables. The table represents a particular entity. The columns in a table represent attributes or characteristics about the entity, while the rows signify an occurrence of the entity. The smallest unit of data is a character. A column is also referred to as a field, and a row is also referred to as a record. Troubleshooting Tip Set up a scenario of students/courses/faculty or patients/doctors/procedures as a demonstration of the different steps in the design of a database. For example, all patients fill out a form during the first visit. Identify a character, a field, a record, etc. Quick Quiz 1. What makes up a record? ANSWER: A group of related fields 2. What is an attribute? ANSWER: A single element of data that is to be collected about an entity 3. What is a field called in the physical database? ANSWER: A column 4. What is a record called in the physical database? ANSWER: A row 5. What is a file called in the physical database? ANSWER: A table Database Management System A database is typically enveloped within a database management system, which provides a variety of functionality to create a production system environment. Functionality ranges from multiuser access to backup capabilities. Database Design The Systems Development Life Cycle (SDLC) is a generic process that can serve as a guideline for creating various types of systems. It is a somewhat linear process; however, it is not uncommon in a large project for the steps to overlap. In addition, if a problem is discovered during the process, this may require the designer(s) to return to a previous step to determine the underlying cause. Quick Quiz 1. What type of problem can result from data redundancy? ANSWER: Inconsistency in the data (i.e., not all copies of the data are updated correctly) making the data unreliable 2. What is the purpose of normalization? ANSWER: To reduce data redundancy 3. What is the purpose of a primary key? ANSWER: To uniquely identify each record 4. What is the starting point for determining what should be included in a database? ANSWER: Identifying the information that must come out of the database (i.e., its purpose/objective) 5. What is the significance of a many-to-many relationship? ANSWER: It cannot be directly included in the physical relational database. Entity-Relationship (E-R) Model The ability to retrieve data from a database depends on how the data is structured. The E-R model is used to determine the different entities that will be depicted in the database. Once the entities are identified, the relationship among the entities must be determined. Any many-to- many relationships will need to be eliminated before the physical database is created. Usually, this is through the introduction of a bridging table. Each entity is typically represented in an E-R model as a box. Relationships between tables are represented with lines indicating the type of relationship: one-to-one, one-to-many, and many-to- many. A large percentage of relationships will be one-to-many. Troubleshooting Tip Continuing with the example from the previous section, identify each of the entities to be included in the database. Then identify attributes to be collected about each entity to prepare for the next section. It will help the student if the output objectives of the database are identified also. Database Normalization The normalization process is used to determine how the data should be structured within database tables to avoid data anomalies and redundancy. Most databases are normalized to third- normal form (3NF). This requires that each table have a primary key and contain no partial or transitive dependencies. Once the tables are normalized, the designer must ensure that data can be reconstructed through the appropriate foreign keys. Troubleshooting Tip Use one or two entities identified by the students and walk through the normalization process. Then divide the students into groups to complete the process with any remaining tables. Ensure that the output objectives can be achieved by including necessary foreign keys. Structured Query Language (SQL) SQL is not a programming language that supports application logic such as conditional processing or looping structures. It is a data sublanguage that is focused on data tasks, including queries, data modifications, and creating database objects. Every relational database supports SQL use at some level. SQL standards are established by the ANSI and ISO industry committees. SQL*Plus is the database interface tool used in this text. Quick Quiz 1. What is the purpose of SQL? ANSWER: It allows users to create database objects and enter, manipulate, and retrieve data from a database. 2. Who establishes the SQL standards? ANSWER: ANSI and ISO 3. What is SQL*Plus? ANSWER: An interactive tool provided by Oracle 12c to issue SQL statements 4. What is SQL? ANSWER: A data sublanguage 5. How is SQL different from a programming language? ANSWER: It works with sets of data and can navigate tables. Databases Used in this Textbook The basic assumption made by designers will ultimately determine the structure of the data. The database for JustLee Books is based on eight tables. The tables will allow a user to determine which books have been purchased by which customers, who published each book, the amount due for each order, etc. Please review the Instructor’s Additional Example Databases document provided in the Instructor Downloads area for other database examples that may be used for practical tests or additional exercises. Quick Quiz 1. What is the primary key for the BOOKS table? ANSWER: ISBN 2. Identify a foreign key in the ORDERITEMS table. ANSWER: Both Order# and ISBN columns 3. What is the purpose of the BOOKAUTHOR table? ANSWER: To eliminate the many-to-many relationship between the BOOKS and AUTHOR tables 4. How would the database structure be different if only one author was allowed to write each book? ANSWER: The BOOKAUTHOR bridging table would not have been necessary. 5. What is the primary key for the ORDERITEMS table? ANSWER: The composite primary key of Order# + Item# Troubleshooting Tip Help the students become familiar with the structure of the JustLee Books database by asking questions such as which author wrote a particular book, which book(s) was ordered by a customer, etc. Topic Sequence Many SQL books initially focus on database queries and address database creation in later chapters. This text initially focuses on the creation of a database to ensure that students understand the database structure, including constraints prior to accomplishing data manipulation or retrieval tasks. Software Used in this Textbook Oracle 12c provides two client tools that can be used to connect to an Oracle database and complete the exercises in this text: SQL*Plus and SQL Developer. The figures in the text display the SQL Developer interface; however, either tool may be used. For those using previous versions of Oracle, you also may elect to use the Internet interface tool named iSQL*Plus. Be aware that iSQL*Plus deprecated with Oracle 11g. Discussion Questions 1. Why go through the database design process? Wouldn’t it be simpler just to throw all of the data in one table? 2. Use the example scenario created in class and discuss some of the anomalies that would result if the data were not normalized. Key Terms American National Standards Institute (ANSI) — One of two industry-accepted committees that sets standards for SQL. bridging table — A table created to eliminate a many-to-many relationship between two tables. character — The basic unit of data. It can be a letter, number, or special symbol. column — In a relational database, fields are commonly represented as columns and may be referred to as "columns." common column — A column that exists in two or more tables and contains equivalent data. common field — A column that exists in two tables and is used to “join” two tables. data redundancy — Refers to having the same data in different places within a database, which wastes spaces and complicates database updates and changes. database — A collection of interrelated files. database management system (DBMS) — A generic term that applies to a software product that allows users to interact with a database to create and maintain the structure of the database, and then to enter, manipulate, and retrieve the data it stores. entity — Any person, place, or thing with characteristics or attributes that will be included in a database. In the E-R model, an entity is usually represented as a square or rectangle. Entity-Relationship (E-R) Model — A diagram that identifies the entities and data relationships in a database. The model is a logical representation of the physical system to be built. field — One attribute or characteristic of a database entity. file — A group of records about the same type of entity. first-normal form (1NF) The first step in the normalization process in which repeating groups of data are removed from database records. foreign key — When a common column exists in two tables, it will usually be a primary key in one table and will be called a foreign key in the second table. lookup table — A table referenced by a foreign key constraint normalization — A multistep process that allows designers to take the raw data about an entity and evolve the data into a form that will reduce a database’s data redundancy. primary key — A field that serves to uniquely identify a record in a database table. record — A collection of fields describing the attributes of one database element. In PL/SQL, a record is a composite datatype that can assume the same structure as the row being retrieved. row — A group of column values for a specific occurrence of an entity. In a database, records are commonly represented as rows. second-normal form (2NF) — The second step in the normalization process in which partial dependencies are removed from database records. SQL*Plus — A tool enabling users to interact with the database. Through SQL*Plus, users can enter SQL commands, set or alter environmental variables, display the structure of tables, and execute interactive scripts. structured query language (SQL) — The industry standard for interacting with a relational database. It is a data sublanguage, and unlike a programming language, it processes sets of data as groups and can navigate data stored within various tables. third-normal form (3NF) — The third step in the normalization process in which transitive dependencies are removed from database records. unnormalized — Refers to database records that contain repeating groups of data (multiple entries for a single column). Chapter 2 Basic SQL SELECT Statements At a Glance Instructor’s Notes • Chapter Overview • Chapter Objectives • Instructor Notes • Troubleshooting Tips • Quick Quizzes • Discussion Questions • Key Terms Chapter Overview The purpose of this chapter is to learn the basic SELECT statement used to retrieve data from a database table. The students will learn to use the SELECT clause to retrieve all columns, one column, and multiple columns from a table specified in the FROM clause. In addition, students learn how to perform simple arithmetic operations and concatenation in the SELECT clause. Students will need to execute the JLDB_Build.sql script file. Each student should be assigned a different user name so the generated tables will be located in a different schema for each student. Each student must be granted sufficient privileges to execute statements to create tables and execute queries. Chapter Objectives After completing this chapter, you should be able to do the following: • Identify keywords, mandatory clauses, and optional clauses in a SELECT statement • Select and view all columns of a table • Select and view one column of a table • Display multiple columns of a table • Use a column alias to clarify the contents of a particular column • Perform basic arithmetic operations in the SELECT clause • Remove duplicate lists using either the DISTINCT or UNIQUE keyword • Use concatenation to combine fields, literals, and other data Instructor Notes SELECT Statement Syntax Every SELECT statement is required to have a SELECT and FROM clause. Each statement clause begins with a keyword. The SELECT clause is used to identify the column or columns to be retrieved from a table. The name of the table is identified in the FROM clause. The structure of the SELECT statement is depicted in Figure 2-2. This chapter only addresses the SELECT and FROM clauses. Later chapters will address all of the remaining clauses. Quick Quiz 1. How do you retrieve all columns from a table without listing the column names? ANSWER: Use an asterisk in the SELECT clause 2. How do you separate multiple columns listed in a SELECT statement? ANSWER: Use commas 3. Are keywords case sensitive? ANSWER: No 4. Are column names case sensitive? ANSWER: No 5. Where do you identify the table containing the specified columns? ANSWER: In the FROM clause Troubleshooting Tip Demonstrate that SQL is not case sensitive in terms of the command keywords or column/table names when a command is executed. Also demonstrate the various methods of executing an SQL statement. Troubleshooting Tip Identify the two different Oracle SQL tool interfaces: the client SQL*Plus and SQL Developer. Appendix B introduces these interfaces. Selecting All Data in a Table The asterisk is used to represent all columns in a table. The asterisk is not a wildcard in the traditional sense. It has a specific use in SQL commands. If the asterisk is used in the SELECT clause, the clause can contain no other column references. Selecting One Column from a Table To select a specific column from a table, list the name of the column after the SELECT keyword. Note that the column name can be entered in uppercase, lowercase, or mixed case. However, the column name is displayed in uppercase characters by default. Selecting Multiple Columns from a Table If more than one column name is specified in the SELECT clause of the SELECT statement, they must be separated by a comma. Spaces between the column names and commas will not affect the results of the statement. Troubleshooting Tip For practice, have the students retrieve data from various tables. Start with selecting all of the columns from a table, then just one, and then several columns. Operations within the SELECT Statement Using Column Aliases A column alias can be used to give a more descriptive heading to a column of data. It should be listed directly after the column name, without a comma. If the alias consists of spaces or special symbols, or to retain the case, enclose the alias in double-quotation marks. Otherwise, simply list the column alias. The optional keyword AS can be used to denote the column alias. Using Arithmetic Operations Any basic arithmetic operation can be performed, with the exception of exponential operations. Oracle 12c follows the standard order of operations, which can be overridden using parentheses. The operation can be specified in the column list just like a column name. However, a column alias should be assigned or the column heading will display the express in the output. Troubleshooting Tip For practice, have the students calculate the profit, profit margin %, etc. and include a column alias. Using DISTINCT and UNIQUE To suppress duplicate rows in the output, enter the DISTINCT or UNIQUE keyword after the SELECT command. The keyword will apply to all columns listed in the SELECT clause, even though it is entered only once in the clause. Troubleshooting Tip Select a couple of columns from the BOOKS table and include the DISTINCT or UNIQUE keyword. Demonstrate that unless the entire row being displayed is identical, the same category name will be listed several times. Creating Concatenation Columns can be combined through the use of the concatenation operator. However, to include spaces or string literals, they must be enclosed in single quotation marks. Commas cannot be used in front of the concatenation operator or an error message will be returned. Quick Quiz 1. What is required if a column alias contains a blank space? ANSWER: The alias must be enclosed in double quotation marks. 2. What symbol is used for concatenation? ANSWER: Two vertical bars, || 3. What arithmetic operations can be used in a SELECT statement? ANSWER: *, /, +, - 4. How can Oracle11g identify a column alias without the AS keyword? ANSWER: There is no comma separating the column name from its alias. 5. Why use a column alias? ANSWER: To provide a more descriptive column heading Discussion Questions 1. Discuss the link(s) between the SELECT and FROM clauses. 2. Discuss case sensitivity and how it relates to the SELECT statement. Key Terms character field — A field composed of nonnumeric data. This field will not display a heading longer than the width of the data stored in the field. clause — Each section of a statement that begins with a keyword (SELECT clause, FROM clause, WHERE clause, etc.). column alias — Another name substituted for a column name. A column alias is created in a query and displayed in the results. concatenation — The combining the contents of two or more columns or character strings. Two vertical bars, or pipes (||), instruct Oracle 12c to concatenate the output of a query. keywords — Words used in a SQL query that have a predefined meaning to Oracle9i. Common keywords include SELECT, FROM, and WHERE. numeric column — A column composed of only numeric data. In output, the column will display the entire column heading, regardless of the width of the field. (Also known as a numeric field.) projection — Choosing specific column(s) in a SELECT statement. query — A question posed to the database. relational database management system (RDBMS) — A software program used to create a relational database. It has functions that allow users to enter, manipulate, and retrieve data. string literal — Alphanumeric data, enclosed within single quotation marks, that instructs the software to interpret “literally” exactly what has been entered and to show it in the resulting display. syntax — The basic structure, pattern, or rules, for an SQL statement. For an SQL statement to execute properly, the correct syntax must be used. Chapter 3 Table Creation and Management At a Glance Instructor’s Notes • Chapter Overview • Chapter Objectives • Instructor Notes • Troubleshooting Tips • Quick Quizzes • Discussion Questions • Key Terms Chapter Overview When a table is created, it must be assigned a name and at least one column must be defined. The name of the table must be unique. Each column within a table is assigned a column name and data type. The data type specifies what type of data will be stored in that column. In most cases, the width of the column can also be stated. In addition, a table can be created based on data retrieved through a subquery. Once a table has been created, the structure of the table can be changed using the ALTER TABLE command with the appropriate clause. To change the name of an existing table, the RENAME command is used. To execute the SQL commands introduced in this chapter, the students will need the system privilege CREATE TABLE. Because each student will retain ownership of the created tables, he or she will automatically have the object privileges associated with each table created. Chapter Objectives After completing this chapter, you should be able to do the following: • Identify the table name and structure • Create a new table using the CREATE TABLE command • Use a subquery to create a new table • Add a column to an existing table • Modify the definition of a column in an existing table • Delete a column from an existing table • Mark a column as unused and then delete it at a later time • Rename a table • Truncate a table • Drop a table Instructor Notes Table Design Before creating a table, the user should examine what type of data it will contain. Based on the normalization process used to determine the table contents, the actual data values to be stored in the table to determine the data type and width to be assigned to each column. The main datatypes presented in this text include VARCHAR2, CHAR, NUMBER, and DATE. Students will need to remember that table names must be unique, as must the column names within each table. Be aware that the naming rules, including the restriction on using reserved words, are quite often overlooked by those new to databases. Virtual column capability was added in Oracle 11g. Virtual columns can be defined as expressions referencing other column values. Extended data types is a new feature introduced with Oracle 12c which enables the storage of additional data bytes in specific data types such as VARCHAR2. Troubleshooting Tip Explain the problems that can occur if the tables are created “on the fly” without putting thought into the content of the tables are how they will be used— modification problems, cascading problems with applications programs that reference the table, and so on. Quick Quiz 1. A table name can consist of a maximum of how many characters? ANSWER: 30 2. What is the storage size for a DATE column? ANSWER: Seven bytes 3. A column name can consist of a maximum of how many characters? ANSWER: 30 4. Can a table or column name begin with a number? ANSWER: No 5. Is SYSDATE7 a valid table name? ANSWER: Yes, only because of the number 7, which makes it different from assigning the reserve word SYSDATE as the table name Table Creation The CREATE TABLE statement is used to add a new table to the database. This statement requires the table name, column names, and columns datatypes. Virtual columns were introduced in Oracle 11g. A DEFAULT option can be used to set an initial value on a column. A typical use of the DEFAULT option is to set a column to the current date so the user will not need to enter this data. Point out the optional schema qualification for the table name. Be sure students understand the concept of a schema. It is important for a database developer to be able to verify what tables exist and the structure of each. The USER_TABLES data dictionary view allows users to produce a list of tables that have been created. The DESCRIBE command displays the structure of a specific table. Invisible columns are a new option available in Oracle 12c. You can now create or alter a column to make it hidden so it is not visible in basic statement such as a “SELECT *” query. Quick Quiz 1. Which command is used to create a table? ANSWER: CREATE TABLE command 2. What is the maximum number of columns you can have in a database table? ANSWER: 1,000 3. How can a default value be assigned to a column during table creation? ANSWER: Use the DEFAULT keyword after defining the datatype for the column. 4. What command can be used to view the structure of a table? ANSWER: DESCRIBE 5. Is the DESCRIBE command a SQL command or a SQL*Plus command? ANSWER: SQL*Plus command Table Creation through Subqueries When a new table is being created to store data that is already contained within the database, the table can be created using a subquery. The AS keyword is used to specify that a subquery will be included in the CREATE TABLE command rather than a column definition list. It should be stressed that the purpose of normalization is to reduce data redundancy. However, organizations will perform this type of procedure to archive older transactions that are no longer needed but should be retained for historical analysis or for quarter/annual reports, etc. Quick Quiz 1. What command is used to create a table that will populate the new table using data from an existing table? ANSWER: CREATE TABLE command 2. If the CREATE TABLE command is using a subquery to create a table, what keyword must be included in the command? ANSWER: AS 3. If a table is being created with a subquery, can the names of the columns be changed? ANSWER: Yes, by specifying a column list after the name of the new table 4. How is the structure of the table (i.e., column datatype and width) specified when creating a new table with a subquery? ANSWER: The datatype and width are copied from the existing table. 5. If the subquery contains a group function or a mathematical expression, what is required in terms of a column name? ANSWER: A column alias can be assigned to the function or expression in the subquery or column names can be specified after the name of the new table. Modifying Existing Tables The ALTER TABLE command can be used to change the datatype assigned to a column, to change the size of a column, and to drop a column. Of course, there are some restrictions on the type of changes that are allowed. These restrictions are presented in this section of the chapter. Be aware that if data rows already exist in a table, then adding a new column will result in the column containing a NULL value for the existing rows. The name of the table is changed using the RENAME command, and the table is truncated using the TRUNCATE TABLE command. Truncation may be desired to clear out test data when moving tables from testing to production. Troubleshooting Tip Create a table using a subquery. Then demonstrate types of changes that are allowed and those that are not allowed based on the contents of the new table. Quick Quiz 1. What clause is included in the ALTER TABLE command to add a column to an existing table? ANSWER: ADD 2. What clause is included in the ALTER TABLE command to change the size of a column in an existing table? ANSWER: MODIFY 3. What impact does changing the DEFAULT value of a column have on existing values in a table? ANSWER: None, it only affects new data that will be added to the table after the change is made. 4. What clause is used with the ALTER TABLE command to remove a column that is no longer needed from a database table? ANSWER: DROP COLUMN 5. How do you change the name of an existing table? ANSWER: Use the RENAME command Deleting a Table The DROP TABLE command is used to remove a table from a database. It should be pointed out that data is deleted from a table, while a database object is dropped from the database. Oracle10g introduced the recycle bin, which can contain dropped tables. If the PURGE option is used in a DROP TABLE statement, then the table is not moved to the recycle bin. If the PURGE option is not used, the table will be moved to the recycle bin. However, you cannot depend on the recycle bin entirely. Depending on the space assigned to the recycle bin, previously dropped tables will be removed from the recycle bin to make room for more recent deletions. A FLASHBACK statement can be used to recover a table from the recycle bin. Quick Quiz 1. What command is used to remove a table from an Oracle 12c database? ANSWER: DROP TABLE 2. Can a table be retrieved after it has been dropped? ANSWER: No, it no longer exists. 3. How does the DROP TABLE command differ from the TRUNCATE TABLE command? ANSWER: With the TRUNCATE TABLE command, only the data is removed, whereas the DROP TABLE command deletes the data and removes the table as well. Discussion Questions 1. Discuss reasons why a table would need to be added to a database that has already undergone the development and design process. 2. Discuss problems that can occur if a table that is referenced by other users is suddenly dropped. Key Terms data definition language (DDL) — Commands, basically SQL commands, that create or modify database tables or other objects. database object — A defined, self-contained structure in Oracle 12c. Database objects include tables, sequences, indexes, and synonyms. datatype — Identifies the type of data Oracle9i will be expected to store in a column. schema — A collection of database objects owned by one user. By grouping objects according to the owner, multiple objects can exist in the same database that have the same object name. virtual column — A column value that is automatically generated based on the expression used to define the column. Chapter 4 Constraints At a Glance Instructor’s Notes • Chapter Overview • Chapter Objectives • Instructor Notes • Troubleshooting Tips • Quick Quizzes • Discussion Questions • Key Terms Chapter Overview This chapter addresses ensuring data integrity and the enforcement of business rules and policies in a database. Although most constraints can be created at either the column or table level, all constraints are enforced at the table level. A constraint can be temporarily disabled and then re- enabled at a later time. If a constraint will no longer be needed in the database, it can be permanently removed using the DROP command. It is important that students understand that the purpose of constraints is to ensure data integrity. Students will need the privileges to create constraints and the ability to query data dictionary views to complete the tasks in this chapter. Chapter Objectives After completing this chapter, you should be able to do the following: • Explain the purpose of constraints in a table • Distinguish among PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, and NOT NULL constraints and understand the appropriate use for each constraint • Understand how constraints can be created when creating a table or when modifying an existing table • Distinguish between creating constraints at the column level and at the table level • Create PRIMARY KEY constraints for a single column and a composite primary key • Create a FOREIGN KEY constraint • Create a UNIQUE constraint • Create a CHECK constraint • Create a NOT NULL constraint using the ALTER TABLE…MODIFY command • Include constraints during table creation • Add multiple constraints on a single column • View constraint information • Use DISABLE and ENABLE commands • Use the DROP command Instructor Notes Creating Constraints If a database is discovered to contain erroneous data, management will not be willing to rely on the system for decision-making purposes. In addition, feelings of ill-will may occur if employees are required to work with the DBMS when they know the database is full of errors and basically serves no useful purpose. Constraints can be created at the column level by including the constraint as part of the column definition or at the table level by defining the constraint after all columns have been defined. When created at the column level, the column that is the objective of the constraint is identified first, and then the constraint information is provided. If created using the table level approach, the type of constraint is identified first, and then the column is identified. A constraint can be assigned a name when it is created; otherwise, the Oracle server will assign a name using the format SYS_Cn. Using a naming convention that will indicate information regarding the constraint is quite helpful to a database developer. When constraint violations occur, the name will then help to quickly identify the specific problem. Troubleshooting Tip When an example is presented in the textbook, have students identify which approach is used and how they were able to identify the approach. Quick Quiz 1. What type of constraint cannot be created using the table level approach? ANSWER: A constraint on more than one column 2. What is required if the CONSTRAINT keyword is included when the constraint is created? ANSWER: A name must be specified for the constraint. 3. If a name is not specified for the constraint, what will happen? ANSWER: The Oracle server will assign a constraint name using the default format of SYS_Cn. 4. A NOT NULL constraint can only be created at which level? ANSWER: The column level 5. With which approach is the column name specified before the constraint type is specified? ANSWER: The column level Using the PRIMARY KEY Constraint The PRIMARY KEY constraint designates the primary key for a table. Each table can have only one PRIMARY KEY constraint. If a primary key consists of more than one column, it is considered to be a composite primary key and it must be created using the table level approach. The ALTER TABLE command with the ADD clause can be used to add a PRIMARY KEY constraint to an existing table. When a PRIMARY KEY constraint has been added to a column, the DESCRIBE command will display that the column cannot contain NULL values. This is because a PRIMARY KEY constraint will not allow duplicate values or NULL values in that column. A PRIMARY KEY enforces two rules: NOT NULL and UNIQUE. Troubleshooting Tip A typical error is including a separate NOT NULL constraint on a PRIMARY KEY column, which duplicates checking for NULL values. Quick Quiz 1. A PRIMARY KEY constraint prevents what from occurring? ANSWER: Prevents duplicate values and NULL values from being entered into the specified column 2. What is the maximum number of PRIMARY KEY constraints that can exist in each database table? ANSWER: One 3. If a PRIMARY KEY constraint references more than one column, how is the constraint created? ANSWER: Using the table level approach 4. Which command is used to add a PRIMARY KEY constraint to an existing table? ANSWER: ALTER TABLE command 5. Which clause of the ALTER TABLE command is used to add a PRIMARY KEY constraint to a table? ANSWER: ADD Using the FOREIGN KEY Constraint A FOREIGN KEY constraint is used to ensure referential integrity. A FOREIGN KEY constraint is always placed on the “many” side of a one-to-many relationship. This basically requires that a referenced value must exist in the parent table. Unless the constraint was created with the ON DELETE CASCADE keywords, then the referenced value in the parent table cannot be deleted if corresponding rows in the child table exist. With the ON DELETE CASCADE keywords, the rows in the child table will be deleted also. In addition, the FOREIGN KEY constraint can only reference a column that has already been designated as the primary key for the parent table. Quick Quiz 1. A FOREIGN KEY constraint is used to enforce what type of integrity? ANSWER: Referential 2. A FOREIGN KEY constraint is added to which table in a one-to-many relationship? ANSWER: The table representing the many side 3. Which keyword is used to identify the table being referenced by the FOREIGN KEY constraint? ANSWER: REFERENCES 4. If a FOREIGN KEY constraint was created with the ON DELETE CASCADE keywords and a row is deleted from the parent table, what happens to the corresponding rows in the child table? ANSWER: They are automatically deleted. 5. If a FOREIGN KEY constraint is added to a column, can that column contain NULL values? ANSWER: Yes Using the UNIQUE Constraint The UNIQUE constraint is used to ensure that no duplicate values exist in the specified column(s). Unlike the PRIMARY KEY constraint, the UNIQUE constraint will allow NULL values to be entered into the column. Using the CHECK Constraint A CHECK constraint is used to validate the data being entered into the database. It can ensure that values are within a certain range (using the BETWEEN comparison operator), exist within an identified list (using the IN comparison operator), etc. In addition, the condition specified within the constraint can reference other values within the same row. However, it cannot reference values in other rows. In addition, it cannot reference pseudocolumns or dynamic values, such as SYSDATE. Troubleshooting Tip Highlight that if a value violates a constraint, the entire row will be rejected. Quick Quiz 1. A condition can be stated in what type of constraint? ANSWER: A CHECK constraint 2. Can SYSDATE be referenced by a CHECK constraint? ANSWER: No 3. A CHECK constraint can be added to an existing table using what command? ANSWER: ALTER TABLE 4. Which clause of the ALTER TABLE command is used to add a CHECK constraint? ANSWER: ADD 5. Can a CHECK constraint be used to make certain that the value being entered into the specified column of the current row is greater than values entered into another row? ANSWER: No Using the NOT NULL Constraint The NOT NULL constraint is a special CHECK constraint with the condition IS NOT NULL. A NOT NULL constraint can only be created using the column level approach. Quick Quiz 1. A NOT NULL constraint is a special ________ constraint. ANSWER: CHECK 2. A NOT NULL constraint is a CHECK constraint with the condition of ___________. ANSWER: IS NOT NULL 3. Which command is used to add a NOT NULL constraint to an existing table? ANSWER: The ALTER TABLE command 4. Which clause is used with the ALTER TABLE command to add a NOT NULL constraint to a table? ANSWER: MODIFY 5. If you are adding a row to a table and one of the table columns has a NOT NULL constraint, what happens if you attempt to leave that column blank? ANSWER: It will violate the constraint, and the entire row will be rejected. Including Constraints during Table Creation During the design and development of the database tables, any necessary constraints should be identified. When the necessary constraints are known before the database tables are created, the constraints can be included in the CREATE TABLE command. This will save a lot of time because the user will not need to go back to add the constraints later. Introduce defining constraints at the table level. This method is preferred by some database developers, as the list of constraints is easily identifiable. Quick Quiz 1. When including constraints in the CREATE TABLE command, which approach can be used: a column level or table level approach? ANSWER: Both approaches can be used, except for NOT NULL constraints or constraints based on more than one column. 2. If the table level approach is used to define constraints in the CREATE TABLE command, are the constraints specified before or after the parenthesis that closes the column list? ANSWER: Before 3. When the table level approach is used to define constraints in the CREATE TABLE command, where is the constraint defined? ANSWER: After the relevant column has been defined, but before the comma Multiple Constraints on a Single Column A column can be assigned as many constraints as necessary. Each constraint is processed separately. Many students are confused with assigning multiple constraints to a column, particularly with columns that may need both a PRIMARY KEY and FOREIGN KEY constraint assigned. Viewing Constraints Querying the USER_CONSTRAINTS view will display information about constraints. This view will retrieve data contained in the data dictionary regarding constraints owned by the user. The CONSTRAINT_TYPE column of the view will identify the type of constraint being displayed. If the constraint is a CHECK constraint including a NOT NULL constraint, a search condition will be specified in the SEARCH_CONDITION condition. If it is a NOT NULL constraint, the search condition will always be listed as IS NOT NULL. Troubleshooting Tip Display all of the constraints currently owned by the user through the USER_CONSTRAINTS view. Do not include the WHERE clause, and have the students attempt to identify the various constraints that are displayed (i.e., which table each one belongs to, what type, etc.). Quick Quiz 1. What is stored in the data dictionary? ANSWER: Information about database objects 2. What view can be used to see information about a constraint created by the user? ANSWER: USER_CONSTRAINTS 3. Why is a NOT NULL constraint type identified in the USER_CONSTRAINTS view with the letter C? ANSWER: Because it is a special CHECK constraint 4. How is a FOREIGN KEY constraint identified in the USER_CONSTRAINTS view? ANSWER: With the letter R for referential integrity 5. If SYS_C68414 is displayed as a constraint name in the USER_CONSTRAINTS view, what does that indicate? ANSWER: The constraint name was most likely assigned by the Oracle server. Disabling and Dropping Constraints Each time a DML operation is performed on a table (i.e., adding, changing, or deleting data), the Oracle server must check to make certain the operation will not violate a constraint. If massive changes are being performed or large amounts of data are being loaded into the table, the verification process drastically slows down. Users have the option of disabling a constraint and then re-enabling the constraint after the data changes have been made. The data contained in the table will still need to adhere to the guidelines of the constraint after it has been enabled. Otherwise, the constraint will not be enabled and an error message will be displayed. Once the data has been corrected, the constraint can be enabled. If it is determined that the constraint is no longer required, the constraint can be permanently removed using the DROP clause of the ALTER TABLE command. Quick Quiz 1. What command is used to disable a constraint? ANSWER: The ALTER TABLE command 2. What clause is used with the ALTER TABLE command to enable a previously disabled constraint? ANSWER: ENABLE CONSTRAINT 3. When dropping a PRIMARY KEY constraint, why isn’t the user required to specify the name of the constraint or at least the column referenced by the constraint? ANSWER: There can only be one PRIMARY KEY constraint for a table; therefore, identifying the name of the table and the type of constraint is sufficient. 4. When dropping a UNIQUE constraint, why isn’t the user required to specify the name of the constraint? ANSWER: Each column of a table can only have one UNIQUE constraint; therefore, specifying the constraint type and column name is sufficient to identify the exact constraint that is to be dropped. 5. Which types of constraints require that the constraint name be specified when the constraint is dropped? ANSWER: NOT NULL, FOREIGN KEY, CHECK constraints Discussion Questions 1. Describe a business scenario and specify the types of constraints that would be appropriate to ensure the integrity of the database. For example, an airline reservation system should not make a reservation in which the return date is earlier than the departure date. 2. If one purpose of a constraint is to ensure data integrity, then why would a user ever disable a constraint? Key Terms child table — A table having data that reference data within a parent table. Considered the “many” side in a one-to-many relationship. constraints — Rules that ensure the accuracy and integrity of data. Constraints prevent data that violate these rules from being added to tables. Constraints include PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL. data dictionary — Oracle 12c stores all information about database objects in this "dictionary." Stored information includes objects' names, types, structures, owners, and the identity of users who have access to each object. referential integrity — When a user refers to something that exists in another table, the REFERENCES keyword is used to identify the table and column that must already contain the data being entered. Chapter 5 Data Manipulation and Transaction Control At a Glance Instructor’s Notes • Chapter Overview • Chapter Objectives • Instructor Notes • Troubleshooting Tips • Quick Quizzes • Discussion Questions • Key Terms Chapter Overview This chapter introduces data management by presenting the INSERT, UPDATE, and DELETE data manipulation language (DML) commands available in Oracle 12c to enter, change, and delete data. The chapter concludes with a discussion of transaction control. Chapter Objectives After completing this chapter, you should be able to do the following: • Use the INSERT command to add a record to an existing table • Manage virtual columns in data manipulations • Use quotes in data values • Use a subquery to copy records from an existing table • Use the UPDATE command to modify a table’s existing rows • Use substitution variables with an UPDATE command • Delete records • Manage transactions with the transaction control commands COMMIT, ROLLBACK, and SAVEPOINT • Differentiate between a shared lock and an exclusive lock • Use the SELECT . . . FOR UPDATE command to create a shared lock Instructor Notes Inserting New Rows New rows can be added to a table using the INSERT command. If the actual data values to be entered are provided, the data are listed in a VALUES clause. Unless data for every column is provided and the data is listed in the same order as the data is stored in the database table (use DESC to verify), a column list must be specified in the INSERT INTO clause. In addition, a column must be ignored in the column list or the keyword DEFAULT used for the column value if a DEFAULT value assignment is desired. Oracle 12c introduces an ON NULL clause that may be used with the DEFAULT option to specify a specific value when a NULL value is provided for a column. If the data is to be copied from an existing table, the VALUES clause is omitted and the subquery is inserted after the name of the destination table. In addition, the subquery is not required to be enclosed in parentheses. Troubleshooting Tip Demonstrate the results of issuing an INSERT command with common errors, such as not including all of the necessary data values, not including single quotation marks for nonnumeric data, providing a value for a virtual column, etc. Troubleshooting Tip Demonstrate INSERT statements that violate existing constraints. Highlight the value of naming constraints in identifying the cause of the error. Quick Quiz 1. When adding a row to a table, how can entries be made into only a few of the table columns? ANSWER: A column list can be provided in the INSERT INTO clause. 2. What is the purpose of the VALUES clause? ANSWER: It is used to identify actual data values that are to be added to the table. 3. If a subquery is being used to identify the data to be added to the table, the subquery is listed in what clause? ANSWER: The INSERT INTO clause; the VALUES clause is omitted. 4. What happens if the INSERT INTO command is used to insert data values that violate an existing constraint on one column? ANSWER: The entire row is rejected. 5. How can you indicate that a column should be NULL when inserting data into a table? ANSWER: Omit the column from the column list, enter NULL in the column’s position within the VALUES clause, or substitute two single quotation marks Modifying Existing Rows The UPDATE command is used to change data in existing rows. This can include changing existing values or replacing a NULL value with an actual data value. The SET clause is used to specify the column to be changed and the new value to be assigned to the column. If more than one column within a row needs to be changed, each column and its new value can be listed in the SET clause, separated by commas. The WHERE clause can be included with the UPDATE command to specify which rows should be changed. If the WHERE clause is omitted, every row in the table will be updated with the change. Troubleshooting Tip Demonstrate that an UPDATE statement without a WHERE clause will change every row. Quick Quiz 1. What command is used to change existing data in a table? ANSWER: UPDATE command 2. What command is used to remove existing rows in a table? ANSWER: DELETE command 3. What clause is used to identify the column containing the data to be changed in an UPDATE? ANSWER: SET 4. What clause is used to identify the row(s) to be changed in an UPDATE or DELETE? ANSWER: WHERE 5. What happens if the WHERE clause is omitted in an UPDATE or DELETE? ANSWER: All rows will be changed. Substitution Variables Rather than a user having to constantly re-enter the INSERT or UPDATE command to make changes to rows, a script can be created and substitution variables can be entered for the data value(s). When a command includes a substitution variable, the command (or script) becomes dynamic (i.e., allows it to be changed with each execution). A substitution variable is identified by an ampersand (&) in front of the name of the variable. When the ampersand is encountered, the Oracle server will either prompt the user for the value to be assigned to the variable or will receive the necessary data value via an application program. Substitution variables are used in application program interfaces with the database. Troubleshooting Tip Have students take some of the example INSERT and UPDATE commands presented in the chapter and create dynamic scripts through the use of substitution variables. Quick Quiz 1. What is the purpose of substitution variables? ANSWER: Allow a user to repeatedly use a command (or script) without modification 2. How can a user prevent the display of the old and new values when working with substitution variables? ANSWER: Issue the command SET VERIFY OFF to suppress the display 3. A script file should be assigned the extension _________. ANSWER: sql 4. A script file can be executed at a later time using the _______ command. ANSWER: START or @ 5. What happens if you type RUN at the SQL> prompt? ANSWER: The command currently in the SQL*Plus will be executed. Deleting Rows The DELETE command is used to remove rows from database tables. The WHERE clause is used to specify which row(s) should be removed. If the WHERE clause is omitted, all rows will be deleted from the specified table. Troubleshooting Tip Demonstrate the effect of omitting the WHERE clause from the DELETE command. Use a ROLLBACK operation to undo the deletion and introduce the next section, transaction control. Transaction Control Statements DML operations are not permanently updated to the tables until the data has been committed. Once the data has been committed, it becomes viewable by other users. This provides a consistent view of the database to all database users. In addition, it makes it easier to “undo” undesired changes because the user also has the option of entering the ROLLBACK command to erase any uncommitted changes. In addition, only a portion of the transaction can be erased by using a SAVEPOINT. The term “transaction” is applied to the block of DML operations between commits rather than to an economic event. If the user properly exits SQL*Plus, then any changes will automatically be committed. However, if the user clicks the Close button for the window, any uncommitted changes will be lost. Troubleshooting Tip Identify examples of transactions that typically involve multiple DML actions, such as a bank transaction. Troubleshooting Tip Note that DDL statements will issue an automatic COMMIT. Quick Quiz 1. Do you need to enter the COMMIT command after executing a DDL operation? ANSWER: No, a commit implicitly occurs after a DDL command is executed. 2. What is the purpose of the ROLLBACK command? ANSWER: It will undo any uncommitted changes. 3. What is a transaction? ANSWER: All operations between commits; it can consist of one statement or thousands 4. If a table is dropped and the user does not enter a COMMIT command, can the ROLLBACK command be used to recover the lost table? ANSWER: No, DROP is a DDL command, so an implicit COMMIT occurs when it is executed. 5. If a transaction may have a need to undo a portion of the DML actions executed, what transaction control feature should be used? ANSWER: SAVEPOINT Table Locks Table locks ensure that two users are not making changes to the same data, eliminating the possibility of one user’s work overwriting another user’s work. Whenever DML operations are performed, an implicit shared lock is obtained on the affected portion of the table. DDL operations usually acquire an exclusive lock on the entire table. An exclusive lock prevents other users from obtaining either shared or exclusive locks on the same table, whereas a shared lock prevents an exclusive lock from being obtained on the table. One event that could happen in a highly dynamic environment is that a data entry clerk could verify that an item is available by using a SELECT statement, but by the time the clerk has ordered or reserved that item for the customer, it is no longer available. This can be avoided by adding the FOR UPDATE clause to the SELECT statement. This will lock that portion of the table so that no other user can access the item until a COMMIT or ROLLBACK occurs. Quick Quiz 1. When are table locks implicitly obtained? ANSWER: DDL and DML operations will obtain implicit locks. 2. What command can be used to obtain an explicit lock? ANSWER: LOCK TABLE 3. What is the difference between shared and exclusive locks? ANSWER: A shared lock is only on a portion of a table, whereas an exclusive lock is on the entire table. 4. A shared lock prevents other users from obtaining ____________ lock(s)? ANSWER: Exclusive 5. An exclusive lock prevents other users from obtaining ____________ lock(s)? ANSWER: Exclusive or shared Discussion Questions 1. Describe a scenario in which a user would want to use the SELECT…FOR UPDATE command. 2. Describe how DML statements fit into supporting applications. Key Terms data manipulation language (DML) — Commands used to modify data. Changes to data made by DML commands are not accessible to other users until the data is committed. exclusive lock — When DDL operations are performed, Oracle 12c places this lock on a table so that no other user can alter the table or place a lock on it. See table locks. shared lock — A table lock that lets other users access portions of a table but not alter the structure of table. See table locks. substitution variable — Instructs Oracle 12c to use a substituted value in place of a specific variable at the time a command is executed. Used to make SQL statements or PL/SQL blocks interactive. table locks — When DML commands are issued, Oracle 12c implicitly “locks” the row or rows being affected so that no other user can change the same data. transaction — A series of DML statements is considered to be one transaction. In Oracle 12c, a transaction is simply a series of statements that have been issued and not committed. The duration of a transaction is defined by when a COMMIT implicitly or explicitly occurs. transaction control — Data control statements that either save modified data or undo uncommitted changes made in error. Chapter 6 Additional Database Objects At a Glance Instructor’s Notes • Chapter Overview • Chapter Objectives • Instructor Notes • Troubleshooting Tips • Quick Quizzes • Discussion Questions • Key Terms Chapter Overview The chapter examines the use of sequences, indexes, and synonyms in an organization. Students will need the CREATE SEQUENCE privilege to create sequences, the CREATE SYNONYM privilege to create private synonyms, and the CREATE PUBLIC SYNONYM privilege to create PUBLIC synonyms. If the students are sharing a common database, only one student will be able to create the PUBLIC synonym described in the chapter. An alternative is to assign a different number to the end of the PUBLIC synonym name for each student, or an error message will be returned when the second student attempts to create the synonym. Chapter Objectives After completing this chapter, you should be able to do the following: • Define the purpose of a sequence and explain how it can be used in a database • Use the CREATE SEQUENCE command to create a sequence • Explain why gaps might appear in integers generated by a sequence • Call and use sequence values • Use sequences in DEFAULT column settings • Identify which options can’t be changed by the ALTER SEQUENCE command • Delete a sequence • Use an Identity column rather than a sequence for primary key column population • Create indexes with the CREATE INDEX command • Explain the main index structures: B-tree and bitmap • Verify index use with the explain plan • Describe variations on conventional indexes, including a function-based index and an index organized table • Verify index existence via the data dictionary • Rename an index with the ALTER INDEX command • Remove an index with the DELETE INDEX command • Create and remove a public synonym • Create and remove a public synonym Instructor Notes Sequences Sequences are widely used to generate primary keys, such as account numbers, and for internal control purposes. When a sequence is used to generate account numbers, most organizations will try to provide some diversity among the number so that a customer does not accidentally access another account. For example, if an individual has a credit card number, or even a Social Security number, that is only one digit different than another number assigned to someone else, that individual could enter the number incorrectly. Using a prime number to increment the sequence values can diversify the numbers generated by a sequence. For example, increment four digit numbers by seven, or six digit numbers by 53. Identify all of the options available with the CREATE SEQUENCE command and the typical use of a sequence in an INSERT statement. Identify using sequences in DEFAULT column values is a new feature in Oracle 12c. Oracle 12c introduces identity columns which may be used for primary key value generation as an alternative to using a sequence. Troubleshooting Tip Reference the DUAL table to demonstrate that a sequence value is generated by NEXTVAL. Repeat this process several times. Then use the CURRVAL pseudocolumn to identify the last value generated. Make certain that the students understand that using CURRVAL does not generate another sequence value. Troubleshooting Tip Highlight that none of the options need to be included in a CREATE SEQUENCE command, as all of the default values will be used. Have students identify the default value for each of the sequence options. Quick Quiz 1. How does a user instruct a sequence to generate an integer? ANSWER: The user references NEXTVAL. 2. How does Oracle 12c “know” which table the sequence is used for? ANSWER: It doesn’t; the integers generated by a sequence can be used in any table or view. 3. Which parameter cannot be changed by the ALTER SEQUENCE command? ANSWER: The START WITH value (or any parameter that would nullify a previously generated integer) 4. If you drop a sequence, what happens to the values previously generated by the sequence? ANSWER: Nothing, they are not affected. 5. How can you use a sequence to generate a number with two decimals? ANSWER: A sequence only generates integers. An integer can be divided by 100 to create decimals. Indexes An index is always implicitly created for PRIMARY KEY and UNIQUE constraints, allowing Oracle server to quickly validate a value being entered in the specified column. An index can be explicitly created to speed up row retrieval. However, indexes always slow down DML operations because both the table and the index must be referenced for each execution. In addition, indexes are typically not beneficial if more than 5% of the rows will be returned by a query. A variety of index types exist, including B-tree, bitmap, and function-based indexes. Regardless of the type of index created, the index goal is to improve the speed of data retrieval by reducing the number of rows that must be searched to check a condition. Troubleshooting Tip Identify the ROWID value, which represents the physical row address in the database. Demonstrate a query that displays the ROWID values for a set of rows. Troubleshooting Tip Demonstrate that an index implicitly created due to a PRIMARY KEY or UNIQUE constraint cannot be deleted if the constraint is valid. Quick Quiz 1. When does Oracle 12c automatically create indexes? ANSWER: When a PRIMARY KEY or UNIQUE constraint is created 2. Why would a user create an index? ANSWER: To speed up retrieval of data 3. When is it not beneficial to use an index? ANSWER: If there are a lot of DML operations or if queries return more than 5% of the table contents 4. How would you modify a function-based index? ANSWER: Indexes cannot be modified; they must be dropped and re-created. 5. How can a user determine if a table has an index? ANSWER: Query the USER_INDEXES view (can use the DBA_ or ALL_ prefixes also) Synonyms Any user can reference a PUBLIC synonym. However, the user must have the necessary privileges to access the data contained in the underlying table(s). Only a user with DBA privileges can drop a PUBLIC synonym. When attempting to identify an object name, Oracle 12c first searches for a valid object in the current schema, then for private synonyms, and then for a PUBLIC synonym. Quick Quiz 1. What is the purpose of a private synonym? ANSWER: Allows users to reference objects through different names, usually a simplified name 2. What is the purpose of a public synonym? ANSWER: Allows users to reference objects belonging to a specific user without needing to identify the schema 3. How does a user create a public synonym? ANSWER: Include the PUBLIC keyword in the CREATE SYNONYM command 4. Can a private and public synonym exist with the same name? ANSWER: Yes 5. Can the user who created a public synonym drop the synonym? ANSWER: Only if the user has the DBA privilege Discussion Questions 1. Give specific examples of how sequences can be used for internal control purposes in an organization. 2. How would you decide whether an index should be created for a table? Key Terms application cluster environment — A high-volume work environment in which multiple users simultaneously request data from a database. data dictionary — Oracle 12c stores all information about database objects in this "dictionary." Stored information includes objects' names, types, structures, owners, and the identity of users who have access to each object. database object — A defined, self-contained structure in Oracle 12c. Database objects include tables, sequences, indexes, and synonyms. dynamic view — Used to access statistics relating to the database’s performance. See view. function-based index — Can be used when a query is based on a calculated value or a function. See index. index — A separate database object that stores frequently referenced values so they can be quickly located. An index can either be created implicitly by Oracle 12c or explicitly by a user. private synonym —An alias used by an individual to reference objects owned by that individual. See synonym. public synonym — An alias that can be used by others to access an individual’s database objects. See synonym. sequence — A database object that generates sequential integers that can be used for an organization’s internal controls. A sequence can also serve as a primary key for a table. synonym — An alternative name given to a database object with a complex name. Synonyms can be either private or public. Instructor Manual for Oracle 12c: SQL Joan Casteel 9781305251038
Close