A MySQL Tutorial For Beginners
A MySQL Tutorial For Beginners
3
4
5
6
7
8
10
13
15
17
20
22
24
26
29
32
33
34
36
38
40
42
44
46
48
51
55
57
What is a Database?
A database is a structure that comes in two flavors: a flat database and a relational database. A
relational database is much more oriented to the human mind and is often preferredover the gabble-degook flat database that are just stored on hard drives like a text file. MySQL is a relational database.
In a relational structured database there are tables that storedata. The columns define which kinds
of information will be stored in the table. An individual column must be created for each type of data
you wish to store (i.e. Age, Weight, Height).
On the other hand, a row contains the actual values for these specified columns. Each row will
have 1 value for each and every column. For example a table with columns (Name, Age, Weight-lbs)
could have a row with the values (Bob, 65, 165). If all this relational database talk is too confusing,
don't despair. We will talk about and show a few examples in the coming lessons.
Learn MySQL
Before you begin this tutorial you should have a basic knowledge of the informationcovered in our
PHP and HTML tutorials.
This tutorial focuses heavily on using MySQL in a PHP environment. It is aimedat teaching those
who have web hosts with PHP and MySQL already installed. If you are unsure, please contact your
web host.
3 of 58
If you have problems with thissteps, seek help from your web hosting provider or ask a question in
the Tizag Forums.
4 of 58
MySQL Admin
This lesson covers the different options you have available to you for administering your MySQL
service after it is successfully installed. If you already have that base covered feel freeto skip on to
the next lesson.
MySQL GUI
With so many free MySQL administration tools available, many developers favor these free
Graphical User Interfaces over the command line. The most popular options include:
.:. phpMyAdmin - A popular web interface that is included with almost every type of Shared, Virtual or
Dedicated hosting solution.
.:. MySQL Administrator - A powerful tool developed by the folks atMySQL.com.
.:. Navicat - A purchasable MySQL admin tool for Windows, Mac and Linux.
MySQL phpMyAdmin
As previously mentioned, the very popular phpMyAdmin tool should come with your web hosting
plan.
MySQL Administrator
This tool comes from the creators of MySQL, so you can be assured they have a solid
understanding of database optimization and stability for power users. There are currently two
versions of MySQL Administrator:1.0 and 1.1. MySQL.com recommends you use 1.1 if your
MySQL installation is 4.0, 4.1 or 5.0. Read moreabout the MySQL Administrator on MySQL.com's
web site.
MySQL Navicat
Navicat comes with a 30-day trial so you can play around and see if you feel like dropping the
cashfor this MySQL administration product. A brief overview of their product Navicat Admin can be
found on their website. The cost of this product is around $100.
5 of 58
MySQL Syntax
The great thing about everything you do in MySQL is thatthe "code" is very easy for humans to
read, as opposed to harder programming languages like C or C++. Very few special characters and
symbols are required to create a MySQL query, and most queries consistentirely of English words!
That line of code is valid PHP, but it also contains valid MySQL. The text that appears between
the quotations "SELECT * FROM example", is the MySQL code.
As you probably can tell "SELECT" and "FROM" are the MySQL keywords used in this query.
Capitalizing them allows you to tell from a quick glance that this query selects data from a table.
You can view a complete list of MySQL keywords at List of Reserved MySQL Words, but don't
worry about memorizing them. You could program relentlessly in MySQL for years without ever
using all of the MySQL keywords.
6 of 58
MySQL Database
A MySQL database is nothing in itself. Rather a MySQL database is a way of organizing a group
of tables. If you were going to create a bunch of different tables that shared a common theme, you
would group them into one databaseto make the management process easier.
Server - localhost
Database - test
Table - example
Username - admin
Password - 1admin
Note: The table may change in the advanced lessons, but everything else will remain the same!
The server is the name of the server we want to connect to. Because all of our scripts are going to
be placed on the server where MySQL is located the correct address is localhost. If the MySQL
server was on a different machine from where the script was running, then you would need to enter
the correct url (ask your web host for specifics on this).
Your database, table, username, and password do not have to match ours. If you choose a different
set of login information, remember to insert your own information when copying the scripts in this
tutorial.
Status Check
So far, you should have created a new database and assigned a user to it. You should not have
created a table yet. If you are up-to-date, then continue the tutorial. We will be making our first table
in an upcoming lesson.
7 of 58
MySQL Connect
Before you can do anything with MySQL in PHP you must first establish a connection to your web
host's MySQL database. This is done with the MySQL connect function.
MySQL localhost
If you've been around the internet a while, you'll know that IP addresses are used as identifiers for
computers and web servers. In this example of a connection script, we assume that the MySQL
service is running on the same machine as the script.
When the PHP script and MySQL are on the same machine, you can use localhost as the address
you wish to connect to. localhost is a shortcut to just have the machine connect to itself. If your
MySQL service is running at a separate location you will need to insert the IP address or URL in
place of localhost. Please contact your web host for more details if localhost does not work.
PHP & MySQL Code:
<?php
mysql_connect("localhost", "admin", "1admin") or die(mysql_error());
echo "Connected to MySQL<br />";
?>
Display:
Connected to MySQL
If you load the above PHP script to your webserver and everything works properly,then you should
see "Connected to MySQL" displayed when you view the .php page.
The mysql_connect function takes three arguments. Server, username, andpassword. In our
example above these arguments were:
.:. Server - localhost
.:. Username - admin
.:. Password - 1admin
The "or die(mysql..." code displays an error message in your browser if --you've probably guessed
it -- there is an error in processing the connection! Double-check your username, password, or server
if you receive this error.
8 of 58
Display:
Connected to MySQL
Connected to Database
Status Check
So far you should have made a MySQL connection and chosen the working database. If you are
up-to-date then continue the tutorial. We will be making our first table in the next lesson.
9 of 58
MySQL Tables
A MySQL table is completely different than the normal table that you eat dinneron. In MySQL
and other database systems, the goal is to store information in an orderlyfashion. The table gets this
done by making the table up of columns and rows.
The columns specify what the data is going to be, while the rows contain the actual data.Below is
how you could imagine a MySQL table. (C = Column, R = Row)
C1 (Namge)
C2 (Age)
C3 (Weight)
R1
R1 C1 (John)
R1 C2 (21)
R1 C3 (120)
R2
R2 C1 (Big Sally)
R2 C2 (27)
R2 C3 (400)
R3
R3 C1 (Tiny Tim)
R3 C2 (6)
R3 C3 (35)
R4
R4 C1 (Normal Ned)
R4 C2 (35)
R4 C3 (160)
We added the row and column number (R# C#) so that you can see that a row is side-to-side, while
a column is up-to-down. In a real MySQL table only the value would be stored, not the R# and C#!
This table has three categories, or "columns", of data: Name, Age, and Weight. This table hasfour
entries, or in other words, four rows.
10 of 58
Display:
Table Created!
Wow! That's a lot of code all at once! Let's get down in the dirt and figurethis stuff out. We will
be going through the code line by line.
'name VARCHAR(30),'
Here we make a new column with the name "name"! VARCHAR stands for "variable character".
"Character" means that you can put in any kind of typed information in this column (letters, numbers,
symbols, etc). It's "variable" because it can adjust its size to store as little as 0 characters and up to a
specified maximum number of characters.
We will most likely only be using this name columnto store characters (A-Z, a-z). The number
inside the parentheses sets the maximum number of characters. In this case, the max is 30.
11 of 58
'age INT,'
Our third and final column is age, which stores an integer. Notice that there are noparentheses
following "INT". MySQL already knows what to do with an integer. Thepossible integer values that
can be stored in an "INT" are -2,147,483,648 to 2,147,483,647,which is more than enough to store
someone's age!
'or die(mysql_error());'
This will print out an error if there is a problem in the table creation process.
Your Homework
Using the MySQL administration tool that your web host has, check to seeif the table was created
correctly. Afterwards, try creating a few of your own, with PHP or with a MySQL administration
tool, to be sure that you have gotten the hang of it.
12 of 58
MySQL Insert
When data is put into a MySQL table it is referred to as insertingdata. When inserting data it is
important to remember the exact names and types of the table's columns. If you try to place a 500
word essayinto a column that only accepts integers of size three, you will end up with a nasty error!
Display:
Data Inserted!
This code is much simpler to understand than the create table code, aswill be most of the MySQL
queries you will learn in the rest of this tutorial. Once again,we will cover the code line by line.
13 of 58
Be sure to note the location and number of apostrophes and parentheses in the PHP code, asthis is
where a lot of beginner PHP/MySQL programmers run into problems.
14 of 58
MySQL Query
So far we have seen a couple different uses of PHP's mysql_query function and we'll be seeing
more of itas nearly all MySQL in PHP is done through the MySQL Query function. We have already
created a new table and inserted data into that table. In this lesson we willcover the most common
MySQL Query that is used to retrieve information from a database.
Display:
Name: Tim Mellowman Age: 23
This is an example of how to use MySQL's SELECT statement in PHP. Although the MySQL
code is simple, printing out the information with PHP is somewhat more involved.
Below is a step-by-step walkthrough of the code.
15 of 58
16 of 58
The value that mysql_query returns and stores into $result is a special type of data, it is a MySQL
Resource. Additional PHP functions are required to extract the data from this Resource.
A Row of Data
The mysql_fetch_array function takes a MySQL query resource as an argument ($result)
andreturns the first row of data returned by the mysql_query. Our table example basically looks like
the table below.
name
age
Timmy Mellowman
Sandy Smith
Bobby Wallace
23
21
15
The first row of data in this table is "Timmy Mellowman" and "23". When we fetch an
array from our MySQL Resource $result it should have Timmy's name and age in it.
17 of 58
Display:
Timmy Mellowman - 23
This is just what we expected would happen! Now, the cool thing about mysql_fetch_arrayis that
you can use it again on the same MySQL Resource to return the second, third, fourth and so on
rows.You can keep doing this until the MySQL Resource has reached the end (which would be three
times in our example).
Sounds like an awfully repetitive task. It would be nice if we could get all our results from a
MySQL Resource in aneasy to do script.
Now that we know what we need to do and how to go about doing it, the code pretty much writes
itself, so let's move on to the next lesson. Just kidding! Here is the code that will print out all the rows
of our MySQL Resource.
18 of 58
Display:
Timmy Mellowman - 23
Sandy Smith - 21
Bobby Wallace - 15
And there we have all the rows from our example table! You could apply this script to any
MySQL table as long as you change both the table name in the query and the column names that we
have in the associative array.
19 of 58
MySQL Select
You have seen two types of MySQL queries thus far: the query which we usedto create a table and
the query we used to insert data into our newly createdtable. The query in this lesson is SELECT,
which is used to get informationfrom the database, so that its data can be used in our PHP script.
Name
Age
Timmy Mellowman
Sandy Smith
Bobby Wallace
23
21
15
Because we only had three entries in our table, three rows appeared above. If you added
more entries to your database's table, then you would see each additional row appear in the
above table. If you do not understand the above PHP, you can view our PHP Array Tutorial
&
PHP Loop Tutorial.
20 of 58
'$result = mysql_query...'
When you select items from a database using mysql_query, the datais returned as a
MySQL result. Since we want to use this data in our table we needto store it in a variable.
$result now holds the result from our mysql_query.
In our MySQL table "example" there are onlytwo fields that we care about: name and age.
These fields are the keys to extracting the data from our associative array. To get the name
we use $row['name'] and to getthe age we use $row['age'].
21 of 58
MySQL Where
In a previous lesson we did a SELECT query to get all the data from our "example" table.
If we wanted to select only certain entries of our table, then we would use the keyword
WHERE.
WHERE lets you specify requirements that entries must meet in order to be returned in the
MySQL result. Those entries that do not pass the test will be left out. We will be assuming
the data from a previous lesson for the following examples.
Display:
Sandy Smith - 21
22 of 58
For example '2%' wouldmatch the following: 20, 25, 2000000, 2avkldj3jklsaf, and 2!
On the other hand, '2%' would not match the following: 122, a20, and 32.
Display:
Timmy Mellowman - 23
Sandy Smith - 21
You can use this wildcard at the beginning, middle, and end of the string. Experimentwith it so
you can see for yourself how powerful this little trick can be.
Note: The wildcard was used for example purposes only. If you really wanted to explicilty select
people who are in their 20's you would use greater than 19 and less than 30 to define the 20's range.
Using a wildcard in this example would select unwanted cases, like a 2 year old and your 200 year old
great-great-great-grandparents.
23 of 58
MySQL Order By
It would be nice to be able to make MySQL results easier to read and understand. A commonway
to do this in the real world is to order a big list of items by name or amount. The way to order your
result in MySQL is to use the ORDER BY statement.
What ORDER BY does is take the a column name that you specify and sort it in alphabetical
order (or numeric order if you are using numbers). Then when you use mysql_fetch_array to print out
the result, the values are already sorted and easy to read.
Ordering is also used quite frequently to add additional functionality to webpages that useany type
of column layout. For example, some forums let you sort by date, thread title, post count, view count,
and more.
Name
Age
Timmy Mellowman
Sandy Smith
Bobby Wallace
23
21
15
24 of 58
Name
Age
Bobby Wallace
Sandy Smith
Timmy Mellowman
15
21
23
Presto! We have an ordered MySQL result! Notice that we didn't have to change any of
our PHP code.Remember this whenever you're editing a PHP script that uses MySQL.
Sometimes it may be easier to just tweak your MySQL query instead of trying to mess around
in PHP.
25 of 58
MySQL Joins
Thus far we have only been getting data from one table at a time. This is fine for simple
takes, but in most real world MySQL usage you will often need to get data frommultiple
tables in a single query.
The act of joining in MySQL refers to smashingtwo or more tables into a single table.
This means everything you have learned so far can be applied after you've created this new,
joined table.
Position
Age
Dad
Mom
Daughter
Dog
41
45
17
Meal
Position
Steak
Salad
Spinach Soup
Tacos
Dad
Mom
Dad
The important thing to note here is that the column Position contains information that can
tie these two tables together. In the "family" table, the Position column contains all the
members of the family and their respective ages. In the "food" table the Position column
contains the family member who enjoys that dish.
It's only through a shared column relationship such as this that tables can be joined
together,so remember this when creating tables you wish to have interact with each other.
26 of 58
member. If you remember from the previous lesson, this is a situation when we need to use
the WHERE clause. We want to SELECT all the dishes WHERE a family member likes it.
We will be performing a generic join of these two tables using the Position column from
each table as the connector.
Note: This example assumes you have created the MySQL tables "food" and "family". If
you do not have either of them created, you can either create them using our MySQL Create
Table lesson or do it manually yourself.
PHP and MySQL Code:
<?php
// Make a MySQL Connection
// Construct our join query
$query = "SELECT family.Position, food.Meal ".
"FROM family, food ".
"WHERE family.Position = food.Position";
$result = mysql_query($query) or die(mysql_error());
// Print out the contents of each row into a table
while($row = mysql_fetch_array($result)){
echo $row['Position']. " - ". $row['Meal'];
echo "<br />";
}
?>
The statement "WHERE family.Position = food.Position" will restrict the results to the rows where
the Position exists in both the "family" and "food" tables.
Display:
Dad - Steak
Mom - Salad
Dad - Tacos
Those are the results of our PHP script. Let's analyze the tables to make sure we agree with these
results.
Position
Age
Dad
Mom
Daughter
Dog
41
45
17
27 of 58
Meal
Position
Steak
Dad
Salad
Mom
Spinach Soup
Tacos
Dad
Our results show that there were three meals that were liked by family members. And by
manuallyperusing the tables it looks like there were indeed three meals liked by family
members.
Note: This is a very simple example of a join. If you do not understand it yet do not
despair.Joins are a very hard concept to grasp for beginning MySQL developers.
28 of 58
Position
Age
Dad
Mom
Daughter
Dog
41
45
17
Meal
Position
Steak
Dad
Salad
Mom
Spinach Soup
Tacos
Dad
We executed a simple query that selected all meals that were liked by a family member
withthis simple join query:
29 of 58
Result:
Dad - Steak
Mom - Salad
Dad - Tacos
When we decide to use a LEFT JOIN in the query instead, all the family members be listed, even if
they do not have a favorite dish in our food table.
This is because a left join will preserve the records of the "left" table.
30 of 58
Display:
Dad - Steak
Dad - Tacos
Mom - Salad
Daughter Dog -
Success! The LEFT JOIN preserved every family member, including those who don't yet have a
favorite meal in the food table! Please feel free to playaround with LEFT JOIN until you feel like you
have a solid grasp of it. This stuff isn't easy!
31 of 58
MySQL Update
Imagine that you have a MySQL table that holds the information of all the employees in your
company. One of the columns in this table is called "Seniority" and it holds an integer value of how
many months an employee has worked at your company. Unfortunately for you, your job is to update
these numbers every month.
You may be thinking that you'll have to open up your MySQL administration tool and edit each
entry by hand. That would take hours. On the other hand, you could master MySQL and have an
automated script that you run each month toget the job done for you.
In this lesson you will learn how to replace the existing data of a MySQL table with freshly
supplied up-to-date data using the UPDATE MySQL query.
Display:
Sandy Smith - 22
Now it is important to note that this query would have updated ALL records that had an age of 21
to the new age of 22. In a table where Sandy is not the onlyl entry, this may become a problem, and a
more sophisticated solution would be necessary.
32 of 58
MySQL Delete
Maintenance is a very common task that is necessary for keeping MySQL tables current. From
time to time, you may even need to delete items from your database.Some potential reasons for
deleting a record from MySQL include when: someone deletes a post from a forum,an employee
leaves a company, or you're trying to destroy your records before the federalies come!
It is important to note that this query would have deleted ALLrecords that had an age of 15. Since
Bobby was the only15 year old this was not a problem.
33 of 58
MySQL Dump
A MySQL dump is a bit slower than a raw backup because it creates all the SQL queries required
to create the tables of that database, as well as all the insert queries required to place the information
back into the database's tables.
If you want to perform the mysql dump manually, without the assistance of your hosts control
panel, then run SSH to your web server and do the following (taken from MySql.com):
.:. mysqldump --tab=/path/to/some/dir --opt db_name
If you were to open up a MySQL dump file you would see a slew of SQL queries that you would
probably be able to understand (if you've already read through this whole tutorial!).
34 of 58
happens and your web host loses all your database information!
35 of 58
With this type of wording, we can assume that MySQL's aggregate functions are something that
will be very top-level, or in other words, the opposite of detailed.
The most common types of aggregate functions let you find out things like the minimum,
maximum and even the average of a "grouped" set of data. The trick to understanding aggregate
functions is often understanding what kind of data is being grouped and analyzed.
id
name
type
price
123451
123452
123453
123454
123455
123456
123457
123458
Music
Toy
Toy
Clothing
Clothing
Music
Music
Food
19.99
3.99
89.95
32.50
34.97
3.99
21.55
8.73
36 of 58
Our query needs to return two columns: product type and minimum price. Additionally,
we want to use the type column as our group. The SELECT statement we are about to use
will look different because it includes an aggregate function, MIN, and the GROUP BY
statement, but otherwise it isn't any different than a normal SELECT statement.
PHP and MySQL Code:
<?php
// Make a MySQL Connection
$query = "SELECT type, MIN(price) FROM products GROUP BY type";
$result = mysql_query($query) or die(mysql_error());
// Print out result
while($row = mysql_fetch_array($result)){
echo $row['type']. " - $". $row['MIN(price)'];
echo "<br />";
}
?>
Our "products" table has four types of products: Music, Toy, Clothing and Food. When we
GROUP BY type then we get one result for each of these types.
Display:
Clothing - $32.50
Food - $8.73
Music - $3.99
Toy - $3.99
The next few lessons will provide a walkthrough for using other popular MySQL aggregate
functions in conjunction with the GROUP BY statement.
37 of 58
id
name
type
price
123451
123452
123453
123454
123455
123456
123457
123458
Music
Toy
Toy
Clothing
Clothing
Music
Music
Food
19.99
3.99
89.95
32.50
34.97
3.99
21.55
8.73
38 of 58
Display:
There
There
There
There
are
are
are
are
2
1
3
2
Clothing items.
Food items.
Music items.
Toy items.
39 of 58
id
name
type
price
123451
123452
123453
123454
123455
123456
123457
123458
Music
Toy
Toy
Clothing
Clothing
Music
Music
Food
19.99
3.99
89.95
32.50
34.97
3.99
21.55
8.73
40 of 58
Display:
Total
Total
Total
Total
Clothing = $67.47
Food = $8.73
Music = $45.53
Toy = $93.94
41 of 58
id
name
type
price
123451
123452
123453
123454
123455
123456
123457
123458
Music
Toy
Toy
Clothing
Clothing
Music
Music
Food
19.99
3.99
89.95
32.50
34.97
3.99
21.55
8.73
42 of 58
Display:
The
The
The
The
average
average
average
average
price
price
price
price
of
of
of
of
Clothing is $33.735000
Food is $8.730000
Music is $15.176667
Toy is $46.970000
Those prices seem very reasonable, in my opinion. I think our imaginary customers should change
their view and keep buying products from us.
43 of 58
id
name
type
price
123451
123452
123453
123454
123455
123456
123457
123458
Music
Toy
Toy
Clothing
Clothing
Music
Music
Food
19.99
3.99
89.95
32.50
34.97
3.99
21.55
8.73
MySQL MIN
The MIN function is an aggregate function that findsthe smallest value in a group. The
products table that is displayed above has several products of various types. One use of MIN
might be to find out thecheapest item in each group.
Just as we did in theAggregate Introduction Lesson, we are going to GROUP BY type to
create four groups: Music, Toy, Clothing and Food. The column that will have the MIN
functionapplied to it is, of course, price.
44 of 58
Display:
The
The
The
The
cheapest
cheapest
cheapest
cheapest
Clothing is $32.50
Food is $8.73
Music is $3.99
Toy is $3.99
45 of 58
id
name
type
price
123451
123452
123453
123454
123455
123456
123457
123458
Music
Toy
Toy
Clothing
Clothing
Music
Music
Food
19.99
3.99
89.95
32.50
34.97
3.99
21.55
8.73
46 of 58
Display:
The
The
The
The
most
most
most
most
expensive
expensive
expensive
expensive
Clothing is $34.97
Food is $8.73
Music is $21.55
Toy is $89.95
47 of 58
Display:
Normal: SELECT * FROM customers WHERE username = 'timmy'
Injection: SELECT * FROM customers WHERE username = '' OR 1''
The normal query is no problem, as our MySQL statement will just select everything from
customers that has a username equal to timmy.
However, the injection attack has actually made our query behave differently than we intended. By
using a single quote (') they have ended the string part of our MySQL query
.:. username = ' '
and then added on to our WHERE statement with an OR clause of 1 (always true).
48 of 58
This ORclause of 1 will always be true and so every single entry in the "customers" table would
be selected by this statement!
Display:
SELECT * FROM customers WHERE username = ' '; DELETE FROM customers WHERE 1 or
username = ' '
If you were run this query, then the injected DELETE statement would completely empty your
"customers" table. Now that you know this is a problem, how can you prevent it?
49 of 58
Display:
Escaped Bad Injection:
SELECT * FROM customers WHERE username = '\' OR 1\''
Escaped Evil Injection:
SELECT * FROM customers WHERE username = '\'; DELETE FROM customers WHERE 1 or
username = \''
Notice that those evil quotes have been escaped with a backslash \, preventing the injection attack.
Nowall these queries will do is try to find a username that is just completely ridiculous:
.:. Bad: \' OR 1\'
.:. Evil: \'; DELETE FROM customers WHERE 1 or username = \'
And I don't think we have to worry about those silly usernames getting access to our MySQL
database.So please do use the handy mysql_real_escape_string() function to help prevent SQL
Injectionattacks on your websites. You have no excuse not to use it after reading this lesson!
50 of 58
Y - year segment
M - month segment
D - day segment
H - hour segment
m - minute segment, note the lower case
S - sec segment
If you try to enter a date in a format other than the Year-Month-Day format then it might work,but
it won't be storing them as you expect.
To insert the current date into your table you can use MySQL's built-in function CURDATE() in
yourquery. Below we have created 2 dates, one manually and one using CURDATE().
PHP & MySQL Code:
<?php
//This assumes you have already created the 'dateplayground' table
//Connect to DB
$query_manual = "INSERT INTO dateplayground (dp_name, dp_date)
VALUES ('DATE: Manual Date', '2020-2-14')";
$query_auto = "INSERT INTO dateplayground (dp_name, dp_date)
VALUE ('DATE: Auto CURDATE()', CURDATE() )";
mysql_query($query_manual) or die(mysql_error());
mysql_query($query_auto) or die(mysql_error());
?>
51 of 58
format is simply:
.:. YYYY
.:. Date Range: 1901 to 2155
It should be noted that the range of years that can be stored are from1901 to 2155. If you need to
store years outside that range then use DATE instead of YEAR.
Below we have created another manual and automatic example to show off YEAR's use. We have
used CURDATE() again, even though it provides a lot more information than YEAR requires. All the
date information, besides the year, is just ignored by YEAR.
PHP & MySQL Code:
<?php
$query_manual = "INSERT INTO dateplayground (dp_name, dp_year)
VALUES ('YEAR: Manual Year', '2011')";
$query_auto = "INSERT INTO dateplayground (dp_name, dp_year)
VALUE ('YEAR: Auto CURDATE()', CURDATE() )";
mysql_query($query_manual) or die(mysql_error());
mysql_query($query_auto) or die(mysql_error());
?>
The hyphen and the colon are the standard character to separate a date and time respectively, but
MySQL allows for you to choose your own delimiters if you wish.
With DATETIME you can choose to store the date or the time and date together, but you cannot
store just the time.
In our example below we have manually stored a complete DATETIME and also used three
different MySQL functions: CURDATE(), CURTIME(), and NOW().
52 of 58
The big difference between DATETIME and TIMESTAMP is the date ranges that can be stored.
Below we have purposely entered an erroneous date, manually, so you can see what happens when
you enter a date that is outside the boundaries of a this type.
PHP & MySQL Code:
<?php
//This will fail
$query_manual = "INSERT INTO dateplayground (dp_name, dp_timestamp)
VALUES ('TIMESTAMP: Manual Timestamp', '1776-7-4 04:13:54')";
$query_autodate = "INSERT INTO dateplayground (dp_name, dp_timestamp)
VALUE ('TIMESTAMP: Auto CURDATE()', CURDATE() )";
//This will fail
$query_autotime = "INSERT INTO dateplayground (dp_name, dp_timestamp)
VALUE ('TIMESTAMP: Auto CURTIME()', CURTIME() )";
$query_autonow = "INSERT INTO dateplayground (dp_name, dp_timestamp)
VALUE ('TIMESTAMP: Auto NOW()', NOW() )";
mysql_query($query_manual) or die(mysql_error());
mysql_query($query_autodate) or die(mysql_error());
mysql_query($query_autotime) or die(mysql_error());
mysql_query($query_autonow) or die(mysql_error());
?>
53 of 58
dp_name
dp_year
dp_date
dp_datetime
dp_timestamp
0000
0000
2011
2006
0000
0000
0000
0000
0000
0000
0000
0000
2020-02-14
2006-09-19
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
1776-07-04
2006-09-19
0000-00-00
2006-09-19
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
0000-00-00
2006-09-19
0000-00-00
2006-09-19
00:00:00
00:00:00
00:00:00
00:00:00
04:13:54
00:00:00
00:00:00
16:56:56
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
00:00:00
16:56:56
Notice that the rows DATETIME: Auto CURTIME(), TIMESTAMP: Manual Timestamp,
and TIMESTAMP: Auto CURTIME() have all zeros. This is because theywere the INSERTs
that were erroneous. When you enter dates that are out of the range or in the wrong format for
a given date type, MySQL willoften just enter in the default value of all zeros.
54 of 58
When manually entering a time into MySQL it is highly recommended that youuse the
exact format show above. MySQL allows for many different ways to entera time, but they
don't always behave as you would expect. Using the standard/extendedformat we have
shown above will help you avoid annoying problems.
Below we have entered 3 manual times into MySQL. The first is done in the
recommendedformat, the second is a shorthand version of the first and the final example
isoutside the allowed time range.
PHP & MySQL Code:
<?php
//This assumes you have already created the 'dateplayground' table
//Connect to DB
$query_manual1 = "INSERT INTO timeplayground (dp_name, dp_time)
VALUES ('TIME: Manual Time', '12:10:00')"; //perfectly done
$query_manual2 = "INSERT INTO timeplayground (dp_name, dp_time)
VALUES ('TIME: Manual Time', '1210')"; // will this shorthand work?
$query_manual3 = "INSERT INTO timeplayground (dp_name, dp_time)
VALUES ('TIME: Manual Time', '978:31:12')"; //how about this?
mysql_query($query_manual1) or die(mysql_error());
mysql_query($query_manual2) or die(mysql_error());
mysql_query($query_manual3) or die(mysql_error());
?>
55 of 58
dp_name
dp_time
TIME:
TIME:
TIME:
TIME:
12:10:00
00:12:10
838:59:59
14:30:36
Manual Time
Manual Time
Manual Time
Auto NOW()
Our first manual time was handled just fine, but our second one did not. MySQL
interpreted 1210 as MM:SS instead of HH:MM as we assumed. This iswhy it's best to use
the formats we've described at the beginning.
The third manual entry was changed from 978:31:12 to 838:59:59, so that it wouldbe
within TIME's range.
56 of 58
With our newly created table we are going to update the "employee_records2" table to include an
index.
57 of 58
MySQL Code:
CREATE INDEX id_index ON employee_records2(employeeID)
We keep our existing employeeID field and create a new index id_index that is made up of
employeeID data.
58 of 58