Professional Documents
Culture Documents
1 What is MySQL
MySQL is currently the most popular open source database server in existence. On top
of that, it is very commonly used in conjunction with PHP scripts to create powerful and
dynamic server-side applications. MySQL is a relational database management
system that runs as a server providing multi-user access to a number of databases.
MySQL Usage
2 Create a database
In this section, we will learn how to create a database. We will create a database called
employees that contains details of employees of our company Bignet. The details we plan to
store would be names, salaries, age, addresses, emails, birth dates, hobbies, phone numbers
etc.
You need to open the phpMyAdmin. The interface of phpMyAdmin is shown on next page.
Select SQL tab on the top. The interface will look like the figure shown below.
All the commands in this lab will be typed in this SQL interface. Type the following command
and get the following result.
This means that you have successfully created the database. Now, let's see how many
databases you have on your system. Issue the following command and then get the
following result.
SHOW DATABASES
+ +
| Database |
+ +
| employees |
| mysql |
| test |
+ +
3 rows in set (0.00 sec)
Here we have three databases, two created by MySQL during installation and our
employees database.
Using a database
Let’s start the mysql client program and select our database. At the sql tab, issue the
command:
SELECT DATABASE();
+ -+
| DATABASE() |
+ -+
| |
+ -+
1 row in set (0.01 sec)
Typing the command SELECT DATABASE(); will list the database that we selected to use.
The above shows that no database has been selected. Actually, every time we work with
mysql client, we have to specify which database we plan to use. There are several ways of
doing it. It's necessary to specify the database we plan to use; else MySQL will throw an
error.
Create tables
In this section, we will explore the MySQL commands to create database tables. Databases
store data in tables. In simplest terms, tables consist of rows and columns. Each column
defines data of a particular type. Rows contain individual records. Consider the following:
The table above contains four columns that store the name, age, country and email. Each
row contains data for one individual. This is called a record. To find the country and email of
Alexander, you'd first pick the name from the first column and then look in the third and
fourth columns of the same row. A database can have many tables; they are tables that
contain the actual data. Hence, we can segregate related (or unrelated) data in different
tables. For our employees database, we'll have one table that stores company details of the
employees. The other table would contain personal information. Let's make the first table.
The SQL command for creating tables looks complex when you view it for the first time.
Don't worry if you get confused, we'll be discussing this in more detail later.
The CREATE TABLE keywords are followed by the name of the table we want to create,
employee_data. Each line inside the parenthesis represents one column. These columns
store the employee id, first name, last name, title, age, years of service with the company,
salary, perks and emails of our employees and are given descriptive names emp_id,
f_name, l_name, title, age, yos, salary, perks and email, respectively.
Each column name is followed by the column type. Column types define the type of data
the column is set to contain. In our example, columns, f_name, l_name, title and email
would contain small text strings, so we set the column type to varchar, which means
variable characters. The maximum number of characters for varchar columns is specified
by a number enclosed in parenthesis immediately following the column name. Columns
age, yos, salary and perks would contain numbers (integers), so we set the column type
to int. Our first column (emp_id) contains an employee id. Its column type looks really
long. Let's break it down.
Type Description
int specify that the column type is an integer (a number).
unsigned determine that the number will be unsigned (positive integer).
specifies that the value cannot be null (empty); that is, each
not null row in the column would have a value.
auto_increment When MySQl comes across a column with an auto_increment
attribute, it generates a new value that is one greater than
the largest value in the column. Thus, we don't need to
supply values for this column, MySQL generates it for us!
Also, it follows that each value in this column would be
unique. (We'll discuss the benefits of having unique values
very shortly).
primary key helps in indexing the column that help in faster searches.
Each value has to be unique.
Note:
You can type the entire command on one line if you so want.
You screen should look similar to:
Using tables
Now that we've created our employee_data table, let's check its listing. Type SHOW
TABLES at the SQL query box. This should present you with the following display:
SHOW TABLES
+ +
| Tables in employees |
+ +
| employee_data |
+ +
1 row in set (0.00 sec)
Describing tables
MySQL provides us with a command that displays the column details of the tables.
Issue the following command at the SQL query box:
DESC employee_data
+ + +- -+ -+ -+ +
| Field | Type | Null | Key | Default | Extra |
+ + +- -+ -+ -+ +
| emp_id | int(10) unsigned | |PRI|0 | auto_increment |
| f_name | varchar(20) | YES | | NULL | |
| l_name | varchar(20) | YES | | NULL | |
| title | varchar(30) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| yos | int(11) | YES | | NULL | |
| salary | int(11) | YES | | NULL | |
| perks | int(11) | YES | | NULL | |
| email | varchar(60) | YES | | NULL | |
+ + +- -+ -+ -+ +
9 rows in set (0.00 sec)
DESCRIBE or DESC lists all the column names along with their column types of the table.
Now let's see how we can insert data into our table.
Insert data into tables
The INSERT SQL statement impregnates our table with data as follows.
where table_name is the name of the table into which we want to insert data;
column1, column2 etc. are column names and value1, value2 etc. are values for the
respective columns. This is quite simple. The following statement inserts the first
record in employee_data table.
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) values
("Ushik", "Shrestha", "CEO", 28, 4, 200000, 50000, "ushik@bignet.com")
As with other MySQL statements, you can enter this command on one line or span it
in multiple lines. Some important points:
• The table name is employee_data
• The values for columns f_name, l_name, title and email are text strings
and surrounded with quotes.
• Values for age, yos, salary and perks are numbers (intergers) and without quotes.
• You'll notice that we've inserted data in all columns except emp_id. This is
because, we leave this job to MySQL, which will check the column for the largest
value, increment it by one and insert the new value.
Once you type the above command correctly in the mysql client, it displays a
success message.
Inserting additional records requires separate INSERT statements. In order to make life
easier, INSERT statements can be packed into a file (one statement on one line). In this
example, the file is called employee.dat. Note that the file extension is not necessarily
“.dat”. It could be “.txt” or anything as needed.
employee.dat
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email)
VALUES ("John", "Hagan", "Senior Programmer", 32, 4, 120000, 25000,
"john_hagan@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email)
VALUES ("Ganesh", "Pillai", "Senior Programmer", 32, 4, 110000, 20000,
"g_pillai@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email)
VALUES ("Anamika", "Pandit", "Web Designer", 27, 3, 90000, 15000,
"ana@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email)
VALUES ("Mary", "Anchor", "Web Designer", 26, 2, 85000, 15000, "mary@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email)
VALUES ("Fred", "Kruger", "Programmer", 31, 3, 75000, 15000, "fk@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email)
VALUES ("John", "MacFarland", "Programmer", 34, 4, 80000, 16000, "john@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email)
VALUES ("Edward", "Sakamuro", "Programmer", 25, 2, 75000, 14000, "eddie@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Alok", "Nanda", "Programmer", 32, 3, 70000, 10000, "alok@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Hassan", "Rajabi", "Multimedia Programmer", 33, 3, 90000, 15000, "hasan@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Paul", "Simon", "Multimedia Programmer", 43, 2, 85000, 12000, "ps@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Arthur", "Hoopla", "Multimedia Programmer", 32, 1, 75000, 15000, "arthur@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Kim", "Hunter", "Senior Web Designer", 32, 2, 110000, 20000, "kim@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Roger", "Lewis", "System Administrator", 35, 2, 100000, 13000, "roger@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Danny", "Gibson", "System Administrator", 34, 1, 90000, 12000, "danny@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Mike", "Harper", "Senior Marketing Executive", 36, 2, 120000, 28000,
"mike@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Monica", "Sehgal", "Marketing Executive", 30, 3, 90000, 25000, "monica@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Hal", "Simlai", "Marketing Executive", 27, 2, 70000, 18000, "hal@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Joseph", "Irvine", "Marketing Executive", 27, 2, 72000, 18000, "joseph@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Shahida", "Ali", "Customer Service Manager", 32, 3, 70000, 9000, "shahida@bignet.com");
INSERT INTO employee_data (f_name, l_name, title, age, yos, salary, perks, email) VALUES
("Peter", "Champion", "Finance Manager", 36, 4, 120000, 25000, "peter@bignet.com");
Querying MySQL tables
Our employee_data table now contains enough data for us to work with. Let us see how we
can extract (query) it. Querying involves the use of the MySQL SELECT command. Data is
extracted from the table using the SELECT SQL command. Here is the format of a SELECT
statement:
SELECT column_names
FROM table_name
[WHERE ...conditions]
[Group By ...column_name]
The conditions part of the statement is optional (we'll go through this later). Basically, you
need to know the column names and the table name from which to extract the data. For
example, in order to extract the first and last names of all employees, issue the following
command.
SELECT f_name, l_name FROM employee_data
The statement tells MySQL to list all the rows from columns f_name and l_name. On close
examination, you'll find that the display is in the order in which the data was inserted.
Furthermore, the last line indicates the number of rows our table has (21).
To display the entire table, we can either enter all the column names or use a simpler
form of the SELECT statement.
SELECT *FROM employee_data
Some of you might recognize the * in the above statement as the wildcard. Though we
don't use that term for the character here, it serves a very similar function. The * means
'ALL columns'. Thus, the above statement lists all the rows of all columns.
Exercise 1 (Classwork)
1. Write the complete SQL statement for creating a new database called
employee
2. How would you list all the databases available on the system?
3. Which statement is used to list the information about a table? How do you use
this statement?
4. Write the statement for inserting the following data in employee_data table
First name: Ushik
Last name: Shrestha
Title: Database Instructor
Age: 34
Years of service: 2
Salary: 95000
Perks: 17000
email: ushik@bignet.com
5. Write the statement for listing data from salary, perks and yos (year of
service) columns of employee_data table.
Selecting data using conditions
Now, we know that the conditions are optional (we've seen several examples in the last
session... and you would have encountered them in the assignments too). The SELECT
statement without conditions lists all the data in the specified columns. The strength of
RDBMS lies in letting you retrieve data based on certain specified conditions. In this section
we will look at the SQL Comparison Operators.
• The = and != comparison operators
This displays the first and last names of all employees whose first names are John. Note that
the word John in the condition is surrounded by single quotes. You can also use double
quotes. The quotes are important since MySQL will throw an error if they are missing. Also,
MySQL comparisons are case insensitive; which means "john", "John" or even "JoHn"
would work.
Select the first and last names of all employees who are programmers.
SELECT f_name,l_name FROM employee_data WHERE title="Programmer"
List the first and last names of all employees who are 32 years old.
Remember that the column type of age was int, hence it's not necessary to surround 32
with quotes. This is a subtle difference between text and integer column types. The !=
means 'not equal to', the opposite of the equality operator.
• The greater than and lesser than operators
Let’s retrieve the first names of all employees who are older than 32.
Now, let's list all employees who have had less than 3 years of service in the company.
Exercise 2 (Classwork)
1. What will the following SELECT statement display?
SELECT * from employee_data where salary <=100000;
2. Write SELECT statement to extract the ids of employees who are more than 30
years of age.
3. Write SELECT statement to extract the first and last names of all web designers.
4. List all full name of employees (last name followed by first name) who hold the
title of Marketing Executive.
3 Pattern matching with text data
We will now learn how to match text patterns using the WHERE clause and the LIKE
operator in this section. The equal to (=) comparison operator helps in selecting strings
that are identical. Thus, to list the names of employees whose first names are ‘Ushik’, we
can use the following SELECT statement.
What if we want to display employees whose first names begin with the alphabet U? SQL
allows for some pattern matching with string data. For example,
You will notice that we have replaced == with LIKE and we've used a percentage sign
(%) in the condition. The % sign functions as a wildcard (similar to the usage of * in DOS
and Linux systems). It signifies any character. Thus, "U%" means all strings that begin
with the alphabet U. Similarly "%S" selects strings that end with S and "%H%", strings
that contain the alphabet H. Let’s list all the employees that have Senior in their titles.
mysql> SELECT f_nam e, l_name FROM employee_data WHERE title LIKE '%senior%';
+ + + - - +
| f_name | l_name | title |
+ + + - - +
| John | Hagan | Senior Programmer |
| Ganesh | Pillai | Senior Programmer |
| Kim | Hunter | Senior Web Designer |
| Mike | Harper | Senior Marketing Executive |
+ + + - - +
4 rows in set (0.00 sec)
mysql> SELECT f_name, l_name FROM employee_data WHERE l_name LIKE '%a';
+ + +
| f_name | l_name |
+ + +
| Manish | Sharma |
| Alok | Nanda |
| Arthur | Hoopla |
+ + +
3 rows in set (0.00 sec)
Exercise 3 (Explore at home)
1. What will the following statement display
SELECT f_name, l_name, salary FROM
employee_data WHERE f_name LIKE '%k%';
2. List all employees whose last names begin with S.
3. Display the names of all employees in the marketing division.
4. List the last names and titles of all programmers.
Let's display the last names of employees whose last names start with the alphabet S or K.
Here is a more complex example. This example lists the names and ages of employees
whose last names begin with S or P, and who are less than 30 years of age.
Note the usage of parenthesis in the statement above. The parenthesis is meant to
separate the various logical conditions and remove any ambiguity. The NOT operator helps
in listing all non-programmers. (Programmers include Senior programmers, Multimedia
Programmers and Programmers).
Exercise 4 (Classwork)
1. What is displayed by the following statement?
SELECT l_name, f_name FROM employee_data
WHERE title NOT LIKE '%marketing%' AND age < 30;
2. List the first and last names of all employees who draw less than or equal to $90000 and
are not Programmers, Senior programmers or Multimedia programmers.
3. List all ids and names of all employees between 32 and 40 years of age.
4. Select names of all employees who are 32 years of age and are not programmers.
IN and BETWEEN
In this section, we consider IN and BETWEEN operators. To list employees who are
Web Designers or System Administrators, we use a SELECT statement:
SQL also provides an easier method with IN. Its usage is quite simple.
Suffixing NOT to IN will display data that is NOT found IN the condition. The following lists
employees who hold titles other than Programmer and Marketing Executive.
BETWEEN is employed to specify integer ranges. Thus instead of age >= 32 AND age
<= 40, we can use age BETWEEN 32 and 40.
You can use NOT with BETWEEN as in the following statement that lists employees
who draw salaries less than $90000 and more than $150000.
Ordering data
This section, we look at how we can change the display order of the data extracted from
MySQL tables using the ORDER BY clause of the SELECT statement. The data that we have
retrieved so far was always displayed in the order in which it was stored in the table.
Actually, SQL allows for sorting of retrieved data with the ORDER BY clause. This clause
requires the column name based on which the data will be sorted. Let's see how to display
employee names with last names sorted alphabetically (in ascending order).
These are the first five entries in our table. You can couple LIMIT with ORDER BY. Thus,
the following displays the 4 senior most employees.
Extracting Subsets
Limit can also be used to extract a subset of data by providing an additional argument.
The general form of this LIMIT is:
Exercise 7 (Classwork)
1. List the names of 3 youngest employees in the company.
th
2. Extract the next 5 entries starting with the 4 row.
3. Display the names and salary of the employee who draws the largest salary.
4. What does the following statement display?
SELECT emp_id, age, perks
from employee_data ORDER BY
perks DESC LIMIT 10;
Distinct Keyword
In this section, we will look at how to select and display records from MySQL tables using
the DISTINCT keyword that eliminates the occurrences of the same data. To list all titles in
our company database, we can throw a statement as:
You'll notice that the display contains multiple occurrences of certain data. The
SQL DISTINCT clause lists only unique data. Here is how you use it.
This shows we have 11 unique titles in the company. Also, you can sort the unique
entries using ORDER BY.
MySQL provides inbuilt functions to find the minimum and maximum values. SQL provides
5 aggregate functions. They are:
1. MIN(): Minimum value
2. MAX(): Maximum value
3. SUM(): The sum of values
4. AVG(): The average values
5. COUNT(): Counts the number of rows
In this session, we'll look at finding the minimum and maximum values in a column.
Minimum value
Maximum value
The SUM() aggregate function calculates the total of values in a column. You are required
to give the column name, which should be placed inside parenthesis. Let's see how much
Bignet spends on salaries.
This shows a hidden gem of the SELECT command. You can add, subtract, multiply
or divide values. Actually, you can write full blown arithmetic expressions.
The AVG() aggregate function is employed for calculating averages of data in columns.
Naming Columns
MySQL allows you to name the displayed columns. Then you can use more descriptive
terms. This is achieved with AS.
Such pseudo names make the results clearer to users. The important thing to remember
here is that if you assign pseudo names that contain spaces, enclose the names in quotes.
Here is another example:
The COUNT() aggregate functions counts and displays the total number of entries. For
example, to count the total number of entries in the table, issue the command below.
The GROUP BY clause allows us to group similar data. Thus, to list all unique titles in
our table we can issue
For the command above, MySQL first groups different titles and then executes count on
each group. “GROUP BY” can also be applied to any other aggregate functions e.g., sum(),
min().
HAVING Clause
To list the average salary of employees in different departments (titles), we use the
GROUP BY clause, as in:
Now, suppose you want to list only the departments where the average salary is more than
$100000, you can't do it, even if you assign a pseudo name to AVG(salary) column. A
short explanation is that the WHERE clause is used for filtering rows. However, AVG(salary)
is not a value of any row. That is, it is an aggregated value resulted from summarizing the
data of many rows. Here, the HAVING clause comes to our rescue.
SELECT title, AVG(salary)
FROM employee_data
GROUP BY title
HAVING AVG(salary) > 100000
+ - + +
| title | AVG(salary) |
+ - + +
| CEO | 200000.0000 |
| Finance Manager | 120000.0000 |
| Senior Marketing Executive | 120000.0000 |
| Senior Programmer | 115000.0000 |
| Senior Web Designer | 110000.0000 |
+ - + +
5 rows in set (0.00 sec)
In addition to the four basic arithmetic operations addition (+), subtraction (-),
multiplication (*) and division (/), MySQL also has the modulo (%) operator. This
calculates the remainder left after division.
SELECT 87 % 9
+ -+
|87% 9 |
+ -+
| 6 |
+ -+
1 row in set (0.00 sec)
MOD(x, y)
Display the remainder of x divided by y, the same as the modulus operator.
ABS(x)
Calculate the Absolute value of number x. Thus, if x is negative its positive value is
returned.
SELECT ABS(-4.05022)
+ +
| ABS(-4.05022) |
+ +
| 4.05022 |
+ +
1 row in set (0.00 sec)
SIGN(x)
Return 1, 0 or -1 when x is positive, zero or negative, respectively.
SELECT SIGN(-34.22)
+ +
| SIGN(-34.22) |
+ +
| -1 |
+ +
1 row in set (0.00 sec)
SELECT SIGN(0)
+ +
| SIGN(0) |
+ +
| 0 |
+ +
1 row in set (0.00 sec)
POWER(x,y)
Calculate the value of x raised to the power of y.
SELECT POWER(4,3)
+ -+
| POWER(4,3) |
+ -+
| 64.000000 |
+ -+
1 row in set (0.00 sec)
SQRT(x)
Calculate the square root of x.
SELECT SQRT(3)
+ +
| SQRT(3) |
+ +
| 1.732051 |
+ +
1 row in set (0.00 sec)
SELECT ROUND(14.492)
+ +
| ROUND(14.492) |
+ +
| 14 |
+ +
1 row in set (0.00 sec)
SELECT ROUND(4.5002)
+ +
| ROUND(4.5002) |
+ +
| 5 |
+ +
1 row in set (0.00 sec)
SELECT ROUND(-12.773)
+ +
| ROUND(-12.773) |
+ +
| -13 |
+ +
1 row in set (0.00 sec)
SELECT ROUND(7.235651, 3)
+ -------------------- +
| ROUND(7.235651, 3) |
+ -------------------- +
| 7.236 |
+ -------------------- +
1 row in set (0.00 sec)
FLOOR(x)
Return the largest integer that is less than or equal to x.
SELECT FLOOR(23.544)
+ - +
| FLOOR(23.544) |
+ - +
| 23 |
+ - +
1 row in set (0.00 sec)
SELECT FLOOR(-18.4)
+ +
| FLOOR(-18.4) |
+ +
| -19 |
+ +
1 row in set (0.00 sec)
CEILING(x)
Return the smallest integer that is great than or equal to x.
SELECT CEILING(23.544)
+----------------- +
| CEILING(23.544) |
+ ----------------- +
| 24 |
+ ----------------- +
1 row in set (0.00 sec)
SELECT CEILING(-18.4)
+ - - +
| CEILING(-18.4) |
+ - - +
| -18 |
+ - - +
1 row in set (0.00 sec)
SELECT SIN(0)
+ +
| SIN(0) |
+ +
| 0.000000 |
+ +
1 row in set (0.00 sec)
The MySQL SELECT command is like a print or write command of other languages. You can
ask it to display text strings, numeric data, the results of mathematical expressions etc.
SELECT version()
+ - +
| version() |
+ - +
| 5.0.51b-community-nt-log |
+ - -+
1 row in set (0.00 sec)
SELECT now()
+ - +
| now() |
+ - +
| 2012-08-18 17:12:34 |
+ --+
1 row in set (0.00 sec)
SELECT DAYOFMONTH(CURRENT_DATE)
+ - -+
| DAYOFMONTH(CURRENT_DATE) |
+ - -+
| 18 |
+ - -+
1 row in set (0.01 sec)
SELECT MONTH(CURRENT_DATE)
+ --+
| MONTH(CURRENT_DATE) |
+ --+
| 8 |
+ --+
1 row in set (0.00 sec)
SELECT YEAR(CURRENT_DATE)
+ -+
| YEAR(CURRENT_DATE) |
+ -+
| 2012 |
+ ---+
1 row in set (0.00 sec)
Displaying Text Strings
Obviously you can provide pseudo names for these columns using AS.
Evaluating Expressions
SELECT ((4 * 4) / 10 ) + 25
+ - +
|((4*4)/10)+25|
+ - +
| 26.60 |
+ - +
1 row in set (0.00 sec)
Concatenation
With SELECT you can concatenate values for display. CONCAT accepts arguments between
parentheses. These can be column names or plain text strings. Text strings have to be
surrounded with quotes (single or double).
UPDATE table_name
SET column_name1 = value1,
column_name2 = value2, ...
[WHERE conditions];
Obviously, like other SQL commands, you can type in one line or multiple lines. Let's look
at some examples. Bignet has been doing good business. The CEO increases his salary by
$20000 and perks by $5000. His previous salary was $200000 and perks were $50000.
UPDATE employee_data
SET salary=220000, perks=55000
WHERE title='CEO'
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings:
You can test this out by listing the data in the table.
Actually, you don't need to know the previous salary explicitly. You can be cheeky and use
arithmetic operators. Thus, the following statement would have done the same job without
us knowing the original data beforehand.
UPDATE employee_data
SET salary = salary + 20000,
perks = perks + 5000
WHERE title='CEO'
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
Another progressive (???) step Bignet takes is changing the titles of Web Designer to Web
Developer.
UPDATE employee_data
SET title = 'Web Developer'
WHERE title = 'Web Designer'
It's important that you take a long hard look at the condition part in the
statement before executing update; else you might update the wrong data. Also, an
UPDATE statement without conditions will update all the data in the column in all rows! Be
very careful.
Orders Table
Notice that the "PersonID" column in the "Orders" table points to the "PersonID" column in
the "Persons" table.
The "PersonID" column in the "Persons" table is the PRIMARY KEY in the "Persons" table.
The "PersonID" column in the "Orders" table is a FOREIGN KEY in the "Orders" table.
The FOREIGN KEY constraint is used to prevent actions that would destroy links between
tables.
The FOREIGN KEY constraint also prevents invalid data from being inserted into the foreign
key column, because it has to be one of the values contained in the table it points to.
8 MySQL Date Data Type (I)
Till now we've dealt with text (varchar) and numbers (int) data types. To understand date
type, we'll create one more table. Create employee_per.dat file below and follow the
instructions. The file contain the CREATE table command as well as the INSERT
statements.
employee_per.dat
CREATE TABLE employee_per (e_id int unsigned not null primary key, address
varchar(60), phone int, p_email varchar(60), birth_date DATE, sex ENUM('M', 'F'),
m_status ENUM('Y','N'), s_name varchar(40), children int);
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name) values (1, '202, Holder Street', 7176167, 'nettish@hotmail.com', '1972-03-
16', 'M', 'Y', 'Anamika Sharma');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (2, '1232 Marker Hotel Road', 5553312,
'johnny4@hotmail.com', '1968-04-02', 'M', 'Y', 'Jane Donner', 3);
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (3, '90 Potter Avenue', 4321211, 'gpillai@youremail.com',
'1968-09-22', 'M', 'Y', 'Sandhya Pillai', 2);
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name) values (4, '202, Holder Street', 7176167, 'twinkleinmyeyes@hotmail.com',
'1972-08-09', 'F', 'Y', 'Manish Sharma');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status)
values (5, 'Apartment #8, Fuhrer Building, Cobb Street', 8973242,
'holychild@heavenlymail.com', '1974-10-13', 'F', 'N');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status)
values (6, '46 Elm Street', '6666666', 'killeratlarge@elmmail.com', '1969-12-31',
'M', 'N');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (7, '432 Mercury Avenue', 7932232, 'macmohan@hotmail.com',
'1966-8-20', 'M', 'Y', 'Mary Shelly', '3');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status)
values (8, '88 Little Tokyo', 5442994, 'eddies@givememail.com', '1975-01-12', 'M',
'N');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (9, '64 Templeton Road', 4327652,
'nandy@physicalemail.com', '1968-05-19', 'M', 'Y', 'Manika Nanda', '1');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status)
values (10, '134 Metro House, Handenson Street', 5552376, 'rajabihn@hotmail.com',
'1967-07-06', 'M', 'N');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (11, '1 Graceland, Aaron Avenue', 5433879,
'soundofsilence@boxer.net', '1957-11-04', 'M', 'Y', 'Muriel Lovelace', '4');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (12, '97 Oakland Road', 5423311,
'kingarthur@roundtable.org', '1968-02-15', 'M', 'Y', 'Rina Brighton', 3);
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (13, '543 Applegate Lane', 3434343, 'levy@coolmail.com',
'1968-09-03', 'F', 'Y', 'Matt Shikari', '2');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status)
values (14, '765 Flasher Street', 7432433, 'tinkertone@email.com', '1965-04-28', 'M',
'N');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (15, '98 Gunfoundry', 6500787, 'danny@foolhardy.com', '1966-
06-23', 'M', 'Y', 'Betty Cudly', 3);
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (16, '#5 Comely Homes', 5432132, 'mikeharper@coldmail.com',
'1964-03-06', 'M', 'Y', 'Stella Stevens', 2);
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (17, '652 Devon Building, 6th Jake Avenue', 5537885,
'mona@darling.com', '1970-04-18', 'F', 'Y', 'Edgar Alan', 1);
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status)
values (18, 'Apartment #9, Together Towers', 5476565, 'odessey2000@hotmail.com',
'1973-10-09', 'M', 'N');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status)
values (19, 'Apartment #9, Together Towers', 5476565, 'jirvine@hotteremail', '1973-1-
20', 'M', 'N');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status)
values (20, '90 Comfy Town', 7528326, 'helper@more.org', '1968-01-25', 'F', 'N');
INSERT INTO employee_per (e_id, address, phone, p_email, birth_date, sex, m_status,
s_name, children) values (21, '4329 Eucalyptus Avenue', 4254863,
'moneymatters@coldcash.com', '1964-06-13', 'M', 'Y', 'Ruby Richer', 2);
DESCRIBE employee_per
+ + + + -+ -+ -+
| Field | Type | Null | Key | Default | Extra |
+ + + + -+ -+ -+
| e_id | int(10) unsigned | |PRI|0 | |
| address | varchar(60) | YES | | NULL | |
| phone | int(11) | YES | | NULL | |
| p_email | varchar(60) | YES | | NULL | |
| birth_date | date | YES | | NULL | |
| sex | enum('M','F') | YES | | NULL | |
| m_status | enum('Y','N') | YES | | NULL | |
| s_name | varchar(40) | YES | | NULL | |
| children | int(11) | YES | | NULL | |
+ + + + -+ -+ -+
9 rows in set (0.00 sec)
otice that column birth_date has date
N as column type.
e_id: Employee ids, same as that in table employee_data
address: Addresses of employees
phone: Phone numbers
p_email: Personal email addresses
birth_date: Birth dates
sex: The sex of the employee, Male or Female
m_status: Marital status: Yes or No.
s_name: Name of Spouse (NULL if employee is unmarried)
children: Number of children (NULL if employee is unmarried)
Characteristics of Date
MySQL dates are ALWAYS represented with the year followed by the month and then the
date. Often you'll find dates written as YYYY-MM-DD, where YYYY is 4 digit year, MM is
2 digit month and DD, 2 digit date.
Operations on Date
Date column type allows for several operations such as sorting, testing conditions
using comparison operators etc.
Using = or != operators.
Specifying ranges
Be careful when using month names as they are case sensitive. Thus, January will work but
JANUARY will not! Similarly, you can select employees born in a specific year or under
specific dates.
The above lists ids and no. of children of all employees who have children.
1. List the ids and spouse names of all employees who are married.
2. Change the above sql statement so that the display is sorted on spouse names.
3. How many employees do we have under each sex (male and female)?
4. How many of our employees are married and unmarried?
5. Find the total number of children of all employees.
Till now, we've used SELECT to retrieve data from only one table. However, we can extract
data from two or more tables using a single SELECT statement. The strength of RDBMS lies
in allowing us to relate data from one table with data from another. This correlation can
only be made if at least one column in the two tables contains related data. In our
example, the columns that contain related data are emp_id of employee_data and e_id of
employee_per. Let's conduct a table join and extract the names (from employee_data) and
spouse names (from employee_per) of married employee.
The FROM clause takes the names of the two tables from which we plan to extract
data. Also, we specify that data has to be retrieved for only those rows where the
emp_id and e_id are same. Without putting “emp_id = e_id” in the WHERE clause, all
possible row combinations of the two tables will be returned (also known as a cross
join).
The names of columns in the two tables are unique. However, this may not true always,
in which case we can explicitly specify column names along with table name using the
dot notation.
The INNER JOIN keyword selects records that have matching values in both tables.
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
Order table
Customer table
The following SQL statement selects all orders with customer information:
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Caution!! The following commands in Section 10 and 11 are used to delete
your data, tables and databases. It is not necessary to practice these
commands; otherwise your data will be lost.
One of the Multimedia specialists 'Hasan Rajabi' (employee id 10) leaves the company.
We'll delete his entry.
11 Dropping tables
To remove all entries from the table we can issue the DELETE statement without
any conditions.
However, this does not delete the table. The table still remains, which you can check
with SHOW TABLES;
SHOW TABLES
+ +
| Tables in employees |
+ -- +
| employee_data |
+ -- +
1 rows in set (0.00 sec)
Now, this table is completely deleted and will not be shown with SHOW TABLES.
In addition to int (Integer data type), MySQL also provides floating-point and double
precision numbers. Each integer type can also be UNSIGNED and/or AUTO_INCREMENT.
• TINYINT: very small numbers; suitable for ages. Actually, we should have used
this data type for employee ages and number of children. Can store numbers
between 0 to 255 if UNSIGNED clause is applied, else the range is between -128
to 127.
• SMALLINT: Suitable for numbers between 0 to 65535 (UNSIGNED) or -32768
to 32767.
• MEDIUMINT: 0 to 16777215 with UNSIGNED clause or -8388608 to 8388607.
• INT: UNSIGNED integers fall between 0 to 4294967295 or -2147683648
to 2147683647.
• BIGINT: Huge numbers. (-9223372036854775808 to 9223372036854775807)
• FLOAT: Floating point numbers (single precision)
• DOUBLE: Floating point numbers (double precision)
• DECIMAL:Floating point numbers represented as strings.
• DATE: YYYY-MM-DD (Four digit year followed by two digit month and date)
• TIME: hh:mm:ss (Hours:Minutes:Seconds)
• DATETIME: YYYY-MM-DD hh:mm:ss (Date and time separated by a space
character)
• TIMESTAMP: YYYYMMDDhhmmss
• YEAR: YYYY (4 digit year)
Text can be fixed length (char) or variable length strings. Also, text comparisons can be
case sensitive or insensitive depending on the type you choose.