The views expressed in this work are those of the author and do not represent the views of the publisher. While the publisher and author have made good faith efforts to ensure the accuracy of the information and instructions in this work, the publisher and author disclaim all liability for errors or omissions, including without limitation liability for damages resulting from the use of or reliance on this work. You use the information and instructions in this section at your own risk.
If any code samples or other technology contained or described in this work is subject to open source licenses or the intellectual property rights of others, it is your responsibility to ensure that your use thereof complies with such licenses and/or rights. Some examples are COBOL, which is still used quite widely in mainframe environments; Java, which was born in the mid-1990s and has become one of the most popular programming languages; and C, which is still quite popular for operating systems and server development and for embedded systems. At the other end of the spectrum are reference guides that describe every permutation of every statement in a language, which can be helpful if you already have a good idea of what you want.
This book strives to find the middle ground, starting with some background of the SQL language, moving through the basics and then pro‐.
A Little Background
Creating and Populating a Database
If you are looking at a particular account record and want to find out more information about the customer who opened the account, take the value of the cust_id column and use it to find the appropriate row in the customer table (this process is known: in relational database jargon, as a join; joins are introduced in Chapter 3 and explored in depth in Chapters 5 and 10). Most of this book focuses on the data part of the SQL language, which con‐. Therefore, although I try to introduce you to many of the SQL schema statements, most of the chapters in this book focus on the SQL data statements.
If you prefer to have your own copy of the data and want any changes you make to be permanent, or if you are just interested in installing the MySQL server on your computer. If you need to store longer strings (such as emails, XML documents, etc.), then you'll want to use one of the text types (medium text and long text), which I discuss later in this section. In general, you should use the char type when all the strings to be stored in the column are the same length, such as state.
If you need to store data that can exceed the 64 KB limit for varchar columns, you will need to use one of the text types.
Design 27
Columns to hold the expected future delivery date of a customer order and an employee's date of birth will use the date type, as it is unrealistic to schedule a future delivery down to the second and unnecessary to know what time a person was born. A column to hold information about when a customer order was actually shipped would use the date type, since it is important to track not only the date the shipment occurred, but also the time. A column that tracks when a user last modified a particular row in a table would use the timestamp type.
The timestamp type contains the same information as the datetime type (year, month, day, hour, minute, second), but a timestamp column will be automatically populated with the current date/time by the MySQL server when a row is added to a table or when a row is later changed. Columns that contain data about how long it takes to complete a task will use the time type. This information could be derived using two datetime columns (one for the task start date/time and the other for the task end date/time) and subtracting one from the other, but it is easier to use a single time column.
Now that you have a good understanding of what data types can be stored in MySQL data.
Refinement 28
The eye_color column allows two characters that must only be equal to BR, BL, or GR. Now that the persons table has a primary key (person_id) to guarantee uniqueness, the next step is to build a favorite_food table that includes a foreign key for the persons table. The person_id and food columns constitute the primary key of the favorite_food table, and the person_id column is also a foreign key to the person table.
Moving the favorite_foods column out of the person table was definitely a good idea, but are we done yet. For example, what happens if one person lists "pasta" as a favorite food while another person lists "spaghetti". To avoid this problem, you can decide that you want people to choose their favor.
Although this design would be fully normalized, you may decide that you simply want to store the values entered by the user, in which case you can leave the table as is.
Building SQL Schema Statements 30
Query Primer
This restricts the values of the person_id column in the favorite_food table to include only values found in the person table. Since there is no data in the person and favorite_food tables yet, the first of the four SQL data statements to be examined will be the insert statement. The reason for this is that before you can determine what to include in the final result set, you already post.
In this query, the from clause lists a single table (language), and the select clause indicates that all columns (denoted by *) in the language table should be included in the result set. Thus, the database server is instructed to use the value of the customer_id column in the customer table to find all of the customer's leases in the lease table. The join conditions for the two tables are found in the subclause above the from clause; in this case, the join condition.
In this case, the Where clause filtered out 971 of the 1000 rows in the movie table. If you were to swap the order of the two columns in the order by clause, Amber Dixon would appear first in the result set. This can be especially useful if you're sorting on an expression, as in the previous example.
65
You may want to use this feature sparingly, as adding a column to the select clause without changing the numbers in the order after the clause can lead to unexpected results. Personally, I may refer to columns positionally when writing ad hoc queries, but I always refer to columns by name when writing code. The following exercises are designed to strengthen your understanding of the selected statement and its various clauses.
65
65
65
Filtering
The select clause determines which of all possible columns should be included in the query result set. When you separate conditions using the and operator, all conditions must evaluate to true to be included in the result set; when using or, however, only one of the con-. If you are sorting using columns in your select clause, you can choose to refer to the columns by their position in the select clause rather than by name.
This chapter explores the different types of filter conditions you can use in the ku clau‐. If all the conditions in the where clause are separated by the operator or, however, only one of the conditions must evaluate to true for the row to be included in the result set. Instead, you can use wildcards to construct search expressions, as shown in the next section.
This version of the query returns all the bearings that were returned, which is the majority of the rows in the table (15,861 out of 16,044).
86
86
86
86
Querying Multiple Tables
The previous query returns data from both the customer table (firstname, lastname) and the hire table (rentdate), so both tables are included in the from clause. For example, Mary Smith's row in the customer table contains a value of 5 in address_id col‐.
99
99
100
Working with Sets
Of the five rows in the result set, one is a duplicate (Jennifer Davis). When you specify column names in the order by clause, you will need to select from the column names in the first query of the compound query.
114
For this compound query, the second and third queries would be joined together using the union all operator, and then the results would be joined to the first query using the union operator.
114
114
Data Generation, Manipulation, and Conversion
The second argument in the call to str_to_date() defines the format of the date string, in this case a month name (%M), a numeric day (%d), and a four-digit numeric year (%Y) ).
145
In this case, the first three digits of the string are converted, while the rest of the string is discarded, resulting in a value of 999. If you are converting a string to a date, time, or date value, then you will need To attached to the default formats for each type, since you cannot provide the cast() function with a format string. If your date string is not in the default format (ie, YYYY-MM-DD HH:MI:SS for date types), then you will need to use another function, such as the str_to_date() function of MySQL described earlier in the chapter.
These exercises are designed to test your understanding of some of the built-in functions.
145
145
Grouping and Aggregates
160
This is because the filters in the where clause are evaluated before the grouping occurs, so the server cannot yet perform any functions on the groups. When you add filters to a query that includes a group by clause, think carefully about whether the filter acts on raw data, in which case it belongs in the Where clause, or on grouped data, in which case it belongs in the has clause.
160
160
Subqueries
185
185
185
Joins Revisited
200
200
Extra Credit) 200
Conditional Logic
211
211
Transactions
222
Indexes and Constraints
237
237
Views
249
250
Metadata
265
265
Analytic Functions
284
285
285
Working with Large Databases
SQL and Big Data
ER Diagram for Example Database
Solutions to Exercises