SQL命令
一、表的创建
SQL MS Access、MySQL 和 SQL Server 数据类型 | 菜鸟教程
SQL Server 和 MySQL 中的 Date 函数 | 菜鸟教程
1.1、创建表
CREATE TABLE Citys (
    CityID int PRIMARY KEY,
    CityName varchar(255)
);
CREATE TABLE Per (
    PersonID int PRIMARY KEY,                          /*主键约束*/
    LastName varchar(255) NOT NULL,                    /*非空约束*/
    FirstName varchar(255) UNIQUE,                     /*唯一约束*/
    Address varchar(255),
    City varchar(255) DEFAULT 'beijing',               /*默认值*/
    Sex varchar(255) CHECK (Sex IN ('man', 'weman')),  /*CHECK约束*/
    FOREIGN KEY (City) REFERENCES Citys(CityID)        /*声明外键*/
    /*CONSTRAINT fk_PerOrders FOREIGN KEY (City) REFERENCES Citys(CityID)
     *如果需要添加外键,并且为其命名,使用此语句*/
    /*CONSTRAINT chk_Per CHECK (PersonID > 0 AND Sex in('man', 'weman'))
     *需要定义多个列的约束,并未为器命名时*/
    /*CREATE INDEX IN_idx ON Per (PersonID);
     *为PersonID建立索引*/
    /*create unique index Name_idx on Per (FirstName);
     *为FirstName建立唯一索引(前提是FirstName是unique)*/
    /*PersonID int PRIMARY KEY auto_increment = start_value,
     *此语句将PersonID设置为自动增加,默认起始值为1,可以设置start_value指定起始值*/
); 
1.2、添加、删除约束
/*NOT NULL - 指示某列不能存储 NULL 值*/
ALTER TABLE Per MODIFY PersonID int NOT NULL;   /*添加PersonID的not null约束*/
ALTER TABLE Per MODIFY PersonID int NULL;       /*删除PersonID的not null约束*/
/*UNIQUE - 保证某列的每行必须有唯一的值*/
ALTER TABLE Per ADD UNIQUE(PersonID);           /*添加PersonID的UNIQUE约束*/
ALTER TABLE Per DROP INDEX PersonID;            /*删除PersonID的UNIQUE约束*/
ALTER TABLE Per
ADD CONSTRAINT uc_PersonID UNIQUE (PersonID, LastName); /*定义多个列的UNION约束并为之命名*/
ALTER TABLE Per
DROP INDEX uc_PersonID;                                 /*删除该约束*/
/*PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录*/
ALTER TABLE Per ADD PRIMARY KEY (PersonID);         /*添加主键约束*/
ALTER TABLE Per DROP PRIMARY KEY;                   /*删除主键约束*/
ALTER TABLE Per
ADD CONSTRAINT pk_PersonID PRIMARY KEY (PersonID,LastName);  /*当主键由多个列组成时*/
/*FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性
 *一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)
 *FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一*/
ALTER TABLE Per                                     /*不需要起别名时*/
ADD FOREIGN KEY (city)
REFERENCES Citys(CityID);
alter table Per                                     /*外键由几列构成,并需要起别名时*/
add constrain for_city
foreign key (city)
references Citys(CityID);
alter table Per                                     /*删除外键约束*/
drop foreifn key for_city;
/*CHECK - 保证列中的值符合指定的条件*/
ALTER TABLE Per                                     /*增加check约束*/
ADD CHECK (PersonID > 0);
ALTER TABLE Per                                     /*对多个列进行检查并命名*/
ADD CONSTRAINT chk_Per CHECK (PersonID > 0 AND Sex in('man', 'weman'));
ALTER TABLE Per                                     /*删除check约束*/
DROP CHECK chk_Per;
/*DEFAULT - 规定没有给列赋值时的默认值*/
ALTER TABLE Per                                     /*设置City默认值*/
ALTER COLUMN City SET DEFAULT 'beijing';
alter table Per                                     /*删除City的默认值*/
alter column City drop default;
/*INDEX - 用于快速访问数据库表中的数据
 *用户无法看到索引,它们只能被用来加速搜索/查询
 *更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新
 *因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引*/ 
1.3、视图
/*视图本质上是一个虚拟的表,它并不存储数据,而是基于基础表的查询结果生成
 *因此,如果基础表的数据发生变化,视图的内容也会相应地更新*/
 /*创建视图*/
create view view_name as                
select column1, column2, … 
from table_name
where condition;
/*eg:*/
create view high_rank as 
select id, name, url, country 
from web 
where alexa <= 50;
/*不能通过update直接修改视图
 *因为视图存储的是SQL语句的结果集
 *当表中的数据变化时,会引起视图的变化*/
update table_name
set condition_column = new_value
where condition;
/*eg:*/
update web 
set alexa = 100 w
here name = 'QQ APP';
/*删除视图*/
drop view if exists view_name;
/*eg:*/
drop view if exists high_rank;
 
二、表的操作
2.1、开胃菜
2.1.1、where
where用于条件判断

2.1.2、having
having其实也是用于条件判断的,但是where不可以和聚合函数结合使用

注意,基于only_full_group_by模式,所有非聚合列均需要包含在group by当中
2.1.3、like
通常和通配符一起使用
常见的与like搭配使用的通配符:
- %:0个或多个字符的占位符
 - _:一个字符的占位符
 不和like搭配使用:
- regexp '^[GFA]':匹配以G、F、A其中一者开头的字符串
 - regexp '^[^A-H]':匹配不以A-H开头的字符串,不区分大小写
 


2.1.4、in
用小括号将可能的取值括起来

2.1.5、between与or
between常常与and连用,用于获取介于某两者之间的内容
获得alexa介于[1, 20]直接的行的数据

or表示满足左右两个条件之一即可

2.1.6、order by
用于对输出结果按照某个列的值进行升序(asc)/降序(desc)的排序

2.1.7、limit
限制输出的行数
获取“select * from Websites where alexa between 1 and 20 order by alexa desc”结果的前三行

2.1.8、group by
运用1:统计 access_log 各个 site_id 的访问量:


运用2:多表查询
统计有记录的网站的记录数量

2.1.9、聚合函数
SQL 函数 | 菜鸟教程
2.1.10、ifNull函数
/*以下是leetcode-176第二高的薪水*/
select 
    ifnull(
        (select distinct salary 
        from Employee
        order by salary desc
        limit 1, 1)
        ,
        NULL
    )
    as SecondHighestSalary;
/*利用
 *       select distinct salary 
 *       from Employee
 *       order by salary desc
 *       limit 1, 1
 *求得的结果,进行ifnull(_,_)
 *如果其结果为空,则返回NULL
 *否则,返回第二高的薪水
 *limit 1, 1表示,只显示从第1行(第0行起算)开始,只显示一行*/ 
2.2、基本操作
2.2.1、select
SELECT 语句用于从数据库中选取数据
使用distinct可以保证输出是唯一的,即输出的内容不重复
/*输出部分列
 *distinct保证输出的唯一性*/
SELECT (distinct) column1, column2, ...
FROM table_name;
/*输出全部列*/
SELECT *
FROM table_name; 

2.2.2、insert
插入数据,有默认值的、没有约束“not null”的属性可以不插入其值,但是其它的必须插入相应的值
/*无需指定列名*/
INSERT INTO table_name
VALUES (value1,value2,value3,...);
/*指定列名*/
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...); 

2.2.3、update
更新某些满足条件的行的某些列
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition; 

2.2.4、delete
DELETE FROM table_name
WHERE condition; 

2.2.5、drop
/*撤销索引*/
DROP INDEX [IF EXISTS] index_name
ON TABLE_NAME;
/*撤销表*/
DROP TABLE [IF EXISTS] TABLE_NAME;
/*撤销数据库*/
DROP DATABASE [IF EXISTS] database_name; 
2.2.6、alter
/*添加列*/
ALTER TABLE table_name
ADD column_name datatype
/*修改列的数据类型*/
ALTER TABLE table_name
MODIFY COLUMN column_name datatype
/*删除列*/
ALTER TABLE table_name
DROP COLUMN column_name 
2.3、连接
用来操作的两个基本表:


2.3.1、inner join(jonin)
INNER JOIN 关键字在表中存在至少一个匹配时返回行,返回的是两个表中满足连接条件的交集,即同时存在于两个表中的数据。

2.3.2、left join
LEFT JOIN 关键字从左表返回所有的行,即使右表中没有匹配。如果右表中没有匹配,则结果为 NULL。

2.3.3、right join
RIGHT JOIN 关键字从右表返回所有的行,即使左表中没有匹配。如果左表中没有匹配,则结果为 NULL。

mysql不支持full outer join
2.3.4、合并结果集union
union:UNION 操作符用于合并两个或多个 SELECT 语句的结果集。使用 UNION 时,每个 SELECT 语句必须具有相同数量的列,且对应列的数据类型必须相似。如果要显示重复的行,则使用union all

2.4、复制数据
2.4.1、复制到未创建表
create new_tabel as old_table where conditions:从一个表复制满足一定条件的信息到另一个未创建的表

2.4.2、复制到已存在的表
INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。

无法比较NULL和0,这两者是不等价的
