SQL Basics

Last update: 18/01/2003

This page contains the essential commands to manage databases using SQL (Structured Query Language). I use it as a refference for myself. I don't pretend to be an SQL-expert. Others may use this reference freely. If you have any suggestions or comments please e-mail me!

Some commands depend on the type of server used. I experiment with four servers, Microsoft SQL Server, Borland Interbase Server, MySQL Server en Sybase SQL Anywhere. If a command is specific to one server I indicate this with an icon.

  1. mssql.gif indicates that the command works with MS SQL Server.
  2. ibsql.gif indicates the command works with Borland InterBase Server.
  3. mysql.gifindicates that the command works with MySQL Server.
  4. indicates that the command works with Sybase SQL Anywhere.

The commands are written in bold, italicised text (databasenames, fieldnames, values, ...) is up to you to fill in. Note also that I speak of fields and records instaid off rows and coloms. In MS SQL Server manuals I see they use rows and coloms, but I prefer to use fields and records, probably because that was the way in dBase and MS Access, which I used for years.

1. List all the databases on the server:

sp_databases mssql.gif - 284 Bytes
show databases mysql.gif - 322 Bytes

2. Select a database to use:

use databasename mssql.gif - 284 Bytes mysql.gif - 322 Bytes

3. List tables in the database:

show tables mysql.gif - 322 Bytes
sp_help mssql.gif - 284 Bytes

There is another, more complicated, command to retrieve the names of the tables in the database, but where you get a list of ALL tables, including system tables using sp_help, you can specify to view only user defined tables

select * from SYSOBJECTS mssql.gif - 284 Bytes
where TYPE = 'U'
order by NAME

ibsql.gif - 299 Bytes If you want to see the tables of an InterBase database use the menu "Metadata", "Show..." and select "Tables" in the "View Information on"-dropdown. Click "OK" and you see the tables of the active database. Using ISQL you can use show tables

To see the tables in Sybase press functionkey F7.

4. List fields in a table:

describe tabelname mysql.gif - 322 Bytes
sp_help tablename mssql.gif - 284 Bytes

ibsql.gif - 299 Bytes To see the fields of an InterBase database use the menu "Metadata", "Show..." and select "Tables" in the "View Information on"-dropdown. Type the name of the database in the "Object name"-textfield. Click "OK" and you see the fields of the specified table. Using ISQL you can use show table tablename

To see the fields in a Sybase table press functionkey F7, select the table and click "Columns".

5. Create a database:

create database databasename mssql.gif - 284 Bytes
log on

6. Create a table in the database en store values in it:

create table tablename mssql.gif - 284 Bytes ibsql.gif - 299 Bytes mysql.gif - 322 Bytes
(fieldname1 datatype1, fieldname2 datatype2, ...)
insert into tablename
values(fieldvalue1, fieldvalue2, ...)

7. Constraints:

  • Primary key: constraint constraintname primary key (non)clustered (fieldname1, fieldname2, ...)
  • Foreign key: constraint constraintname foreign key (fieldname) references tablename(fieldname)
  • No dulicates: constraint constraintname unique nonclustered (fieldname)
  • Check: Add values to the fieldnamelist in the 'create table'-command:
    (fieldname1 datatype1 check (fieldname1 in ('value1', 'value2', ...)), fieldname2 datatype2, ...)
  • Default value: Add default value to the fieldlist in the 'create table'-command:
    (fieldname1 datatype1, fieldname2 datatype2 default 'value', fieldname3 datatype3, ...)

    8. Select all records from table:

    select * from tablename mssql.gif - 284 Bytes ibsql.gif - 299 Bytes mysql.gif - 322 Bytes
    order by fieldname

    Note that this command could take some time and put a lot of stress on the processor and memory of the server if you try to view a large database this way. On my server (Pentium MMX 233 Mhz - 64 Mb memory) it took 1:25 minutes to retrieve 25000 records from a database and it gave warnigs of shortage in virtual memory, so please don't try this on a production database (;-). Usualy it is better to select fields and conditions to limit the amount of records and the stress on the server.

    9. Select set of records from table:

    select fieldname1, fieldname2, ... from tablename mssql.gif - 284 Bytes ibsql.gif - 299 Bytes mysql.gif - 322 Bytes
    where fieldname = "condition"
    order by fieldname

    Comparison Operators that can be used in the condition are:

    =, !=, <>, <, >, <=, >= and LIKE.
    With LIKE you can specify e.g. all the names beginning with S as 'name LIKE "s%"'.

    You can also use boolean operators to specify more then one condition (OR, AND, NOT, BETWEEN, IN). With 'BETWEEN' you give a minimum and maximum value to the condition, with 'IN' you can give a list of values.


    select Firstname, Lastname, Department from Employees
    where Lastname LIKE "Van%" AND
    Badge BETWEEN 121990 and 141990 AND
    Department IN ("Sales", "Logistics")
    order by Lastname

    This statement retrieves all the employees where Lastname begins with "Van", whose badgenumbers are between 121990 and 141990, who work at the Sales- or Logisticsdepartment, and displays their Lastname, Firstname and Dapartment ordered by Lastname.

    Note theat the 'ORDER BY' statemant can have more then one fieldname and can also take 'asc' or 'desc' as last argument (for ascending or descnding order).

    10. Retrieve unique values

    select distinct fieldname from table mssql.gif - 284 Bytes ibsql.gif - 299 Bytes mysql.gif - 322 Bytes

    11. Add records to a table:

    insert into tablename (fieldname1, fieldname2, ...) mssql.gif - 284 Bytes ibsql.gif - 299 Bytes mysql.gif - 322 Bytes
    values ('value1', 'value2', ...)

    If you leave out the fieldnames then the values must match the number of fields in the table. If you only want to add a value to some fields you have to specify them and the values must mach the number of specified fields. The unspecified fields are filled with NULL or the default constraint defined in the table. You could concider to specify defaults like "unknown" or "N/A" to avoid a NULL-value in the field.

    12. Updating records in a table;

    update tablename mssql.gif - 284 Bytes ibsql.gif - 299 Bytes mysql.gif - 322 Bytes
    set fieldname1='value1', fieldname2='value2', ...
    where fieldname3 = condition

    If you ommit the 'where'-statement the update will be performed on ALL the records in the table!

    13. Deleting a record from a table

    delete from tablename mssql.gif - 284 Bytes ibsql.gif - 299 Bytes mysql.gif - 322 Bytes
    where fieldname=condition

    Be arefull in using this command!! Ommitting the 'where'-statement will erae ALL the records in the table and leave you with an empty table!!!

    14. Adding a field to the records in a table:

    alter table tablename mssql.gif - 284 Bytes ibsql.gif - 299 Bytes mysql.gif - 322 Bytes
    add fieldname datatype

    The new field is filled with NULL and can be filled using the update-command after adding the field.

    15. Changing the width of a field

    alter table tablename
    alter column fieldname newdatatype

    alter table tablename
    modify fieldname newdatatype

    16. Removing field from the records

    alter table tablename
    drop column fieldname

    alter table tablename
    drop fieldname

    17. Combine two querries:

    select fieldname from tablename
    select fieldname2 from tablename2
    order by fieldname

    This union will remove all duplicates. To retain duplicates you have to use 'union all'

    18. Basic SQL-functions:

  • select avg(fieldname) from tablename
    Returns the arithmeticaverage of the fields.
  • select count(*) from tablename
    where fieldname=condition
    Returns the number of records that match the condition.
  • select max(fieldname) from tablename
    Returns the largest value of fieldname.
  • select min(fieldname) from tablename
    Returns the smallest value of fieldname.
  • select sum(fieldname) from tablename
    Returns the summation value of fieldname.
  • select convert(newdatatype, fieldname) from tablename
    converts one datatype into another.

    19. String functions

  • ASCII returns ASCII code of leftmost character of a characterexpression.
  • CHAR converts an ASCII code to a character.
  • SOUNDEX returns four-digit code used to compare two strings with DIFFERENCE.
  • DIFFERENCE returns difference between values of two character expressions returned by SOUNDEX.
  • LEFT returns part of character string, starting at number of character from the left specified in the argument.
  • LOWER converts uppercase strings to lowercase.
  • UPPER converts lowercase strings to uppercase.
  • LTRIM removes leading spaces from a string.
  • RTRIM removes trailing spaces from a string.
  • CHARINDEX returns starting position of specified character expression in a string.
  • PATINDEX rerurns starting position of first occurence of a substring in a string.
  • REPLICATE returns multiple sets of characters specified in the first argument. The second argument specifies number of sets. (eg. select replicate ('a', 5) returns 'aaaa')
  • REVERSE returns reverse order of a string of characters.
  • RIGHT returns part of character string, starting at number of character from the right specified in the argument.
  • SPACE returns a string of spaces, length specified in argument.
  • STR converts numeric data to character data.
  • STUFF inserts a string into another string.
  • SUBSTRING returns a part of a string (arguments are startpoint and length).
  • + (concatenetion) concatenates two or more strings.

    20. Arithmetic functions:


    21. TEXT and IMAGE functions:

  • SET TEXTSIZE specifies number of bytes displayed for data stored as TEXT or as IMAGE.
  • TEXTPTR returns pointer to first database page of stoed text.
  • READTEXT extracts substring from data stored as TEXT or as IMAGE.
  • TEXTVALID check validity of textpointer.

    22. Date functions:

  • DATENAME returns specified part of date as characterstring.
  • DATEPART returns specified part of date as integer value.
  • GETDATE returns current date and time.
  • DATEADD returns value of the date with an additional date interval added.
  • DATEDIFF returns difference between parts of two specified dates.


    Note that a view under SQL is the same as a query you create with Access.

    23.1 Create views:

    create view viewname as
    select fieldname1, fieldname2, ... from tablename1, tablename2, ...
    where fieldname = condition

    You can't edit a view using SQL. You can use the Enterprise Manager of MS SQL to edit a view or you can delete a view and recreate it with the same name.

    You can use alternative names for the columns in a view:

    create view viewname (col1, col2, col3, ...)as
    select fieldname1, fieldname2, ... from tablename1, tablename2, ...
    where fieldname = condition

    23.2 Display definition of a view:

    sp_helptext viewname

    To prevent the possibility to view the definition of a view you can use encryption:

    create view viewname with encryption as
    select fieldname1, fieldname2, ... from tablename1, tablename2, ...
    where fieldname = condition

    23.3 Display associations of a view:

    sp_depends viewname

    23.4 Delete a view from the database:

    drop view viewname1, viewname2, ...

    23.5 Insert records through a view:

    insert into viewname
    values ('value1', 'value2', ...)

    You can insert rows through the view that DON'T match the WHERE-statement inthe view definition, but then you can't retrieve the new row with the view. If you want to prevent this you can use the check option:

    create view viewname as
    select fieldname1, fieldname2, ... from tablename1, tablename2, ...
    where fieldname = condition with check option

    23.6 Delete records through a view:

    delete from viewname where fieldname = condition

    You can't delete records through a view that don't match the WHERE-statement in the view definition.

    23.7 Updating records through a view:

    update viewname set fieldname='value' where fieldname=condition

    You can update a record through a view so that it doesn't match the WHERE-statement anymore. You can't update a view if the updated columns belong to different tables.

    24. Indexes:

    24.1 Simple index:

    create index index_name
    on table_name (fieldname)

    24.2 Unique index:

    create unique index index_name
    on table_name (fieldname)

    This kind of index enforces integrity of the table by disallowing duplicete values in the indexed field.

    24.3 Clustered index:

    create clustered index index_name
    on table_name (fieldname)

    A clustered index forces SQL Server to phisicaly store the table data in the exact order of of the index. This improves the performance of the table. You can only have obne clustered index on a table, the selected fieldname should be choosen carefully and every table should have an clustered index.

    24.4 Display index info:

    sp_helpindex tablename

    24.5 Deleting an index:

    drop index table_name.index_name

    24.6 Primary and foreign keys:

    You can specify a primary key on a table while creating it (see constraint), or you can add a primary key to an existing table by altering it. alter table table_name add constraint constraint_name primary key

    24.7 Display primary and foreign keys info:

    sp_helpconstraint table_name

    24.6 Deleting primary and foreign keys:

    alter table table_name drop constraint constraint_name

    25. Transaction:

    A transaction is a series of SQL-statements performed at once, with the ability to undo the changes if something goes wrong during the processing of the statements. A transaction is enclosed in "begin tran" and "commit tran".


    begin tran
    	update tablename
    	set fieldname = newvalue
    	where fieldname = condition
    	update tablename2
    	set fieldname =  newvalue
    	where fieldname = condition
    	if @@error != 0
    		rollback tran
    		print 'Error occured, no rows updated'
    commit tran

    You can nest one transaction ino another by using named transactions. Be shure however to include a 'commit tran' for every 'begin tran' to avoid leaving a transaction open.


    begin tran tran1_name
    	update tablename
    	set fieldname = newvalue
    	where fieldname = condition
    		begin tran tran2_name
    			update tablename
    			set fieldnname = newvalue
    			where fieldname = condition
    			if @@error != 0
    				rollback tran tran2_name
    				print 'Failed to update tablename'
    		commit tran tran2_name
    commit tran tran1_name

    26. Rules:

    A rule controls the values that can be entered into a field of a table. To apply a rule to a field you have to take two steps: create the rule and bind the rule to the field.

    26.1 Create a rule:

    create rule rule_name
    as @fieldname in ('value1','value2','value3')

    26.2 Bind a rule:

    sp_bindrule 'rule_name', 'table_name.field_name'

    26.3 Unbind a rule:

    sp_unbindrule table_name.field_name

    26.4 Drop a rule:

    drop rule rule_name
    !!You first have to unbind the rule before you can drop it!!

    To display rule bindings you can use 'sp_help tablename', to display the rules you can use 'sp_helptext rule_name' and to rename a rule you can use 'sp_rename rule_name, new_name'.

    27. Defaults:

    A default is create to provide a value for a field if the user doesn't fill in one. Just like creating rules you have to make to steps to apply ad efault: create it and bind it to a field in a table.

    27.1 Create a default:

    create default default_name as value

    27.2 Bind a default:

    sp_bindefault default_name, 'tablename.fieldname'

    27.3 Unbind a default:

    sp_unbindefault 'tablename.fieldname'

    27.4 Drop a default:

    drop default default_name
    !!You first have to unbind the default before you can drop it!!

    To display default bindings you can use 'sp_help tablename', to display the default you can use 'sp_helptext default_name' and to rename a default you can use 'sp_rename default_name, new_name'.

    28. Stored procedures:

    Stored procedures are routines or series of SQL-commands that run on the server side. The benefits are performance, because the server typically is the most powerfull computer on the network, and security, because you can control add/change/delete/list operations.

    28.1 Create a stored procedure:

    create procedure procedure_name
    as procedure_commands

    To execute the procedure you use 'exec procedure_name'. You can use parameters in procedures to pass values to the procedure:

    create procedure procedure_name (@p1 type, @p2 type, ...)
    as insert into table_name
    values (@p1, @p2, ...)

    Now you can execute this procedure by passing values to it:

    exec procedure_name (value1, value2, ...)

    You can also use variables in a procedure. You first have to declare them (declare @var_name var_type) and then you can assign a value to it (select @var_name = expression).

    28.2 Display a stored procedure:

    sp_helptext procedure_name

    28.3 Delete a stored procedure:

    drop procedure procedure_name

    If you want to alter a procedure, you first have to drop it and then recreate it under the same name.

    28.4 Procedure Auto Execution:

    You can automaticaly run a procedure every time the server is started by using:

    sp_makestartup procedure_name

    sp_unmakestartup procedure_name removes the procedure from the startupprocedures

    sp_helpstartup displays the procedures currently running at startup

    28.5 Flow-control statements:

    The following statements can be used in stored procedures to control the flow of the procedure:

    29. Datatypes:

    This is an overview of the different datatypes used by the different servers.
    MySQL Borland InterBase Server MS SQL Server Sybase SQL
    tinyint - tinyint tinyint
    smallint smallint smallint smallint
    mediumint - - -
    int int int int
    bigint - - -
    - numeric numeric numeric
    decimal decimal decimal decimal
    - - real real
    float float float float
    double double precision - double
    date date - date
    - - smalldatetime -
    datetime - datetime -
    timestamp - timestamp timestamp
    time - - time
    year - - -
    char(n) char(n) char(n) char(n)
    varchar(n) varchar(n) varchar(n) varchar(n)
    - - - long varchar
    tinytext - - -
    text - text -
    - - ntext -
    mediumtext - - -
    longtext - - -
    - nchar(n) nchar(n) -
    - nchar varying(n) nvarchar(n) -
    - - binary(n) binary(n)
    - - varbinary(n) -
    - - - long binary
    tinyblob - - -
    - - image -
    blob blob - -
    mediumblob - - -
    longblob - - -
    enum - - -
    set - - -
    - - bit -
    - - uniqueidentifier -
    - - money -
    - - smallmoney -

    Please let me know your suggestions, comments, or report errors to
    Coppens Peter

    Copyright © 1999 - 2015 Coppens Peter