• SQL基础系列(1)-基本语法--转载w3school


    1.    建原始表

    USE [Northwind]

    GO

     

    /****** Object:  Table [dbo].[Persons]    Script Date: 2016/6/8 7:31:57 ******/

    SET ANSI_NULLS ON

    GO

     

    SET QUOTED_IDENTIFIER ON

    GO

     

    CREATE TABLE [dbo].[Persons](

        [id] [INT] IDENTITY(1,1) NOT NULL,

        [LastName] [NVARCHAR](50) NULL,

        [FirstName] [NVARCHAR](50) NULL,

        [Address] [NVARCHAR](200) NULL,

        [City] [NVARCHAR](200) NULL,

     CONSTRAINT [PK_Persions] PRIMARY KEY CLUSTERED

    (

        [id] ASC

    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

    ) ON [PRIMARY]

     

    GO

     

     

     

    USE [Northwind]

    GO

     

    /****** Object:  Table [dbo].[Orders]    Script Date: 2016/6/8 7:32:44 ******/

    SET ANSI_NULLS ON

    GO

     

    SET QUOTED_IDENTIFIER ON

    GO

     

    CREATE TABLE [dbo].[Orders](

        [Id_O] [INT] IDENTITY(1,1) NOT NULL,

        [OrderNo] [NVARCHAR](50) NULL,

        [Id_P] [INT] NULL,

     CONSTRAINT [PK_Orders_1] PRIMARY KEY CLUSTERED

    (

        [Id_O] ASC

    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

    ) ON [PRIMARY]

     

    GO

     

     

    2.    连接查询

    2.1  Inner join

    在表中存在至少一个匹配时,INNER JOIN 关键字返回行,与JOIN等效

    SELECT  Persons.* ,

            Orders.OrderNo

    FROM    dbo.Persons

            INNER JOIN dbo.Orders ON dbo.Persons.id = dbo.Orders.Id_p

    ORDER BY dbo.Persons.LastName

    2.2  Left join

    LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行

    SELECT  Persons.* ,

            Orders.OrderNo

    FROM    dbo.Persons

            LEFT  JOIN dbo.Orders ON dbo.Persons.id = dbo.Orders.Id_p

    ORDER BY dbo.Persons.LastName

    2.3  Right join

    RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行。

    SELECT  Persons.* ,

            Orders.OrderNo

    FROM    dbo.Persons

            RIGHT  JOIN dbo.Orders ON dbo.Persons.id = dbo.Orders.Id_p

    ORDER BY dbo.Persons.LastName

    2.4  Full join

    FULL JOIN 关键字会从左表 (Persons) 和右表 (Orders) 那里返回所有的行。如果 "Persons" 中的行在表 "Orders" 中没有匹配,或者如果 "Orders" 中的行在表 "Persons" 中没有匹配,这些行同样会列出。

    SELECT  Persons.LastName ,

            Persons.FirstName ,

            Orders.OrderNo

    FROM    Persons

            FULL JOIN Orders ON Persons.id = Orders.Id_p

    ORDER BY Persons.LastName

    2.5  Union

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

    请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

    SELECT LastName FROM Employees

    UNION

    SELECT LastName FROM Employees123

    2.6  Union all

    UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值

    SELECT LastName FROM Employees

    UNION ALL

    SELECT LastName FROM Employees123

    3.    拷贝表数据

    3.1  Select into

    SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。

    SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。

    SELECT *

    INTO Persons_backup

    FROM Persons

    3.2  拷贝部分列

    SELECT LastName,FirstName

    INTO Persons_backup

    FROM Persons

    3.3  带条件语句

    SELECT  Persons.LastName ,

            Orders.OrderNo

    INTO    Persons_Order_Backup

    FROM    Persons

            INNER JOIN Orders ON Persons.Id = Orders.Id_P

    4.    约束

    4.1  Not Null

    NOT NULL 约束强制列不接受 NULL 值。

    NOT NULL 约束强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

    CREATE TABLE Persons1

        (

          Id_P INT NOT NULL ,

          LastName VARCHAR(255) NOT NULL ,

          FirstName VARCHAR(255) ,

          Address VARCHAR(255) ,

          City VARCHAR(255)

        )

    4.2  UNIQUE 约束

    Mysql:

    CREATE TABLE Persons

    (

    Id_P int NOT NULL,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255),

    UNIQUE (Id_P)

    )

    Sqlserver

    CREATE TABLE Persons

    (

    Id_P int NOT NULL UNIQUE,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255)

    )

    如果需要命名 UNIQUE 约束,以及为多个列定义 UNIQUE 约束,请使用下面的 SQL 语法

    Mysql  mssql oracle

    CREATE TABLE Persons

    (

    Id_P int NOT NULL,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255),

    CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

    )

    在已经创建的表上面添加唯一约束

    ALTER TABLE Persons

    ADD UNIQUE (Id_P)

    删除约束

    Mysql

    ALTER TABLE Persons

    DROP INDEX uc_PersonID

     

    Mssql

    ALTER TABLE Persons

    DROP CONSTRAINT uc_PersonID

     

    4.3  PRIMARY KEY 约束

    Mysql

    CREATE TABLE Persons

    (

    Id_P int NOT NULL,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255),

    PRIMARY KEY (Id_P)

    )

    Msql

    CREATE TABLE Persons

    (

    Id_P int NOT NULL PRIMARY KEY,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255)

    )

    多个字段

    Mysql  mssql oracle一致

    CREATE TABLE Persons

    (

    Id_P int NOT NULL,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255),

    CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

    )

    为已在的表创建约束

    ALTER TABLE Persons

    ADD PRIMARY KEY (Id_P)

    ALTER TABLE Persons

    ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

    删除约束

    Mysql

    ALTER TABLE Persons

    DROP PRIMARY KEY

     

    Mssql

     

    ALTER TABLE Persons

    DROP CONSTRAINT pk_PersonID

     

    4.4  FOREIGN KEY 

    FOREIGN KEY 约束用于预防破坏表之间连接的动作。

    FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一

    Mysql

    CREATE TABLE Orders

    (

    Id_O int NOT NULL,

    OrderNo int NOT NULL,

    Id_P int,

    PRIMARY KEY (Id_O),

    FOREIGN KEY (Id_P) REFERENCES Persons(Id_P)

    )

    Mssql oracle

    CREATE TABLE Orders

    (

    Id_O int NOT NULL PRIMARY KEY,

    OrderNo int NOT NULL,

    Id_P int FOREIGN KEY REFERENCES Persons(Id_P)

    )

    定义多列约束

    CREATE TABLE Orders

    (

    Id_O int NOT NULL,

    OrderNo int NOT NULL,

    Id_P int,

    PRIMARY KEY (Id_O),

    CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)

    REFERENCES Persons(Id_P)

    )

    添加约束

    ALTER TABLE Orders

    ADD FOREIGN KEY (Id_P)

    REFERENCES Persons(Id_P)

    命名约束

    ALTER TABLE Orders

    ADD CONSTRAINT fk_PerOrders

    FOREIGN KEY (Id_P)

    REFERENCES Persons(Id_P)

    删除约束

    Mysql

    ALTER TABLE Orders

    DROP FOREIGN KEY fk_PerOrders

    Mssql

    ALTER TABLE Orders

    DROP CONSTRAINT fk_PerOrders

    5.    SQL CHECK 约束

    CHECK 约束用于限制列中的值的范围。

    如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

    如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

    Mysql

    CREATE TABLE Persons

    (

    Id_P int NOT NULL,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255),

    CHECK (Id_P>0)

    )

    Mssql

    CREATE TABLE Persons

    (

    Id_P int NOT NULL CHECK (Id_P>0),

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255)

    )

    命名约束

    CREATE TABLE Persons

    (

    Id_P int NOT NULL,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255),

    CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

    )

    表已存在

    Mysql

    ALTER TABLE Persons

    ADD CHECK (Id_P>0)

    Mssql

    ALTER TABLE Persons

    ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

    删除约束

    Mysql

    ALTER TABLE Persons

    DROP CHECK chk_Person

    Mssql

    ALTER TABLE Persons

    DROP CONSTRAINT chk_Person

    6.    索引

    在表中创建索引,以便更加快速高效地查询数据。

    用户无法看到索引,它们只能被用来加速搜索/查询。

     

    更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

     

     

    创建可重复的索引

    CREATE INDEX index_name

    ON table_name (column_name)

    创建唯一索引

    CREATE UNIQUE INDEX index_name

    ON table_name (column_name)

    降序索引某个列中的值,可以在列名称之后添加保留字 DESC

    CREATE INDEX PersonIndex

    ON Person (LastName DESC)

    多列上添加索引

    CREATE INDEX PersonIndex

    ON Person (LastName, FirstName)

    7.    Drop

    删除索引

    Mssql

    DROP INDEX table_name.index_name

     

    Mysql

    ALTER TABLE table_name DROP INDEX index_name

    仅仅需要除去表内的数据,但并不删除表本身

    8.    ALTER TABLE

    增加列

    ALTER TABLE table_name

    ADD column_name datatype

    删除列

    ALTER TABLE table_name

    DROP COLUMN column_name

    修改列

    ALTER TABLE table_name

    ALTER COLUMN column_name datatype

    9.    AUTO INCREMENT 字段

    Mysql

    CREATE TABLE Persons

    (

    P_Id int NOT NULL AUTO_INCREMENT,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255),

    PRIMARY KEY (P_Id)

    )

     

    修改起始值

    ALTER TABLE Persons AUTO_INCREMENT=100

     

    Mssql

    CREATE TABLE Persons

    (

    P_Id int PRIMARY KEY IDENTITY,

    LastName varchar(255) NOT NULL,

    FirstName varchar(255),

    Address varchar(255),

    City varchar(255)

    )

    默认地,IDENTITY 的开始值是 1,每条新记录递增 1。

    要规定 "P_Id" 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10)

  • 相关阅读:
    Redis集群(一)
    Mysql分库分表
    Redisson分布式锁
    Spring Cloud Eureka 高可用
    Spring RestTemplate具备负载均衡功能
    Redis分布式锁
    B树/B-树/B+树/B*树的数据库应用
    ABAC访问控制模型
    Maven自定义打包的包名
    Versions maven plugin 修改版本
  • 原文地址:https://www.cnblogs.com/zijiyanxi/p/5572021.html
Copyright © 2020-2023  润新知