jueves, 26 de octubre de 2017

QUE ES SQL


QUE ES SQL

De sus siglas Standard Query Language SQL es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones en éstas. Una de sus características es el manejo del álgebra y el cálculo relacional permitiendo efectuar consultas con el fin de recuperar -de una forma sencilla- información de interés de una base de datos, así como también hacer cambios sobre ella.


UN POCO DE HISTORIA


Los orígenes del SQL están ligados a los de las bases de datos relacionales. En 1970 E. F. Codd propone el modelo relacional y asociado a este un sublenguaje de acceso a los datos basado en el cálculo de predicados. Basándose en estas ideas, los laboratorios de IBM definen el lenguaje SEQUEL (Structured English Query Language) que más tarde sería ampliamente implementado por el sistema de gestión de bases de datos (SGBD) experimental System R, desarrollado en 1977 también por IBM. Sin embargo, fue Oraclequien lo introdujo por primera vez en 1979 en un programa comercial.


El SEQUEL terminaría siendo el predecesor de SQL, siendo este una versión evolucionada del primero. El SQL pasa a ser el lenguaje por excelencia de los diversos sistemas de gestión de bases de datos relacionales surgidos en los años siguientes y es por fin estandarizado en 1986 por el ANSI, dando lugar a la primera versión estándar de este lenguaje, el "SQL-86" o "SQL1". Al año siguiente este estándar es también adoptado por la ISO.

miércoles, 25 de octubre de 2017

SENTENCIAS DML

SENTENCIAS DML

El lenguaje de Manipulación de Datos (Data Manipulation Language –DML) sirve para llevar a cabo las transacciones en las base de datos,entiéndase por transacciones los procesos de inserción, actualización,eliminación, selección.


Para mayor explicación se expone los siguientes ejemplos usando la base de datos PEDIDOS:
Listar datos de Clientes

Sintaxis:
SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] expression [ ASname ] [, ...] [ INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table ] [FROM table [ alias ] [, ...] ] [ WHERE condition ] [ GROUP BY column [,...] ] [ HAVING condition [, ...] ] [ { UNION [ ALL ] | INTERSECT | EXCEPT} select ] [ ORDER BY column [ ASC | DESC | USING operator ] [, ...] ] [FOR UPDATE [ OF class_name [, ...] ] ] LIMIT { count | ALL } [ { OFFSET |, } start ]
Ejemplo:
Select * from clientes ; --Se lista todos los elementos de una tablaSelect Clienteid, nombrecia,celular from clientes --Se lista ciertoscampos de una tabla
Insertar datos en Clientes

Sintaxis:
INSERT INTO table [ ( column [, ...] ) ] { VALUES ( expression [, ...] ) |SELECT query }


Ejemplo:
INSERT INTO CLIENTES



VALUES(10,’183445667’,’YARBANTRELLA’,’PABLOPOLIT’,’AV.REPUBLICA’, NULL,NULL,NULL,NULL);SELECT * FROM clientes; --Comprobar Inserción
 Actualizar datos en Clientes

Sintaxis:
 UPDATE tabla SET columna = expresion [, ...] [ FROM lista ] [ WHEREcondicion ]
Ejemplo:
UPDATE clientes set direccioncli =’AV. PATRIA ‘WHERE clienteid =1;SELECT * FROM clientes; --Comprobar Actualización
Eliminar datos en Clientes

Sintaxis:
DELETE FROM table [ WHERE condition ]
Ejemplo:
DELETE FROM ClientesWHERE clienteid =’1’;SELECT * FROM clientes; --Comprobar Eliminación

Inserción de registros

La sentencia INSERT nos permite introducir nuevas filas en una tabla de la base de datos. Su sintaxis más simple es:

Insert into  tabla ([<lista_campos>]) Values ([<lista de="de" valores="valores">])
donde tabla representa la tabla a la que queremos añadir el registro y los valores que siguen a la clausula VALUES son los valores que damos a los distintos campos del registro. Si no se especifica la lista de campos, la lista de valores debe seguir el orden de todos los campos de la tabla.

La lista de campos a rellenar se indica si no queremos rellenar todos los campos. Los campos no rellenados explícitamente con la orden INSERT, se rellenan con su valor por defecto (DEFAULT) o bien con NULL si no se indicó valor alguno.

Insert into tabla ([<lista_campos>])
Select .....
En esta segunda sintaxis se permite añadir registros a una tabla obteniéndolos mediante una consulta SELECT. Por supuesto el tipo de los campos y el orden de estos debe coincidir con los de la lista de campos o con los de la tabla destino si estos últimos no se indican.

Ejemplo:

CREATE SEQUENCE SQ_NumFactura START WITH 1 INCREMENT BY 1;

CREATE TABLE MATRICULAS(
    nNumMatr  NUMBER(10) PRIMARY KEY,
    cCodAlu   VARCHAR2(10),
    cNomAlu   VARCHAR2(50),
    dFecIng   DATE DEFAULT SYSDATE
);

INSERT INTO MATRICULAS VALUES (SQ_NumFactura.NEXTVAL,'123','Antonio Lopez', '01/01/2000');

INSERT INTO MATRICULAS(nNumMatr,cCodAlu,cNomAlu) VALUES (SQ_NumFactura.NEXTVAL, '456','Manuel Viedma');

SELECT * FROM MATRICULAS;

SELECT SQ_NumFactura.NEXTVAL FROM DUAL;

INSERT INTO MATRICULAS(nNumMatr,cCodAlu,cNomAlu) VALUES (SQ_NumFactura.NEXTVAL, '789','Cristina Barcelona');

SELECT * FROM MATRICULAS;
Borrado de registros

La sentencia DELETE nos permite borrar filas de una tabla de la base de datos. Su sintaxis más simple es:

Delete [from] tabla [Where <condici>]
La sentencia DELETE es de tipo DML mientras que la sentencia TRUNCATE es de tipo DDL; la diferencia está en dos aspectos:

DELETE puede borrar 0, 1 o más registros de una tabla, mientras que TRUNCATE los borra todos.
DELETE puede disparar un triger de tipo DELETE asociado a la tabla con la que estemos trabajando, mientras que TRUNCATE no disparará ningún triger.
Una vez que se han eliminado los registros utilizando la sentencia DELETE, no puede deshacer la operación. Si desea saber qué registros se eliminarán, primero examine los resultados de una consulta de selección que utilice el mismo criterio y después ejecute la consulta de borrado. Mantenga copias de seguridad de sus datos en todo momento. Si elimina los registros equivocados podrá recuperarlos desde las copias de seguridad. Hay que tener en mucho cuidado con la restricción de ON DELETE CASCADE.

Modificación de registros

La sentencia UPDATE nos permite modificar filas de una tabla de la base de datos. Su sintaxis más simple es:

Update tabla Set columna1= valor1 [, columna2= valor2, .....] [Where <condici>]
Se modifican las columnas indicadas en el apartado SET con los valores indicados. La cláusula WHERE permite especificar qué registros serán modificados.

Su segundo tipo de sintaxis es:

Update tabla Set columna1= (Sentencia SELECT) [Where <condici>]
Este tipo de actualizaciones sólo son válidas si la Sentencia SELECT devuelve un único valor, que además debe de ser compatible con la columna que se actualiza.

Sentencia MERGE

Este comando sirve para actualizar los valores de los registros de una tabla a partir de valores de registros de otra tabla o consulta. Permite pues combinar los datos de dos tablas a fin de actualizar la primera. Su sintaxis es:

MERGE INTO tabla alias
USING (instrucción SELECT) alias
ON (condición de unión)
WHEN MATCHED THEN
   UPDATE SET col1=valor1 [col2=valor2]
WHEN NOT MATCHED THEN
   INSERT (listaDeColumnas)
   VALUES (listaDeValores)
MERGE compara los registros de ambas tablas según la condición indicada en el apartado ON. Compara cada registro de la tabla con cada registro del SELECT. Los apartados de la sintaxis significan lo siguiente:

tabla es el nombre de la tabla que queremos modificar.
USING. En esa cláusula se indica una instrucción SELECT que muestre una tabla que contenga los datos a partir de los cuales se modifica la tabla.
ON. permite indicar la condición que permite relacionar los registros de la tabla con los registros de la consulta SELECT.
WHEN MATCHED THEN. El UPDATE que sigue a esta parte se ejecuta cuando la condición indicada en el apartado ON sea cierta para los dos registros actuales.
WHEN NOT MATCHED THEN. El INSERT que sigue a esta parte se ejecuta para cada registro de la consulta SELECT que no pudo ser relacionado con ningún registro de la tabla.
Supongamos que poseemos una tabla en la que queremos realizar una lista de localidades con su respectiva provincia. Las localidades están ya rellenadas, nos faltan las provincias. Resulta que tenemos otra tabla llamada clientes en la que tenemos datos de localidades y provincias, gracias a esta tabla podremos rellenar los datos que faltan en la otra.

MERGE INTO localidades l
USING (SELECT * FROM clientes) c
ON (l.localidad=clientes.localidad)
WHEN MATCHED THEN
  UPDATE SET l.provincia=c.provincia
WHEN NOT MATCHED THEN
  INSERT (localidad, provincia)
  VALUES (c.localidad, c.provincia)



Instrucción ALTER

Instrucción ALTER

Sintaxis
ALTER TABLE tabla {ADD {COLUMN tipo de campo[(tamaño)] [NOT NULL] [CONSTRAINT índice] | ALTER COLUMN tipo de campo[(tamaño)] | CONSTRAINT índiceDeVariosCampos} | DROP {COLUMN campo I CONSTRAINT nombreDeÍndice} }
La instrucción ALTER TABLE consta de los siguientes elementos:

Elemento
Descripción
tabla
Nombre de la tabla que se va a modificar.
campo
Nombre del campo que se va a agregar o eliminar en la tabla. O bien, nombre del campo que se va a modificar en la tabla.
tipo
Tipo de datos del campo.
tamaño
Tamaño del campo en caracteres (sólo los campos de tipo texto y binario).
índice
Índice del campo. Para obtener más información acerca de cómo construir este índice, vea la Cláusula CONSTRAINT.
índiceDeVariosCampos
Definición de un índice de varios campos que se agregará a la tabla. Para obtener más información acerca de cómo construir este índice, vea la Cláusula CONSTRAINT.
nombreDeÍndice
Nombre del índice de varios campos que se eliminará.

EJEMPLO

En este ejemplo, se agrega una clave externa a la tabla Orders. La clave externa se basa en el campo EmployeeID y hace referencia al campo EmployeeID de la tabla Employees. En este ejemplo, no tiene que enumerar el campo EmployeeID después de la tabla Employees en la cláusula REFERENCES porque EmployeeID es la clave principal de la tabla Employees.


Sub AlterTableX4() 
 
    Dim dbs As Database 
 
    ' Modify this line to include the path to Northwind 
    ' on your computer. 
    Set dbs = OpenDatabase("Northwind.mdb") 
 
    ' Add a foreign key to the Orders table. 
    dbs.Execute "ALTER TABLE Orders " _ 
        & "ADD CONSTRAINT OrdersRelationship " _ 
        & "FOREIGN KEY (EmployeeID) " _ 
        & "REFERENCES Employees (EmployeeID);" 
 
    dbs.Close 
 
End Sub 



Instrucción DROP

Instrucción DROP (Microsoft Access SQL)

El motor de base de datos de Microsoft Access no admite el uso de DROP, ni las instrucciones DDL, con bases de datos que no sean del motor de base de datos de Microsoft Access. En su lugar, use el método Delete de DAO.

Sintaxis
DROP {TABLE tabla | INDEX índice ON tabla | PROCEDURE procedimiento | VIEW vista}
La instrucción DROP consta de los siguientes elementos:



Elemento
Descripción
tabla
Nombre de la tabla que se va a eliminar o en la que se va a eliminar un índice.
procedimiento
Nombre del procedimiento que se va a eliminar.
vista
Nombre de la vista que se va a eliminar.
índice
Nombre del índice que se va a eliminar en la tabla.

EJEMPLO

En este ejemplo se elimina la tabla Employees de la base de datos.

VBA
Sub DropX2() 
 
    Dim dbs As Database 
 
    ' Modify this line to include the path to Northwind 
    ' on your computer. 
    Set dbs = OpenDatabase("Northwind.mdb") 
 
    ' Delete the Employees table. 
    dbs.Execute "DROP TABLE Employees;" 
 
    dbs.Close 
 
End Sub



datos DDL

Lenguaje de definición de datos DDL

(Data Definition Language, DDL por sus siglas en inglés) es un lenguaje proporcionado por el sistema de gestión de base de datos que permite a los usuarios de la misma llevar a cabo las tareas de definición de las estructuras que almacenarán los datos así como de los procedimientos o funciones que permitan consultarlos.
En la siguiente tabla, se muestran las instrucciones DDL que admite SQL Server Compact.



Instrucciones DDL admitidas



Instrucción
Función
CREATE DATABASE
Crea una nueva base de datos y el archivo usado para almacenarla.
CREATE TABLE
Crea una nueva tabla.
ALTER TABLE
Modifica la definición de una tabla alterando, agregando o eliminando columnas y restricciones.
CREATE INDEX
Crea un índice en una tabla determinada.
DROP INDEX
Quita uno o varios índices de la base de datos actual.
DROP TABLE
Quita la definición de una tabla y todos sus datos, índices y restricciones.
INSTRCRCCION CREATE

SQL Server Transact-SQL contiene las siguientes instrucciones CREATE. Utilice las instrucciones CREATE para definir nuevas entidades. Por ejemplo, utilice CREATE TABLE para agregar una nueva tabla a una base de datos.

CREATE TABLE (Transact-SQL)

Crea una nueva tabla en SQL Server.

SINTASIS 


--Disk-Based CREATE TABLE Syntax
CREATE TABLE
    [ database_name . [ schema_name ] . | schema_name . ] table_name
    [ AS FileTable ]
    ( { <column_definition> | <computed_column_definition>
        | <column_set_definition> | [ <table_constraint> ]
| [ <table_index> ] [ ,...n ] } )
    [ ON { partition_scheme_name ( partition_column_name ) | filegroup
        | "default" } ]
    [ { TEXTIMAGE_ON { filegroup | "default" } ]
    [ FILESTREAM_ON { partition_scheme_name | filegroup
        | "default" } ]
    [ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]

<column_definition> ::= 
column_name <data_type>
    [ FILESTREAM ]
    [ COLLATE collation_name ]
    [ SPARSE ]
    [ NULL | NOT NULL ]
    [
        [ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
      | [ IDENTITY [ ( seed,increment ) ] [ NOT FOR REPLICATION ]
    ]
    [ ROWGUIDCOL ]
    [ <column_constraint> [ ...n ] ]
    [ <column_index> ]

<data type> ::=
[ type_schema_name . ] type_name
    [ ( precision [ , scale ] | max |
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ]

<column_constraint> ::=
[ CONSTRAINT constraint_name ]
{     { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [
            WITH FILLFACTOR = fillfactor 
          | WITH ( < index_option > [ , ...n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name )
            | filegroup | "default" } ]

  | [ FOREIGN KEY ]
        REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ]
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ NOT FOR REPLICATION ]

  | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}

<column_index> ::=
 INDEX index_name [ CLUSTERED | NONCLUSTERED ]
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name (column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

<computed_column_definition> ::= 
column_name AS computed_column_expression
[ PERSISTED [ NOT NULL ] ]
[
    [ CONSTRAINT constraint_name ]
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [
            WITH FILLFACTOR = fillfactor
          | WITH ( <index_option> [ , ...n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name )
        | filegroup | "default" } ]

    | [ FOREIGN KEY ]
        REFERENCES referenced_table_name [ ( ref_column ) ]
        [ ON DELETE { NO ACTION | CASCADE } ]
        [ ON UPDATE { NO ACTION } ]
        [ NOT FOR REPLICATION ]

    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
]

<column_set_definition> ::= 
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS

< table_constraint > ::=
[ CONSTRAINT constraint_name ]
{
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        (column [ ASC | DESC ] [ ,...n ] )
        [
            WITH FILLFACTOR = fillfactor
           |WITH ( <index_option> [ , ...n ] )
        ]
        [ ON { partition_scheme_name (partition_column_name)
            | filegroup | "default" } ]
    | FOREIGN KEY
        ( column [ ,...n ] )
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
        [ NOT FOR REPLICATION ]
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )

< table_index > ::=
INDEX index_name [ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] )
   
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name (column_name )
         | filegroup_name
         | default
         }
    ]
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]

}
<table_option> ::=
{
    [DATA_COMPRESSION = { NONE | ROW | PAGE }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> }
      [ , ...n ] ) ]]
    [ FILETABLE_DIRECTORY = <directory_name> ]
    [ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
    [ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
}

<index_option> ::=
{
    PAD_INDEX = { ON | OFF }
  | FILLFACTOR = fillfactor
  | IGNORE_DUP_KEY = { ON | OFF }
  | STATISTICS_NORECOMPUTE = { ON | OFF }
  | ALLOW_ROW_LOCKS = { ON | OFF}
  | ALLOW_PAGE_LOCKS ={ ON | OFF}
  | DATA_COMPRESSION = { NONE | ROW | PAGE }
       [ ON PARTITIONS ( { <partition_number_expression> | <range> }
       [ , ...n ] ) ]
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>



--Memory optimized CREATE TABLE Syntax
CREATE TABLE
    [database_name . [schema_name ] . | schema_name . ] table_name
    ( { <column_definition>
    | [ <table_constraint> ] [ ,... n ]
    | [ <table_index> ] [ ,... n ]
    } )
    [ WITH ( <table_option> [ ,... n ] ) ]
 [ ; ]
 
<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]
[
    [ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
    | [ IDENTITY [ ( 1, 1 ) ]
]
    [ <column_constraint> ]
    [ <column_index> ]
 
<data type> ::=
 [type_schema_name . ] type_name [ (precision [ , scale ]) ]
 
<column_constraint> ::=
 [ CONSTRAINT constraint_name ]
{ PRIMARY KEY { NONCLUSTERED HASH WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED } }
 
< table_constraint > ::=
 [ CONSTRAINT constraint_name ]
{ PRIMARY KEY { { NONCLUSTERED HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) 
| NONCLUSTERED (column [ ASC | DESC ] [ ,... n ] ) } }
 
<column_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count) | [ NONCLUSTERED ] }
 
<table_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) 
| [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] ) }
 
<table_option> ::=
{
    [MEMORY_OPTIMIZED = {ON | OFF}]
  | [DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}]


EJEMPLO

CREATE TABLE (Transact-SQL)

Crea una nueva tabla en SQL Server.
Se aplica a: SQL Server (SQL Server 2008 hasta la versión actual).
Para obtener la sintaxis de Base de datos
SQL de Azure, vea CREATE TABLE (Base de datos SQL de Azure).

Sintaxis

--Disk-Based CREATE TABLE Syntax
CREATE TABLE 
    [ database_name . [ schema_name ] . | schema_name . ] table_name 
    [ AS FileTable ]
    ( { <column_definition> | <computed_column_definition> 
        | <column_set_definition> | [ <table_constraint> ] 
| [ <table_index> ] [ ,...n ] } )
    [ ON { partition_scheme_name ( partition_column_name ) | filegroup 
        | "default" } ] 
    [ { TEXTIMAGE_ON { filegroup | "default" } ] 
    [ FILESTREAM_ON { partition_scheme_name | filegroup 
        | "default" } ]
    [ WITH ( <table_option> [ ,...n ] ) ]
[ ; ]
 
<column_definition> ::= 
column_name <data_type>
    [ FILESTREAM ]
    [ COLLATE collation_name ] 
    [ SPARSE ]
    [ NULL | NOT NULL ]
    [ 
        [ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
      | [ IDENTITY [ ( seed,increment ) ] [ NOT FOR REPLICATION ] 
    ]
    [ ROWGUIDCOL ]
    [ <column_constraint> [ ...n ] ] 
    [ <column_index> ]
 
<data type> ::= 
[ type_schema_name . ] type_name 
    [ ( precision [ , scale ] | max | 
        [ { CONTENT | DOCUMENT } ] xml_schema_collection ) ] 
 
<column_constraint> ::= 
[ CONSTRAINT constraint_name ] 
{     { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        [ 
            WITH FILLFACTOR = fillfactor  
          | WITH ( < index_option > [ , ...n ] ) 
        ] 
        [ ON { partition_scheme_name ( partition_column_name ) 
            | filegroup | "default" } ]
 
  | [ FOREIGN KEY ] 
        REFERENCES [ schema_name . ] referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 
 
  | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
} 
 
<column_index> ::= 
 INDEX index_name [ CLUSTERED | NONCLUSTERED ]
    [ WITH ( <index_option> [ ,... n ] ) ]
    [ ON { partition_scheme_name (column_name ) 
         | filegroup_name
         | default 
         }
    ] 
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
 
<computed_column_definition> ::= 
column_name AS computed_column_expression 
[ PERSISTED [ NOT NULL ] ]
[ 
    [ CONSTRAINT constraint_name ]
    { PRIMARY KEY | UNIQUE }
        [ CLUSTERED | NONCLUSTERED ]
        [ 
            WITH FILLFACTOR = fillfactor 
          | WITH ( <index_option> [ , ...n ] )
        ]
        [ ON { partition_scheme_name ( partition_column_name ) 
        | filegroup | "default" } ]
 
    | [ FOREIGN KEY ] 
        REFERENCES referenced_table_name [ ( ref_column ) ] 
        [ ON DELETE { NO ACTION | CASCADE } ] 
        [ ON UPDATE { NO ACTION } ] 
        [ NOT FOR REPLICATION ] 
 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
] 
 
<column_set_definition> ::= 
column_set_name XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
 
< table_constraint > ::=
[ CONSTRAINT constraint_name ] 
{ 
    { PRIMARY KEY | UNIQUE } 
        [ CLUSTERED | NONCLUSTERED ] 
        (column [ ASC | DESC ] [ ,...n ] ) 
        [ 
            WITH FILLFACTOR = fillfactor 
           |WITH ( <index_option> [ , ...n ] ) 
        ]
        [ ON { partition_scheme_name (partition_column_name)
            | filegroup | "default" } ] 
    | FOREIGN KEY 
        ( column [ ,...n ] ) 
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ] 
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
        [ NOT FOR REPLICATION ] 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) 
 
< table_index > ::= 
INDEX index_name [ CLUSTERED | NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] ) 
    
    [ WITH ( <index_option> [ ,... n ] ) ] 
    [ ON { partition_scheme_name (column_name ) 
         | filegroup_name
         | default 
         }
    ] 
    [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
 
} 
<table_option> ::=
{
    [DATA_COMPRESSION = { NONE | ROW | PAGE }
      [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
      [ , ...n ] ) ]]
    [ FILETABLE_DIRECTORY = <directory_name> ] 
    [ FILETABLE_COLLATE_FILENAME = { <collation_name> | database_default } ]
    [ FILETABLE_PRIMARY_KEY_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_STREAMID_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
    [ FILETABLE_FULLPATH_UNIQUE_CONSTRAINT_NAME = <constraint_name> ]
}
 
<index_option> ::=
{ 
    PAD_INDEX = { ON | OFF } 
  | FILLFACTOR = fillfactor 
  | IGNORE_DUP_KEY = { ON | OFF } 
  | STATISTICS_NORECOMPUTE = { ON | OFF } 
  | ALLOW_ROW_LOCKS = { ON | OFF} 
  | ALLOW_PAGE_LOCKS ={ ON | OFF} 
  | DATA_COMPRESSION = { NONE | ROW | PAGE }
       [ ON PARTITIONS ( { <partition_number_expression> | <range> } 
       [ , ...n ] ) ]
}
<range> ::= 
<partition_number_expression> TO <partition_number_expression>
--Memory optimized CREATE TABLE Syntax
CREATE TABLE
    [database_name . [schema_name ] . | schema_name . ] table_name
    ( { <column_definition>
    | [ <table_constraint> ] [ ,... n ]
    | [ <table_index> ] [ ,... n ]
    } )
    [ WITH ( <table_option> [ ,... n ] ) ]
 [ ; ]
 
<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]
[
    [ CONSTRAINT constraint_name ] DEFAULT memory_optimized_constant_expression ]
    | [ IDENTITY [ ( 1, 1 ) ]
]
    [ <column_constraint> ]
    [ <column_index> ]
 
<data type> ::=
 [type_schema_name . ] type_name [ (precision [ , scale ]) ]
 
<column_constraint> ::=
 [ CONSTRAINT constraint_name ]
{ PRIMARY KEY { NONCLUSTERED HASH WITH (BUCKET_COUNT = bucket_count) | NONCLUSTERED } }
 
< table_constraint > ::=
 [ CONSTRAINT constraint_name ]
{ PRIMARY KEY { { NONCLUSTERED HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count)
 | NONCLUSTERED (column [ ASC | DESC ] [ ,... n ] ) } }
 
<column_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] HASH WITH (BUCKET_COUNT = bucket_count) | [ NONCLUSTERED ] }
 
<table_index> ::=
  INDEX index_name
{ [ NONCLUSTERED ] HASH (column [ ,... n ] ) WITH (BUCKET_COUNT = bucket_count) 
| [ NONCLUSTERED ] (column [ ASC | DESC ] [ ,... n ] ) }
 
<table_option> ::=
{
    [MEMORY_OPTIMIZED = {ON | OFF}]
  | [DURABILITY = {SCHEMA_ONLY | SCHEMA_AND_DATA}]
}