CHAPTER 2: Using Empress SQL


2.1 Introduction

Although Empress is a large and complex program, you do not need to know anything about computer programming or how data is stored or retrieved by the system. However, you do have to learn the commands that Empress understands. They are not very many of them, nor are they complex. In this chapter, we will show you the basic Empress SQL commands. You will find that you can easily remember the basic commands and will soon be confident in using them.



2.2 Structure of a Database

The Empress database is an operating system directory. The directory contains several operating system files where the data is stored. Empress is the interface between you and these data files. For example, When you create a table, Empress will create an operating system file to store the table's data. When you issue a query to access the tables, Empress will retrieve the information from the corresponding operating system files.

A database contains a collection of tables. Each table contains zero or more records. Each record contains a value of a set of attributes. Each attribute contains a definition of the characteristics of the data. For example, in our sample database:

Database: repairs
Tables: personnel
loans
auto_parts
customers
Records:
(in the personnel table)

10   Kilroy     426-9681      $500.00
 5   Mosca      544-2243      $750.00
17   Wladislaw  723-6073       $50.00
 3   Jones      667-2951      $500.00
 8   Peterson   978-6060      $250.00
 4   Scarlatti  961-7363      $100.00
 9   Jordan     964-3335      $250.00 
Attributes:
(in the presonnel table)

number           integer
name             char (25,1)
phone            char(15,1)
credit_limit     dollar 


2.3 Empress Data Types

Empress provides a wide variety of data types. The following is a list of these data types:

Table 2-1: Empress Data Types

Type Declaration
Character

CHAR or CHARACTER (length, type)
TEXT (print length, primary storage, overflow storage, # of direct pointers to extents)

NLSCHAR or NLSCHARACTER (length, type)
NLSTEXT (print length, primary storage, overflow storage, # of direct pointers to extents)

Date DATE (format)
TIME (format)
MICROTIMESTAMP (format)
Decimal DECIMAL or DEC (maximum digits, number of decimal places)
DOLLAR (maximum dollar digits, format)
Float REAL
FLOAT (number of decimal places)
LONGFLOAT or DOUBLE PRECISION
Integer INTEGER or INT
LONGINTEGER
SHORTINTEGER or SMALLINT
User Interpreted
(Byte Stream)
MULTIMEDIA or BULK (# of bytes printed, primary storage, overflow storage, # of direct pointers to extents)

Missing data values are stored internally in a special form, and you may enter and recall these values by using the NULL keyword.

For detail description of Empress data types, please refer to the Empress SQL: Reference manual.

2.3.1 Character Data

With Empress, you may store CHARACTER data type in fixed-length fields using one of three types:

Table 2-2: Empress CHARACTER Data Type Types

Type Description
Type 1 Stores only printable characters and strips leading and trailing blanks from the data you enter.
Type 2 Stores only printable characters and preserves the leading and trailing blanks in the data you enter.
Type 3 Store any ASCII characters except NULL.

For example, the attribute name in the personnel table:

   name   CHAR (25,1)

will have character data with a fixed record length of 25 characters with no blanks in front or after the data.

2.3.2 Text Data

The TEXT data type will store character data varying from several characters to many pages, using only as much storage as needed for the data.

For example, the attribute comments in the customers table:

   comments  TEXT (25, 0, 80, 1)

will have character data of variable lengths with a display length of 25 characters per line, with no character stored with the main table. The rest of data will be stored in the overflow table with a fixed record length of 80 and 1 pointer to the overflow extend will be stored in the main table.

2.3.3 National Language Support (NLS) Data

Empress supports any national language 8-bit character set conforming to the ISO Latin1 sorting mechanism. 16-bit KANJI and HANGUL language support are also available.

For example, if your terminal allows you to enter French characters, the name in the personnel table can be declared as:

   name   nlschar (25,1)

2.3.4 Date Data

The DATE data type stores dates. There are nine date data formats:

Table 2-3: Empress DATE Data Type Formats

Type Format Year Range Example
0 yyyymmdd 0000-9999 19980627
1 dd aaaaaaaaa yyyy 0000-9999 27 June 1998
2 aaaaaaaaa dd, yyyy 0000-9999 June 27, 1998
3 mm/dd/yy nn00-nn99 * 06/27/98
4 dd/mm/yy nn00-nn99 * 27/06/98
5 dd aaa yy nn00-nn99 * 27 Jun 98
6 aaa dd, yy nn00-nn99 * Jun 27, 98
7 mm/dd/yyyy 0000-9999 06/27/1998
8 dd/mm/yyyy 0000-9999 27/06/1998
*
nn is defined by the Empress system variable MSDATELIMIT, the value of which is assigned by the user to indicate the preferred century for entering dates.

For any DATE type, entering today or now, in any combination of upper- and lowercase characters, stores the current date in the appropriate format.

For example, the attribute date in the loans table:

   date    DATE (1)

specifies a date data of June 1, 1998 to have the display format of 1 June 1998.

2.3.5 Time Data

The TIME data type stores dates plus the time-of-day information. There are nine time data formats. The different styles of output can best be shown by an example. For 2:56:15 PM, August 28, 1998, the nine TIME data types produce:

Table 2-4: Empress TIME Data Type Formats

Type Format Year Range Example
0 yyyymmddhhmmss 1970-2035 19980828145615
1 dd aaaaaaaaa yyyy hh:mm:ss 1970-2035 28 August 1998 14:56:15
2 aaaaaaaaa dd, yyyy hh:mm:ss 1970-2035 August 28, 1998 14:56:15
3 mm/dd/yy hh:mm:ss 1970-2035 08/28/98 14:56:15
4 dd/mm/yy hh:mm:ss 1970-2035 28/08/98 14:56:15
5 dd aaa yy hh:mm:ss 1970-2035 28 Aug 98 14:56:15
6 aaa dd, yy hh:mm:ss 1970-2035 Aug 28, 98 14:56:15
7 mm/dd/yyyy hh:mm:ss 1970-2035 08/28/1998 14:56:15
8 dd/mm/yyyy hh:mm:ss 1970-2035 28/08/1998 14:56:15

For any TIME data type, entering today stores the current date with time 00:00:00; entering now stores the current date and time.

For example the following attribute:

   time   TIME (1)

specifies a time data of June 1, 1998 2:30 PM with a display format of:

   1 June 1998 14:30:00

2.3.6 Microsecond Data

The MICROTIMESTAMP data type stores time data plus microseconds information.

The nine different MICROTIMESTAMP formats are shown below. The output is for August 28, 1998 2:56:15 p.m. and 234599 microseconds.

Table 2-5: Empress MICROTIMESTAMP Data Type Formats

Type Format Year Range Example
0 yyyymmddhhmmssffffff 0000-9999 19980828145615234599
1 dd aaaaaaaaa yyyy hh:mm:ss.ffffff 0000-9999 28 August 1998 14:56:15.234599
2 aaaaaaaaa dd, yyyy hh:mm:ss.ffffff 0000-9999 August 28, 1998 14:56:15.234599
3 mm/dd/yy hh:mm:ss.ffffff nn00-nn99 * 08/28/98 14:56:15.234599
4 dd/mm/yy hh:mm:ss.ffffff nn00-nn99 * 28/08/98 14:56:15
5 dd aaa yy hh:mm:ss.ffffff nn00-nn99 * 28 Aug 98 14:56:15.234599
6 aaa dd, yy hh:mm:ss.ffffff nn00-nn99 * Aug 28, 98 14:56:15.234599
7 mm/dd/yyyy hh:mm:ss.ffffff 0000-9999 08/28/1998 14:56:15.234599
8 dd/mm/yyyy hh:mm:ss.ffffff 0000-9999 28/08/1998 14:56:15.234599
*
nn is defined by the Empress system variable MSDATELIMIT, the value of which is assigned by the user to indicate the preferred century for entering dates.

2.3.7 Decimal Data

Empress can store DECIMAL data type up to 38 digits. The number of decimal places is specified by the user.

For example, the following specifies that the attribute circumference will store up to a maximum of 7 digits with 3 decimal places.

   circumference   DECIMAL (7, 3)

2.3.8 Dollar Data

The DOLLAR data type is designed for storing monetary values. You may store up to 13 dollar digits using one of the three formats:

Table 2-6: Empress DOLLAR Data Type Formats

Type Example Description
Type 1 $1,234.00 Prints the value with the dollar sign flush against the leading digit.
Type 2 $****1,234.00 Prints the value with the dollar sign left-adjusted for the maximum number of digits and fills characters up to the left most print digit.
Type 3 1234.00 Prints the value with no dollar signs or commas.

For example, the attribute credit_limit in the personnel table:

   credit_limit     DOLLAR (6,1)

specifies monetary data displayed with a maximum of 6 dollar digits and a display Type 1.

2.3.9 Floating Point Data

Floating point numbers are stored as:

Data are represented in scientific notation on retrieval.

For example, 10342 can be represented as 1.0342e+04.

2.3.10 Integer Data

Integer numeric values are stored as:

For example, the attribute number in the personnel table:

   number   INTEGER

specifies integer value with a range from -32767 to +32767.

2.3.11 Multimedia Data

The MULTIMEDIA or BULK data type stores unstructured data such as image, voice, sound, etc. For example, to declare that an attribute called picture which contains a person's picture:

   picture BULK (80,0,1024,1)



2.4 Create and Access a Database

In this section, we will show you how to create and access a database and its tables. The general procedure for creating and accessing an Empress database is as follows:

  1. Log in as required by the operating system.

  2. Change into your working directory or the directory where you wish to create the database. If this directory is called work, then type:
       cd work
    
    
  3. Create the database if it does not exist. (If it does, go on to Step 4.) Type in empmkdb followed by a space then the name of your database. The name should consist of a sequence of characters with no embedded blanks. To create the database repairs, type:
       empmkdb repairs
    
    
  4. The command empmkdb stands for Empress make database. It creates a system directory with the given name and creates certain files (data dictionary) in it so that Empress can recognize it as a database.

  5. Start up Empress by typing in the command empsql, then a space, followed by the database name. For example:
       empsql repairs
    
    
  6. If this does not work, then the Empress startup command may have been renamed at your installation. Consult your system administrator.

  7. Empress will prompt you with an asterisk (*) when it is ready to accept commands. You may now access the database using all of the Empress SQL commands available in the version of Empress you are using.


2.5 Create Table

Before we can store or retrieve data, we must first create a table. For example, our sample database has a loans table which contains information about loans made to employees: the employee's name, the date on which the loan was made and the amount involved. It has the attributes name, date and amount.

To create the loans table, issue the following SQL command:

   CREATE TABLE loans (name CHAR (25,1),
                       date DATE (1),
                       amount DOLLAR (6,1));

The CREATE TABLE command tells Empress the name of your table followed by the specifications of the attributes. The loans table has the following attributes: name contains character data with a maximum length of 25, date contains a date and amount contains a dollar value.

The Interactive Interface, a feature of Empress SQL, is another easy method to create a table. To create the personnel table using Interactive Interface commands, type in:

CREATE TABLE personnel;

Empress prompts you for the attribute names and their data types.

   Name for Attribute #1: number
   Data Type: integer
   Allow Null Values: y
   
   Ready .e
   
   Name for Attribute #2: name
   Data Type: char
   Maximum Number of Characters: 25
   Type: 1
   Allow Null Values: y
   
   Ready .e
   
   Name for Attribute #3: phone
   Data Type: char
   Maximum Number of Characters: 15
   Type: 1
   Allow Null Values: y
   
   Ready .e
   
   Name for Attribute #4: credit_limit
   Data Type: dollar
   Maximum Number of Dollar Digits: 6
   Type: 1
   Allow Null Values: y
   
   Ready .e
   
   Name for Attribute #5: .q

You may follow the above example to create auto_parts and customers tables as defined in the sample database.



2.6 Display Database and Table

To obtain information on the database, type in either one of the following commands:

   DISPLAY DB;
   
   DISPLAY DATABASE;

Empress displays the following information:

   **** Database: repairs ****
   
   auto_parts
   customers
   loans
   personnel

To view the structure of the personnel table, type in:

   DISPLAY TABLE personnel;

Empress displays:

   *** Table: personnel ***
   
   Attributes:
   
   number          integer
   name            char(25, 1)
   phone           char(15, 1)
   credit_limit    dollar(6, 1)



2.7 Insert Data into a Table

Now that we have created the tables to store data, we can start inserting records. Within Empress SQL, data can be inserted into tables using a single command, using the Interactive Interface, or using data from a file.

You may follow any of the examples to complete the data insertion into personnel, loans, auto_parts and customers tables as specified in the sample database.

2.7.1 Single Command Insert

To insert the first record of the personnel table using a single command, type in:

   INSERT INTO personnel
      VALUES 10, "Kilroy", "426-9681", 500;

Empress displays:

   Number of Records Entered = 1

The INSERT INTO command specifies the name of the table, personnel, into which this data is to be stored in, followed by the list of data values (10, "Kilroy", "426-9681", 500).

2.7.2 Interactive Insert

Using the Interactive Interface, issue the following SQL command and fill in the data for each prompt:

   INSERT INTO personnel;
   
   number: 5
   name: Mosca
   phone: 544-2243
   credit_limit: 750
   
   Ready .e
   
   number: .q
   
   Number of Records Entered = 1

2.7.3 Insert Data from a File

To insert data from a file, first create a file named datafile using the system editor which contains the following data:

   17
   Wladislaw
   723-6073
   50
   3
   Jones
   667-2951
   500

You may then issue the following command to enter this data into the personnel table:

INSERT INTO personnel FROM datafile;

Empress displays:

Number of Records Entered = 2

You now have entered four records into the personnel table using three different methods.

2.7.4 Inserting Text Data

To enter the first record into the customers table using the Interactive Interface command, type in:

   INSERT INTO customers;

Empress prompts you for data:

   name: Mr. R. Lucas
   address: 1423 Beach Drive,\
   Bayville, CA 92308
   comments: Can always be sold\
   something new and flashy - likes\
   chrome and colored stuff,\
   also little gadgets.

   Ready .e
   
   name: .q

The backslash (\) is used to indicate a continuation of the text data input and will not be entered as part of the data. This is defined by the Empress system variable MSLINECONT. Refer to the Empress: Database Administrator's Guide for more information on the system variable MSLINECONT.



2.8 Selecting Data from Tables

The most common SQL operation is the retrieval of data. Retrieving data from a database is called a query and the SELECT command is used to issue a query. To retrieve records from the personnel table, type in:

   SELECT * FROM personnel;

The asterisk (*) will list all records from the personnel table. Empress displays:

   number    name         phone        credit_limit

       10    Kilroy       426-9681          $500.00
        5    Mosca        544-2243          $750.00
       17    Wladislaw    723-6073           $50.00
        3    Jones        667-2951          $500.00
        8    Peterson     978-6060          $250.00
        4    Scarlatti    961-7363          $100.00
        9    Jordan       964-3335          $250.00

2.8.1 Selecting Partial Data

2.8.1.1 Selecting specific attributes

In the previous example, we retrieved all the data from the personnel table. If you want to select specific information such as a list of personnel names and phone numbers, type in:

   SELECT name, phone FROM personnel;

The SELECT clause will only list records for the attributes you have specified. Empress displays:

   name        phone

   Kilroy      426-9681
   Mosca       544-2243
   Wladislaw   723-6073
   Jones       667-2951
   Peterson    978-6060
   Scarlatti   961-7363
   Jordan      964-3335

2.8.1.2 Selecting specific records

The last example demonstrated the retrieval of specific attributes of information. If you want to be more selective and only retrieve particular records, then you need to add a WHERE clause in your SELECT statement. This will only retrieve records which satisfy the WHERE clause conditions you have specified.

For example, to list the names from the personnel table with a credit limit of more than $500, type in:

   SELECT number, name, phone FROM personnel
      WHERE credit_limit > 500;

Empress displays:

   number   name        phone

        5   Mosca       544-2243

A WHERE clause tells Empress to search and retrieve only the information which meets the search condition.

2.8.1.3 Search conditions

The following examples illustrates the use of search conditions:

AND To specify more than one search condition and list records which satisfy all the search conditions. For example:
   SELECT number, name, phone FROM personnel
      WHERE credit_limit < 500
      AND credit_limit > 100; 

OR To list records which meet any of your specified search conditions. For example:
   SELECT name FROM personnel
      WHERE credit_limit > 500
      OR credit_limit < 100; 

!= To list records that do not satisfy any of your search conditions. For example:
   SELECT name FROM personnel
      WHERE credit_limit != 500; 

BETWEEN To list records within a specified range. For example:
   SELECT name FROM personnel
      WHERE credit_limit BETWEEN 100 AND 500; 

IN To list records if an attribute value is included in the list of values. For example:
   SELECT name FROM personnel
      WHERE credit_limit IN (100, 200, 500); 

Pattern Matching You can also select records which match a specific character pattern. For example:
   SELECT name FROM personnel
      WHERE name MATCH "C*"; 

Refer to the Empress SQL: Reference manual for a more detailed discussion of Empress WHERE clause operators.

2.8.2 Selecting Data by Groups

To further illustrate the power of Empress SQL, records requested by your SELECT command may be grouped by a common attribute value. Using the GROUP BY clause, the output can be grouped by the specified attribute. For example:

   SELECT * FROM loans GROUP BY name;

Empress displays:

   name                                   date        amount
   
   Jones                      7 February  1992        $33.95
                              3 April     1992        $25.00
                             12 August    1992       $300.00
   Kilroy                    16 February  1992       $250.00
   Mosca                      2 February  1992       $150.00
                              4 May       1992       $200.00
   Peterson                   6 June      1992        $50.00
   Scarlatti                 14 October   1992       $125.00
                              9 September 1992       $150.00
   Wladislaw                 25 June      1992        $75.00
                             27 February  1992        $55.00
                             12 May       1992        $25.00

The GROUP BY clause is often used with the computing functions such as COUNT, MAX, MIN, SUM, AVG, etc. For example:

SELECT name, SUM(amount) FROM loans GROUP BY name;

Empress displays:

   name                          SUM(amount)

   Jones                              358.95
   Kilroy                             250.00
   Mosca                              350.00
   Peterson                            50.00
   Scarlatti                          275.00
   Wladislaw                          155.00

Just as a WHERE clause is used to specify a search condition for individual rows, a HAVING clause is used to specify search conditions for a group of rows. For example:

   SELECT name, SUM(amount) FROM loans GROUP BY name
      HAVING SUM(amount) > 300;

Empress displays:

   name                          SUM(amount)

   Jones                              358.95
   Mosca                              350.00

2.8.3 Selecting Unique Values

To avoid any duplicate values, specify the DISTINCT keyword in your SELECT statement. For example:

   SELECT DISTINCT (name) FROM loans:

Empress displays:

   name

   Mosca
   Jones
   Kilroy
   Wladislaw
   Peterson
   Scarlatti

2.8.4 Querying Multiple Tables

In all our examples so far, we have queried only one table. Sometimes, the information you seek might be stored in more than one table. In this case, we must select data from two or more tables and combine them.

To get a list of all records from the loans table and also include the phone number of the person from the personnel table, type in:

   SELECT name, phone, date, amount
      FROM loans, personnel
      WHERE loans.name = personnel.name;

Empress displays:

   name             phone                   date      amount
   
   Mosca           544-2243     2 February  1992     $150.00
   Jones           667-2951     7 February  1992      $33.95
   Kilroy          426-9681    16 February  1992     $250.00
   Wladislaw       723-6073    27 February  1992      $55.00
   Jones           667-2951     3 April     1992      $25.00
   Mosca           544-2243     4 May       1992     $200.00
   Wladislaw       723-6073    12 May       1992      $25.00
   Peterson        978-6060     6 June      1992      $50.00
   Wladislaw       723-6073    25 June      1992      $75.00
   Jones           667-2951    12 August    1992     $300.00
   Scarlatti       961-7363     9 September 1992     $150.00
   Scarlatti       961-7363    14 October   1992     $125.00



2.9 Sort Data Output

So far, the display output of our query results has been determined by Empress. We can control the output display by adding an ORDER BY clause to our SELECT statement.

For example, to get a list of numbers and names from the personnel table for employees with credit limits less than or equal to $100 and sort the output on the personnel number in ascending order, type in:

   SELECT number, name, credit_limit
      FROM personnel WHERE credit_limit <= 100
      ORDER BY number ASCENDING;

Empress displays:

   number   name         credit_limit

       4    Scarlatti         $100.00
      17    Wladislaw          $50.00

The DESCENDING keyword is used in the same fashion and lists the output in descending order. For example:

   SELECT number, name, credit_limit
      FROM personnel WHERE credit_limit <= 100
      ORDER BY number DESCENDING;



2.10 Updating Records

From time to time, it will be necessary to update the information in our database. For example, we might need to change addresses and phone numbers, or add new employees.

2.10.1 Single Command Update

To update Kilroy's phone number from 426-9681 to 513-8888 you can use the following command:

   UPDATE personnel SET phone TO "513-8888"
      WHERE name = "Kilroy";

The UPDATE command specifies the table to be modified (personnel) and the SET clause tells Empress to change the attribute value to a specified value (513-8888). The WHERE clause specifies the records to be affected by this command.

2.10.2 Interactive Update

To update a record using the Interactive Interface, issue the following command:

   UPDATE personnel WHERE name = "Kilroy";

Empress prompts you with:

   number: 10
   name: Kilroy
   phone: 426-9681 513-8888
   credit_limit: $500.00

   Ready .e

   Number of Records Updated = 1



2.11 Delete Records

To delete Kilroy's record from the personnel table, use:

   DELETE personnel WHERE name = "Kilroy";

Note that the DELETE command specifies the table and the WHERE clause tells Empress which record is to be removed. Without the WHERE clause, all records in the table will be removed.



2.12 Change Table Structure

To change the structure of a table after it has been created, the ALTER TABLE command is used. This command allows you to add or delete attributes or change the definition of the attributes.

To change the length of the name attribute in the personnel table from 25 to 30 characters, type in:

   ALTER personnel
      CHANGE name CHAR (30,1);

To add an address attribute as a character data type with a length of 50 into the personnel table, type in:

   ALTER personnel
      ADD address CHAR (50,1);

To delete the credit_limit attribute from the personnel table, type in:

   ALTER personnel
      DELETE credit_limit;

You also can combine all the above changes in one single command:

   ALTER personnel
      CHANGE name CHAR (30,1)
      ADD address CHAR (50,1)
      DELETE credit_limit;



2.13 Change Table or Attribute Name

To change the table name from personnel to employees, type in:

   RENAME personnel TO employees;

To change the attribute name in the auto_parts table from part no. to numbers, type in:

   RENAME auto_parts."part no." TO numbers;

The attribute part no. is a complex name. A complex name may begin with digits or other non-letter characters and may include blanks, tabs, periods, etc. When used in Empress commands, complex names must be enclosed in quotes.



2.14 Remove a Table

To remove the personnel table from the database, type in:

   DROP personnel;

Now the personnel table no longer exist in the database.

Use this command with extreme caution. Once the table is dropped, it is permanently removed from the database. The only way to retrieve the table is to recreate it (or if your are in a transaction, you may roll back the transaction to recover the table).



2.15 Getting Help

Empress has a HELP command for on-line help with the Empress SQL. The syntax for the HELP command is:

   HELP [topic];

This will produce a list of topics on which help is available. To obtain help for a particular command, enter:

   HELP command;

This will produce a summary of the command. For example, to get help with the DATABASE command, use:

   HELP DATABASE;

which produces:

   ********** Database **********

   This command prints the name of the current database or changes 
   to a new database.

   Syntax:
DATABASE [database] [ |INTO
|ONTO
| file];
|
   The keyword DATABASE alone prints the name of the current database.
   It can be shortened to DB. Specifying another database name makes 
   database the current database.

   The output of a DATABASE command can be diverted from the terminal into a
   new file or appended to an existing file by specifying INTO or ONTO, 
   respectively, and a filename.

   For further information, enter:

   HELP display;

Help is also available from the Interactive Interface. To obtain a summary of the commands available for the interactive CREATE, INSERT or UPDATE enter ".?".



2.16 Exiting the Database

To exit from the database, type in:

   STOP

or

   EXIT

This will bring you back to the operating system.