====== SQL language (General) ====== ===== SQL General Data Types ===== Each column in a database table is required to have a name and a data type. SQL developers have to decide what types of data will be stored inside each and every table column when creating a SQL table. The data type is a label and a guideline for SQL to understand what type of data is expected inside of each column, and it also identifies how SQL will interact with the stored data. ===== The following table lists the general data types in SQL: ===== Data type Description CHARACTER(n) Character string. Fixed-length n VARCHAR(n) or Character string. Variable length. Maximum length n CHARACTER VARYING(n) BINARY(n) Binary string. Fixed-length n BOOLEAN Stores TRUE or FALSE values VARBINARY(n) or Binary string. Variable length. Maximum length n BINARY VARYING(n) INTEGER(p) Integer numerical (no decimal). Precision p SMALLINT Integer numerical (no decimal). Precision 5 INTEGER Integer numerical (no decimal). Precision 10 BIGINT Integer numerical (no decimal). Precision 19 Exact numerical, precision p, scale s. Example: DECIMAL(p,s) decimal(5,2) is a number that has 3 digits before the decimal and 2 digits after the decimal NUMERIC(p,s) Exact numerical, precision p, scale s. (Same as DECIMAL) Approximate numerical, mantissa precision p. A FLOAT(p) floating number in base 10 exponential notation. The size argument for this type consists of a single number specifying the minimum precision REAL Approximate numerical, mantissa precision 7 FLOAT Approximate numerical, mantissa precision 16 DOUBLE PRECISION Approximate numerical, mantissa precision 16 DATE Stores year, month, and day values TIME Stores hour, minute, and second values TIMESTAMP Stores year, month, day, hour, minute, and second values INTERVAL Composed of a number of integer fields, representing a period of time, depending on the type of interval ARRAY A set-length and ordered collection of elements MULTISET A variable-length and unordered collection of elements XML Stores XML data ===== SQL Data Type Quick Reference ===== However, different databases offer different choices for the data type definition. The following table shows some of the common names of data types between the various database platforms: Data type Access SQLServer Oracle MySQL PostgreSQL boolean Yes/No Bit Byte N/A Boolean integer Number Int Number Int Int (integer) Integer Integer float Number Float Number Float Numeric (single) Real currency Currency Money N/A N/A Money string (fixed) N/A Char Char Char Char string Text (<256) Varchar Varchar Varchar Varchar (variable) Memo (65k+) Varchar2 Binary (fixed up to binary object OLE Object 8K) Long Blob Binary Memo Varbinary (<8K) Raw Text Varbinary Image (<2GB) Note: Data types might have different names in different database. And even if the name is the same, the size and other details may be different\! Always check the documentation\! ===== Microsoft Access Data Types ===== Data type Description Storage Text Use for text or combinations of text and numbers. 255 characters maximum Memo is used for larger amounts of text. Stores up Memo to 65,536 characters. Note: You cannot sort a memo field. However, they are searchable Byte Allows whole numbers from 0 to 255 1 byte Integer Allows whole numbers between -32,768 and 32,767 2 bytes Long Allows whole numbers between -2,147,483,648 and 4 bytes 2,147,483,647 Single Single precision floating-point. Will handle most 4 bytes decimals Double Double precision floating-point. Will handle most 8 bytes decimals Use for currency. Holds up to 15 digits of whole Currency dollars, plus 4 decimal places. Tip: You can 8 bytes choose which country's currency to use AutoNumber AutoNumber fields automatically give each record 4 bytes its own number, usually starting at 1 Date/Time Use for dates and times 8 bytes A logical field can be displayed as Yes/No, Yes/No True/False, or On/Off. In code, use the constants 1 bit True and False (equivalent to -1 and 0). Note: Null values are not allowed in Yes/No fields Ole Object Can store pictures, audio, video, or other BLOBs up to 1GB (Binary Large OBjects) Hyperlink Contain links to other files, including web pages Lookup Wizard Let you type a list of options, which can then be 4 bytes chosen from a drop-down list ===== MySQL Data Types ===== In MySQL there are three main data types : text, number, and Date/Time types. Text types: Data type Description Holds a fixed length string (can contain letters, CHAR(size) numbers, and special characters). The fixed size is specified in parenthesis. Can store up to 255 characters Holds a variable length string (can contain letters, numbers, and special characters). The maximum size is VARCHAR(size) specified in parenthesis. Can store up to 255 characters. Note: If you put a greater value than 255 it will be converted to a TEXT type TINYTEXT Holds a string with a maximum length of 255 characters TEXT Holds a string with a maximum length of 65,535 characters BLOB For BLOBs (Binary Large OBjects). Holds up to 65,535 bytes of data MEDIUMTEXT Holds a string with a maximum length of 16,777,215 characters MEDIUMBLOB For BLOBs (Binary Large OBjects). Holds up to 16,777,215 bytes of data LONGTEXT Holds a string with a maximum length of 4,294,967,295 characters LONGBLOB For BLOBs (Binary Large OBjects). Holds up to 4,294,967,295 bytes of data Let you enter a list of possible values. You can list up to 65535 values in an ENUM list. If a value is inserted that is not in the list, a blank value will be inserted. ENUM(x,y,z,etc.) Note: The values are sorted in the order you enter them. You enter the possible values in this format: ENUM('X','Y','Z') SET Similar to ENUM except that SET may contain up to 64 list items and can store more than one choice Number types: Data type Description TINYINT(size) -128 to 127 normal. 0 to 255 UNSIGNED*. The maximum number of digits may be specified in parenthesis SMALLINT(size) -32768 to 32767 normal. 0 to 65535 UNSIGNED*. The maximum number of digits may be specified in parenthesis MEDIUMINT(size) -8388608 to 8388607 normal. 0 to 16777215 UNSIGNED*. The maximum number of digits may be specified in parenthesis -2147483648 to 2147483647 normal. 0 to 4294967295 INT(size) UNSIGNED*. The maximum number of digits may be specified in parenthesis -9223372036854775808 to 9223372036854775807 normal. 0 to BIGINT(size) 18446744073709551615 UNSIGNED*. The maximum number of digits may be specified in parenthesis A small number with a floating decimal point. The maximum FLOAT(size,d) number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter A large number with a floating decimal point. The maximum DOUBLE(size,d) number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter A DOUBLE stored as a string , allowing for a fixed decimal DECIMAL(size,d) point. The maximum number of digits may be specified in the size parameter. The maximum number of digits to the right of the decimal point is specified in the d parameter * The integer types have an extra option called UNSIGNED. Normally, the integer goes from an negative to positive value. Adding the UNSIGNED attribute will move that range up so it starts at zero instead of a negative number. Date types: Data type Description A date. Format: YYYY-MM-DD DATE() Note: The supported range is from '1000-01-01' to '9999-12-31' *A date and time combination. Format: YYYY-MM-DD HH:MI:SS DATETIME() Note: The supported range is from '1000-01-01 00:00:00' to '9999-12-31 23:59:59' *A timestamp. TIMESTAMP values are stored as the number of seconds since the Unix epoch ('1970-01-01 00:00:00' UTC). TIMESTAMP() Format: YYYY-MM-DD HH:MI:SS Note: The supported range is from '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC A time. Format: HH:MI:SS TIME() Note: The supported range is from '-838:59:59' to '838:59:59' A year in two-digit or four-digit format. YEAR() Note: Values allowed in four-digit format: 1901 to 2155. Values allowed in two-digit format: 70 to 69, representing years from 1970 to 2069 * Even if DATETIME and TIMESTAMP return the same format, they work very differently. In an INSERT or UPDATE query, the TIMESTAMP automatically set itself to the current date and time. TIMESTAMP also accepts various formats, like YYYYMMDDHHMISS, YYMMDDHHMISS, YYYYMMDD, or YYMMDD. ===== SQL Server Data Types ===== String types: Data type Description Storage char(n) Fixed width character string. Maximum Defined width 8,000 characters varchar(n) Variable width character string. Maximum 2 bytes + number 8,000 characters of chars varchar(max) Variable width character string. Maximum 2 bytes + number 1,073,741,824 characters of chars text Variable width character string. Maximum 4 bytes + number 2GB of text data of chars nchar Fixed width Unicode string. Maximum 4,000 Defined width x 2 characters nvarchar Variable width Unicode string. Maximum 4,000 characters nvarchar(max) Variable width Unicode string. Maximum 536,870,912 characters ntext Variable width Unicode string. Maximum 2GB of text data bit Allows 0, 1, or NULL binary(n) Fixed width binary string. Maximum 8,000 bytes varbinary Variable width binary string. Maximum 8,000 bytes varbinary(max) Variable width binary string. Maximum 2GB image Variable width binary string. Maximum 2GB Number types: Data type Description Storage tinyint Allows whole numbers from 0 to 255 1 byte smallint Allows whole numbers between -32,768 and 32,767 2 bytes int Allows whole numbers between -2,147,483,648 and 4 bytes 2,147,483,647 Allows whole numbers between bigint -9,223,372,036,854,775,808 and 8 bytes 9,223,372,036,854,775,807 Fixed precision and scale numbers. Allows numbers from -10^38 +1 to 10^38 –1. The p parameter indicates the maximum total number of digits that can be stored (both to the decimal(p,s) left and to the right of the decimal point). p 5-17 bytes must be a value from 1 to 38. Default is 18. The s parameter indicates the maximum number of digits stored to the right of the decimal point. s must be a value from 0 to p. Default value is 0 Fixed precision and scale numbers. Allows numbers from -10^38 +1 to 10^38 –1. The p parameter indicates the maximum total number of digits that can be stored (both to the numeric(p,s) left and to the right of the decimal point). p 5-17 bytes must be a value from 1 to 38. Default is 18. The s parameter indicates the maximum number of digits stored to the right of the decimal point. s must be a value from 0 to p. Default value is 0 smallmoney Monetary data from -214,748.3648 to 214,748.3647 4 bytes money Monetary data from -922,337,203,685,477.5808 to 8 bytes 922,337,203,685,477.5807 Floating precision number data from -1.79E + 308 to 1.79E + 308. float(n) The n parameter indicates whether the field 4 or 8 bytes should hold 4 or 8 bytes. float(24) holds a 4-byte field and float(53) holds an 8-byte field. Default value of n is 53. real Floating precision number data from -3.40E + 38 4 bytes to 3.40E + 38 Date types: Data type Description Storage datetime From January 1, 1753 to December 31, 9999 with 8 bytes an accuracy of 3.33 milliseconds datetime2 From January 1, 0001 to December 31, 9999 with 6-8 bytes an accuracy of 100 nanoseconds smalldatetime From January 1, 1900 to June 6, 2079 with an 4 bytes accuracy of 1 minute date Store a date only. From January 1, 0001 to 3 bytes December 31, 9999 time Store a time only to an accuracy of 100 3-5 bytes nanoseconds datetimeoffset The same as datetime2 with the addition of a 8-10 bytes time zone offset Stores a unique number that gets updated every time a row gets created or modified. The timestamp timestamp value is based upon an internal clock and does not correspond to real time. Each table may have only one timestamp variable Other data types: Data type Description sql_variant Stores up to 8,000 bytes of data of various data types, except text, ntext, and timestamp uniqueidentifier Stores a globally unique identifier (GUID) xml Stores XML formatted data. Maximum 2GB cursor Stores a reference to a cursor used for database operations table Stores a result-set for later processing ===== SQL Server Date Functions ===== The following table lists the most important built-in date functions in SQL Server: Function Description GETDATE() Returns the current date and time DATEPART() Returns a single part of a date/time DATEADD() Adds or subtracts a specified time interval from a date DATEDIFF() Returns the time between two dates CONVERT() Displays date/time data in different formats ===== SQL Date and Time Data Types and Functions ===== Function Description FORMAT() Formats how a field is to be displayed NOW() Returns the current system date and time ===== SQL Dates ===== The most difficult part when working with dates is to be sure that the format of the date you are trying to insert, matches the format of the date column in the database. As long as your data contains only the date portion, your queries will work as expected. However, if a time portion is involved, it gets more complicated. ===== SQL Date Data Types ===== MySQL comes with the following data types for storing a date or a date/time value in the database: * DATE - format YYYY-MM-DD * DATETIME - format: YYYY-MM-DD HH:MI:SS * TIMESTAMP - format: YYYY-MM-DD HH:MI:SS * YEAR - format YYYY or YY SQL Server comes with the following data types for storing a date or a date/time value in the database: * DATE - format YYYY-MM-DD * DATETIME - format: YYYY-MM-DD HH:MI:SS * SMALLDATETIME - format: YYYY-MM-DD HH:MI:SS * TIMESTAMP - format: a unique number Note: The date types are chosen for a column when you create a new table in your database\! For an overview of all data types available, go to our complete Data Types reference. ===== SQL Working with Dates ===== You can compare two dates easily if there is no time component involved\! Assume we have the following “Orders” table: OrderId ProductName OrderDate 1 Geitost 2008-11-11 2 Camembert Pierrot 2008-11-09 3 Mozzarella di Giovanni 2008-11-11 4 Mascarpone Fabioli 2008-10-29 Now we want to select the records with an OrderDate of “2008-11-11” from the table above. We use the following SELECT statement: SELECT * FROM Orders WHERE OrderDate='2008-11-11' The result-set will look like this: OrderId ProductName OrderDate 1 Geitost 2008-11-11 3 Mozzarella di Giovanni 2008-11-11 Now, assume that the “Orders” table looks like this (notice the time component in the “OrderDate” column): OrderId ProductName OrderDate 1 Geitost 2008-11-11 13:23:44 2 Camembert Pierrot 2008-11-09 15:45:21 3 Mozzarella di Giovanni 2008-11-11 11:12:01 4 Mascarpone Fabioli 2008-10-29 14:56:59 If we use the same SELECT statement as above: SELECT * FROM Orders WHERE OrderDate='2008-11-11' we will get no result\! This is because the query is looking only for dates with no time portion. Tip: If you want to keep your queries simple and easy to maintain, do not allow time components in your dates\! ===== SQL Aggregate Functions ===== SQL aggregate functions return a single value, calculated from values in a column. Function Description AVG() Returns the average value COUNT() Returns the number of rows FIRST() Returns the first value LAST() Returns the last value MAX() Returns the largest value MIN() Returns the smallest value ROUND() Rounds a numeric field to the number of decimals specified SUM() Returns the sum ===== SQL String Functions ===== Function Description CHARINDEX Searches an expression in a string expression and returns its starting position if found CONCAT() LEFT() LEN() / LENGTH() Returns the length of the value in a text field LOWER() / LCASE() Converts character data to lower case LTRIM() SUBSTRING() / MID() Extract characters from a text field PATINDEX() REPLACE() RIGHT() RTRIM() UPPER() / UCASE() Converts character data to upper case ===== SQL ISNULL(), NVL(), IFNULL() and COALESCE() Functions ===== Look at the following “Products” table: P_Id ProductName UnitPrice UnitsInStock UnitsOnOrder 1 Jarlsberg 10.45 16 15 2 Mascarpone 32.56 23 3 Gorgonzola 15.67 9 20 Suppose that the “UnitsOnOrder” column is optional, and may contain NULL values. We have the following SELECT statement: SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder) FROM Products In the example above, if any of the “UnitsOnOrder” values are NULL, the result is NULL. Microsoft’s ISNULL() function is used to specify how we want to treat NULL values. The NVL(), IFNULL(), and COALESCE() functions can also be used to achieve the same result. In this case we want NULL values to be zero. Below, if “UnitsOnOrder” is NULL it will not harm the calculation, because ISNULL() returns a zero if the value is NULL: MS Access SELECT ProductName,UnitPrice*(UnitsInStock+IIF(ISNULL(UnitsOnOrder),0,UnitsOnOrder)) FROM Products SQL Server SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0)) FROM Products Oracle Oracle does not have an ISNULL() function. However, we can use the NVL() function to achieve the same result: SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0)) FROM Products MySQL MySQL does have an ISNULL() function. However, it works a little bit different from Microsoft's ISNULL() function. In MySQL we can use the IFNULL() function, like this: SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0)) FROM Products or we can use the COALESCE() function, like this: SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0)) FROM Products ===== SQL Arithmetic Operators ===== Operator Description + Add - Subtract * Multiply / Divide % Modulo ===== SQL Bitwise Operators ===== Operator Description & Bitwise AND OR ^ Bitwise exclusive OR ===== SQL Comparison Operators ===== Operator Description = Equal to > Greater than < Less than >= Greater than or equal to <= Less than or equal to <> Not equal to ===== SQL Compound Operators ===== Operator Description += Add equals -= Subtract equals *= Multiply equals /= Divide equals %= Modulo equals &= Bitwise AND equals ^-= Bitwise exclusive equals equals ===== SQL Logical Operators ===== Note: ALL and ANY are not supported in Web SQL databases. Chrome, Safari and Opera are using Web SQL in our examples. Operator Description ALL TRUE if all of the subquery values meet the condition AND TRUE if all the conditions separated by AND is TRUE ANY TRUE if any of the subquery values meet the condition BETWEEN TRUE if the operand is within the range of comparisons EXISTS TRUE if the subquery returns one or more records IN TRUE if the operand is equal to one of a list of expressions LIKE TRUE if the operand matches a pattern NOT Displays a record if the condition(s) is NOT TRUE OR TRUE if any of the conditions separated by OR is TRUE SOME TRUE if any of the subquery values meet the condition ===== SQL Quick Reference From W3Schools ===== * AND / OR * ALTER TABLE * AS (alias) * BETWEEN * CREATE DATABASE * CREATE TABLE * CREATE INDEX * CREATE VIEW * DELETE * DROP DATABASE * DROP INDEX * DROP TABLE * EXISTS * GROUP BY * HAVING * IN * INSERT INTO * INNER JOIN * LEFT JOIN * RIGHT JOIN * FULL JOIN * LIKE * ORDER BY * SELECT * SELECT \* * SELECT DISTINCT * SELECT INTO * SELECT TOP * TRUNCATE TABLE * UNION * UNION ALL * UPDATE * WHERE