The database increments its internal counter, guaranteeing that each record will be given a unique “key.” To set a field as a primay key, use the attribute PRIMARY KEY field_name and to
Trang 1Table 14.3 Most Common SQL Data Types
Trang 2Format
CREATE TABLE table_name ( column_name1 data_type, column_name2 data_type,
column_name3 data_type < no comma on the last entry )
Example 14.26
1 mysql> CREATE DATABASE pets;
Query OK, 1 row affected (0.24 sec)
2 mysql> USE pets;
3 mysql> CREATE TABLE dog
Query OK, 0 rows affected (0.16 sec)
4 mysql> describe dog;
Trang 3+ -+ -+ -+ -+ -+ -+
| Field | Type | Null | Key | Default | Extra |
+ -+ -+ -+ -+ -+ -+
| name | varchar(20) | YES | | NULL | |
| owner | varchar(20) | YES | | NULL | |
| breed | varchar(20) | YES | | NULL | |
| sex | char(1) | YES | | NULL | |
| birth | date | YES | | NULL | |
| death | date | YES | | NULL | |
mysql> INSERT INTO dog(name,owner,breed, sex, birth, death)
-> VALUES('Fido','Mr Jones', 'Mutt', 'M', '2004-11-12',
Primary Keys
Each table typically has a primary key Primary keys are used to uniquely identify a record in the database They must
be unique, never change, occur only once per table, and are normally numeric types
You can choose to manually generate this unique number for each record or let the database do it for you If you let the database generate the primary key, it will generate a unique number, given a starting value (e.g., 1) and then for each new record increment that number by one Even if a record is deleted, that number is never recycled The database increments its internal counter, guaranteeing that each record will be given a unique “key.”
To set a field as a primay key, use the attribute PRIMARY KEY (field_name) and to tell the database to
automatically create the unique number, use the AUTO_INCREMENT attribute following the field definition The primary key cannot be null
The following two examples describe a table called “categories” where the primary key is called “CategoryID” It will automatically be incremented each time a new category is added to the table
Trang 4The “CategoryID” is the primary key, an integer of up to 11 digits, which will be incremented by 1, initially
set to NULL (no value) The first time a record is inserted into the database, the value will be 1
The primary key is called “CategoryID” It is used to uniquely identify the different categories in this table
from the “northwind” database When a new category is added to the table, the “CategoryID” will be
automatically incremented by 1
Foreign Keys
If a primary key is referenced in another table, it is called a foreign key Foreign keys are used to create relation
between tables In the following example, two tables are described, which both reference the “CategoryID” key,
although it is primary in one and foreign in the other
Trang 54 rows in set (0.00 sec)
mysql> DESCRIBE products;
Trang 6Explanation
14.3.5 Relations
A major advantage of the relational database systems is the ability to create relations between tables Simply put, a relation is a connection between a field of one table and a field of another This relation allows you to look up related records in the database
The operation of matching rows from one table to another using one or more column values is called a join There are several types of join statements, such as full joins, cross joins, left joins, and so on, but let’s start with a simple joining
of two tables, called an inner join
Tables can be related to each other with keys As we discussed earlier, a primary key is a column with a unique value for each row A matching key in a second table is called a foreign key With these keys, you can bind data together across tables without repeating all of the data in every table where a certain condition is met
Consider the the previous Example 14.30, in which two tables from the “northwind” database are described One table
is called “categories” and the other called “products” “CategoryId” is a primary key field in the “categories” table, and
it is a foreign key in the “products” table The “CategoryId” key is used to create a relationship between the two tables
Two Tables with a Common Key
As discussed previously, both the “categories” table and the “products” table have a “CategoryID” key with the same values, making it possible to create a relation between the two tables
Let’s create a relation in which all the product names are listed if they are in the “Seafood” category Because every product in the “products” table falls into one of the eight categories in the “categories” table, the two tables can be bound by their common “CategoryID”
Example 14.31
mysql> SELECT CategoryID, CategoryName FROM categories;
+ -+ -+
| categoryID | categoryName | + -+ -+
| 1 | Beverages |
| 2 | Condiments |
| 3 | Confections |
| 4 | Dairy Products | | 5 | Grains/Cereals | | 6 | Meat/Poultry | | 7 | Produce |
| 8 | Seafood |
+ -+ -+
8 rows in set (0.00 sec) mysql> SELECT CategoryID, ProductName FROM products; (Partial Output) + -+ -+
| CategoryID | ProductName |
+ -+ -+
| 1 | Chai |
| 1 | Chang |
| 2 | Aniseed Syrup |
Trang 7| 2 | Chef Anton's Cajun Seasoning |
| 2 | Chef Anton's Gumbo Mix |
| 2 | Grandma's Boysenberry Spread |
| 7 | Uncle Bob's Organic Dried Pears | | 2 | Northwoods Cranberry Sauce |
| 6 | Mishi Kobe Niku |
| 8 | Ikura |
| 4 | Queso Cabrales |
| 4 | Queso Manchego La Pastora |
| 8 | Konbu |
| 7 | Tofu |
| 2 | Genen Shouyu |
Explanation This example displays columns from both the “categories” table and the “products” table In the “categories” table the “CategoryID” is the primary field and uniquely identifies all other fields in the table In the “products” table, the “CategoryID” is a foreign key and is repeated many times for all the products Using a Fully Qualified Name and a Dot to Join the Tables When querying more than one table, a dot is used to fully qualify the columns by their table name to avoid potential ambiguity if two tables have a field with the same name, as shown in Example 14.32 Example 14.32 mysql> SELECT CategoryName, ProductName FROM categories, products -> WHERE products.CategoryID = 8 AND categories.CategoryID = 8; + -+ -+
| CategoryName | ProductName |
+ -+ -+
| Seafood | Ikura |
| Seafood | Konbu |
| Seafood | Carnarvon Tigers |
| Seafood | Nord-Ost Matjeshering |
| Seafood | Inlagd Sill |
| Seafood | Gravad lax |
| Seafood | Boston Crab Meat |
| Seafood | Jack's New England Clam Chowder | | Seafood | Rogede sild |
| Seafood | Spegesild |
| Seafood | Escargots de Bourgogne |
| Seafood | Röd Kaviar |
+ -+ -+
12 rows in set (0.00 sec)
Explanation
In the SELECT, two tables (separated by commas) will be joined by the “CategoryID” field Because the
field name is the same in both tables, the table name is prepended to the field name with a dot, as
products.CategoryId and categories.CategoryId In the WHERE clause, the two tables are
connected if the both tables have a “CategoryID” equal to 8
Aliases
To make things a little easier by typing less with complicated queries, SQL provides an aliasing mechanism that allows you to use symbolic names for columns and tables The alias is defined with the AS keyword and the alias consists of a
Trang 8single character or an abbreviated string When the alias is used in the WHERE clause to represent a table name, it is appended with a dot and the name of the field being selected from that table
Format
(Column Alias)
SELECT column_name AS column_alias_name FROM table_name
(Table Alias)
SELECT column_name FROM table_name AS table_alias_name
Example 14.33
mysql> SELECT CategoryName as Foods FROM categories;
+ -+
| Foods |
+ -+
| Beverages |
| Condiments |
| Confections |
| Dairy Products | | Grains/Cereals | | Meat/Poultry | | Produce |
| Seafood |
+ -+
8 rows in set (0.00 sec) Explanation The column name from table “categories” was named “CategoryName” An alias called “Foods” is created by using the AS keyword after “CategoryName” Now when the SELECT returns a result-set, the output will show “Foods” as the name of the column Example 14.34 mysql> SELECT ProductName FROM products AS p, categories AS c WHERE -> p.CategoryID = c.CategoryID AND c.CategoryName="SeaFood"; + -+
| ProductName |
+ -+
| Ikura |
| Konbu |
| Carnarvon Tigers |
| Nord-Ost Matjeshering |
| Inlagd Sill |
| Gravad lax |
| Boston Crab Meat |
| Jack's New England Clam Chowder | | Rogede sild |
| Spegesild |
| Escargots de Bourgogne |
| Röd Kaviar |
+ -+
12 rows in set (0.00 sec)
Trang 9Explanation
This example might look a little tricky at first The table named “products” is given an alias called “p” and
the table name “categories” is given the alias “c” These aliases are short names, making it easier to type
the query when more than one table is involved; for example, instead of typing
products.CategoryID, we can type p.CategoryID, and categories.CategoryName can be
1 mysql> ALTER TABLE dog ADD pet_id int(11);
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
2 mysql> ALTER TABLE dog MODIFY column pet_id int(11)
> auto_increment primary key;
Query OK, 1 row affected (0.11 sec)
Records: 1 Duplicates: 0 Warnings: 0
3 mysql> describe dog;
+ -+ -+ -+ -+ -+ -+ | Field | Type | Null | Key | Default | Extra
|
+ -+ -+ -+ -+ -+ -+ | name | varchar(20) | YES | | NULL |
7 rows in set (0.00 sec)
mysql> select * from dog;
Trang 10To drop a table is relatively simple Just use the drop command and the name of the table:
mysql> drop table dog; Query OK, 20 rows affected (0.11 sec)
14.3.8 Dropping a Database
To drop a database, use the drop database command:
mysql> drop database pets; Query OK, 1 row affected (0.45 sec)
14.4 SQL Functions
The following functions are used to alter or format the output of a SQL query Functions are provided for strings, numbers, dates, server and information, and so on They return a result-set Functions are vendor specific, meaning functions supported by MySQL might not be supported by Microsoft SQL Server See the MySQL documenation for a list of all functions supported
When using SELECT with a function, the function, as it was called, is displayed as the name of the column in the result-set as shown in Example 14.36
1 row in set (0.01 sec)
2 mysql> SELECT avg(UnitPrice) as 'Average Price'
FROM order_details;
Trang 11No GROUP BY clause is required if the aggregate function is the only value retrieved by the SELECT statement The functions and their syntax are listed in Table 14.4
Table 14.4 Aggregate Functions
1 row in set (0.00 sec)
mysql> SELECT count(*) as 'Number of Rows' FROM products;
+ -+
| Number of Rows |
+ -+
Trang 12| 81 |
+ -+
1 row in set (0.00 sec) Explanation COUNT() Example 14.38 1 mysql> SELECT avg(UnitPrice) FROM order_details; + -+
| avg(UnitPrice) | + -+
| 26.21851972 | + -+
1 row in set (0.01 sec) 2 mysql> SELECT FORMAT(avg(UnitPrice),2) as 'Average Price' FROM order_details; + -+
| Average Price | + -+
| 26.22 |
+ -+
1 row in set (0.00 sec) Explanation AVG() FORMAT AVG() Using GROUP BY The GROUP BY clause can be used with a SELECT to collect all the data across multiple records and group the results by one or more columns This is useful with the aggregate functions such as SUM, COUNT, MIN, or MAX See the following two examples Example 14.39 mysql> select CategoryID, SUM(UnitsInStock) as 'Total Units in Stock' -> FROM products -> GROUP BY CategoryID; + -+ -+
| CategoryID | Total Units in Stock | + -+ -+
| NULL| 0 |
| 1 | 559 |
| 2 | 507 |
Trang 13| 3 | 386 |
| 4 | 393 |
| 5 | 308 |
| 6 | 165 |
| 7 | 100 |
| 8 | 701 |
+ -+ -+
9 rows in set (0.00 sec) Example 14.40 mysql> select C.CategoryName, -> SUM(P.unitsInsStock) AS Units -> FROM products as P -> join categories AS C ON C.CategoryID= -> P.CategoryID Group By C.CategoryName; + -+ -+
| CategoryName | Units | + -+ -+
| Beverages | 559 |
| Condiments | 507 |
| Confections | 386 |
| Dairy Products | 393 | | Grains/Cereals | 308 | | Meat/Poultry | 165 | | Produce | 100 |
| Seafood | 701 |
+ -+ -+
8 rows in set (0.00 sec)
14.4.2 String Functions
SQL provides a number of basic string functions, as listed in Table 14.5
Table 14.5 MySQL String Functions
Function
CONCAT(string1,string2, )[a]
string
LOWER(string)
SUBSTRING(string, position)
TRANSLATE
TRIM(' string ');
UPPER(string)
14.41)
Trang 14SQL99 defines a concatenation operator (||) to use with the CONCATENATE() function MySQL uses the concat() function shown in Table 14.5
3 rows in set (0.00 sec)
mysql> select lower(CompanyName) as 'Company' FROM shippers; + -+
3 rows in set (0.00 sec)
14.4.3 Date and Time Functions
To get the date and time, MySQL provides the functions shown in Table 14.6
Table 14.6 MySQL Date and Time Functions
Function Example
CURDATE() select CURDATE(); > '2006-12-15'
CURTIME() select CURTIME(); > '23:50:26'
DAYOFYEAR(date) select DAYOFYEAR('2006-12-15'); > 349
DAYOFMONTH(date) select DAYOFMONTH('2006-12-15'); > 15
DAYOFWEEK(date) select DAYOFWEEK('2006-12-15'); > 6
Trang 15Table 14.6 MySQL Date and Time Functions
Function Example
WEEKDAY(date) select WEEKDAY('2006-12-15'); > 4
MONTHNAME(date) select MONTHNAME('2006-12-15'); > December
DAYNAME(date) select DAYNAME('2006-12-15'); > Friday
YEAR(date) select YEAR('2006-12-15'); > 2006
QUARTER(date) select QUARTER('2006-12-15'); > 4
1 row in set (0.00 sec)
mysql> select CURDATE();
1 row in set (0.03 sec)
mysql> select CURTIME();
1 row in set (0.01 sec)
Formatting the Date and Time
When retrieving dates and times from a table, you might find you want to format the output For example, when selecting the dates of the orders from the orders table in the “northwind” database, the result-set is not user friendly Date values in SQL are always saved in MM/DD/YY(YY) format The DATE_FORMAT() and TIME_FORMAT() functions (see Example 14.43) are provided with a list of parameters (see Table 14.7) used to specify how the the output should be displayed
Trang 16Example 14.43
mysql> select DATE_FORMAT('2006-03-23', '%W %M %d, %Y') as Today;
+ -+
| Today |
+ -+
| Thursday March 23, 2006 | + -+
1 row in set (0.00 sec) mysql> select DATE_FORMAT(OrderDate,'%M %e, %Y - %l:%i %p') FROM orders LIMIT 5; + -+
| DATE_FORMAT(OrderDate,'%M %e, %Y - %l:%i %p') | + -+
| July 4, 1996 - 12:00 AM |
| July 5, 1996 - 12:00 AM |
| July 8, 1996 - 12:00 AM |
| July 8, 1996 - 12:00 AM |
| July 9, 1996 - 12:00 AM |
+ -+
5 rows in set (0.00 sec)
Table 14.7 DATE_FORMAT() and TIME_FORMAT()
%a
%b
%c
%d
%D
%e
%f
%H
%h
%i
%I
%j
%k
Trang 17Table 14.7 DATE_FORMAT() and TIME_FORMAT()
The MySQL EXTRACT Command
The EXTRACT command is an example of a MySQL extension, not described in the SQL standard It allows you to extract different parts of a date or time, as shown in Table 14.8
Table 14.8 Date and Time Parts
Type Format
Trang 18Table 14.8 Date and Time Parts
14.5.1 What You Should Know
Now that you have finished this chapter you should be able to answer the following questions:
1
2
3
Trang 19Description
integer(size)int(size)
Trang 20sizedecimal(size,d)
school
5
LastName: Doe Email: johndoe@smileyface.edu CellPhone: 408-333-3456 Major: CIS
GPA: 2.8 StartDate: 09/22/2004 (use the correct date format!)
LastName: Chin Email: mchin@qmail.com CellPhone: 408-204-1234 Major: Biology
GPA: 3.3 StartDate: 06/22/2003
LastName: Pamel Email: sadi@univ_ab.edu CellPhone: 415-204-1234 Major: CIS
Trang 21CellPhone: 415-204-1234 Major: CIS
GPA: 3.9 StartDate: 06/22/2003
a The data in all of the columns
b The first and last name of the students
c The student’s first and last name and major
d The student’s cellphone and e-mail addresses
e Any distinct majors
f Only 2 rows
8 a Select all students who have a GPA over 3.0
b Select all students who have a GPA between 3.0 and 4.0
c Select students whose cell phones are in the 408 area code
d Display rows for students who started in 2003
e Select student first and last names who are majoring in CIS and have a GPA over 3.5
f Select student first name and e-mail address if the e-mail address ends in com
9 1 Insert a new entry into the table
2 Sort the student table by last names
3 Sort the student table by GPA in descending order
Trang 22Chapter 15 PHP and MySQL Integration
15.1 Introduction
The user has filled out a form and submitted it It contains a list of items he or she wants to purchase The information
for that user is stored in a database table called “customers” You want to retrieve all the orders and product information
for that customer from the database and display selected data on the Web page directly from your PHP script Now you
will learn how to integrate PHP and MySQL
PHP provides built-in functions that allow all the necessary operations for opening and selecting the database, and for
sending it SQL queries to create tables, update and delete them, retrieve records, and display the results You can create
your HTML form, process it, and connect to the MySQL database all in one PHP program!
At the beginning of this book, we described PHP and MySQL as a perfect marriage In this chapter, we see how that
marriage works
15.1.1 Connecting to the Database Server
To establish a connection to the MySQL database server from your PHP script, use the PHP mysql_connect()
$link = mysql_connect("localhost", "root", "password");
The first argument is the host server where the MySQL server will be running It can also include an IP address, port
number, a path to a local socket, and so on The second argument is the username, the default value for the name of the
owner of the server process The next argument is the password, if there is one
If a second call is made to mysql_connect() with the same arguments, a new link will not be established, but
instead, the link identifier of the already opened link will be returned If you specify the new_link parameter,
mysql_connect() will always open a new link
If the connection is successful, mysql_connect() returns the connection link and if not, the function returns
FALSE The resource returned points to the database server and is used by all the other mysql functions in the script
When a Web page or PHP script ends, the database is automatically closed and the resource that links to it is released,
so that if you start another page you will have to reconnect to the database If you want to close the database before the
program ends, PHP provides the mysql_close() function The mysql_close() function closes the connection to
the MySQL server referenced by the link
Format
bool mysql_close ( [resource link_identifier]
Example:
mysql_close($link);
Trang 23Example 15.1
<?php
print "Opening the connection to the database server< br />";
1 $link = mysql_connect("localhost", "root", "password");
2 print "The connection worked The link is: $link < br />"; print "Closing the connection< br />";
mysql_close()mysql_connect() mysql_close()
Figure 15.1 Opening and closing a connection to the database server Output from Example 15.1
15.1.2 Choosing the Database
Once connected to the database server, the next step is to set the default database that you will be using The
mysql_select_database() function is used to select a MySQL database (This is the equivalent to the use command when using mysql client.) The first argument is the name of the database The second argument is the MySQL connection (the link) established when the mysql_connect() function was executed
Format
bool mysql_select_db ( string database_name [, resource link_identifier] )
Trang 241 mysql_connect("localhost", "root", "password");
print "Selecting a database< br />";
2 $result = mysql_select_db( "northwind" );
Trang 2515.1.3 Executing SQL Statements (INSERT, UPDATE, DELETE)
Once connected to the database server, and having selected a database, it is time to start executing SQL commands PHP provides the mysql_query() function to perform database queries You must have adequate permissions to execute queries on a given database (see “The Grant and Revoke Commands” on page 589)
on success or FALSE on error
PHP provides a number of functions to deal with the result, such as mysql_fetch_array(),
mysql_num_rows(), mysql_affected_rows(), and so on You can also use the built-in error-handling functions to find out where a query failed
You can test that your SQL statement is valid by executing it in any other client, such as the mysql command line For INSERT, UPDATE, and DELETE, this function will return TRUE if the operation was successful and FALSE otherwise
1 $link = mysql_connect("localhost", "ellie", "");
print "Selecting the 'northwind' database< br />";
2 mysql_select_db("northwind");
3 $query="UPDATE Shippers SET phone='(777) 430-2346'
WHERE CompanyName = 'Federal Shipping'";
4 $result= mysql_query($query);
5 $rows_affected= mysql_affected_rows($link); /* numbers of rows
affected by the most recently executed query */
echo "You have updated $rows_affected rows.< br />";