SQL教程

SQL 是一种与数据库系统协同工作的标准语言,这些数据库系统包括 MS SQL Server、IBM DB2、Oracle、MySQL 和 MS Access 等等。

一、SQL语法
mysql> use RUNOOB;
Database changed
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM Websites;
+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
+----+--------------+---------------------------+-------+---------+
2 rows in set (0.01 sec)
use RUNOOB; 命令用于选择数据库。
set names utf8; 命令用于设置使用的字符集。
SELECT * FROM Websites; 读取数据表的信息。
上面的表包含五条记录(每一条对应一个网站信息)和5个列(id、name、url、alexa 和country)。
一些最重要的 SQL 命令:
SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
二、SQL SELECT语句   从数据库中选取数据,结果被存储在一个结果表中
SELECT column_name,column_name FROM table_name;与SELECT * FROM table_name;
三、SQL SELECT DISTINCT 返回唯一不同的值。(去重)
SELECT DISTINCT country FROM Websites;从 "Websites" 表的 "country" 列中选取唯一不同的值,也就是去掉 "country" 列重复值。
四、SQL where 过滤记录,提取那些满足指定标准的记录(where运算符)
SELECT * FROM Websites WHERE country='CN';从 "Websites" 表中选取国家为 "CN" 的所有网站(SQL 使用单引号来环绕文本值,数值不需要引号;'CN')
逻辑运算符的优先级:()not and or
特殊条件:1.空值判断:is null 2.between and(在 之间的值)
                 3.in Select * from emp where sal in (5000,3000,1500);查询 EMP 表 SAL 列中等于 5000,3000,1500 的值
                 4.like模糊查询:Select * from emp where ename like 'M%';查询 EMP 表中 Ename 列中有 M 的值,M 为要查询内容中的模糊信息。

 %表示多个字值,_下划线表示一个字符;M%模糊查询信息为M开头的;%M%查询包含M的所有内容;%M_查询以M在倒数第二位的所有内容。
不带比较运算符的 WHERE 子句:当 0 时转化为 false,1 转化为 true。
    SELECT studentNO FROM student WHERE 0返回一个空集,因为每一行记录 WHERE 都返回 false
    SELECT studentNO FROM student WHERE 1返回 student表所有行中 studentNO列的值,因为每一行记录 WHERE 都返回 true
五、SQL AND & OR运算符  基于一个以上的条件对记录进行过滤
六、SQL ORDER BY关键字  对结果集进行排序 默认升序,使用DESC关键字可降序
SELECT * FROM Websites ORDER BY alexa DESC;从 "Websites" 表中选取所有网站,并按照 "alexa" 列降序排序
SELECT * FROM Websites ORDER BY country,alexa;从 "Websites" 表中选取所有网站,并按照 "country" 和 "alexa" 列排序
七、SQL INSERT INTO语句用于向表中插入新记录
INSERT INTO 语句可以有两种编写形式:无需指定要插入数据的列名,只需被插入的值(需要列出插入行的每一列数据)

INSERT INTO table_name VALUES (value1,value2,value3,...);需要制定列名及被插入的值INSERT INTO Websites (name, url, alexa, country) VALUES ('百度','https://www.baidu.com/','4','CN');
id自动更新无需插入
insert into select 和select into from 的区别:insert into scorebak select * from socre where neza='neza'插入一行,要求表scorebak 必须存在
select *  into scorebak from score  where neza='neza'  --也是插入一行,要求表scorebak 不存在
八、SQL UPDATE 语句更新表中的数据
UPDATE Websites //表websites中name是菜鸟教程的alexa值更新为5000,country为USA
SET alexa='5000', country='USA' 
WHERE name='菜鸟教程';//省略where会更新所有的alexa,country;无where要慎重更新
//在 MySQL中设置 sql_safe_updates自带的参数,参数开启后(set sql_safe_updates=1),update 语句后必须带 where条件
九、SQL DELETE语句 删除表中的记录
DELETE FROM table_name
WHERE some_column=some_value;//省略where会删除所有的记录(表结构、属性、索引保持不变),慎重!

/SQL高级教程/
一、SQL SELECT TOP, LIMIT, ROWNUM子句  返回的记录的数目
并非所有的数据库系统都支持 SELECT TOP 语句。MySQL支持LIMIT语句来选取,Oracle可以使用 ROWNUM来选取
SQL Server/MS Access语法:SELECT TOP number|percent column_name(s)  FROM table_name;
                                            eg:SELECT TOP 50 PERCENT * FROM Websites;选取前面百分之 50 的记录;
                                                select top 5 * from table order by id desc ---后5行
MySQL 语法:SELECT column_name(s)   FROM table_name   LIMIT number;
Oracle 语法:SELECT column_name(s)   FROM table_name   WHERE ROWNUM <= number;
二、SQL LIKE操作符   在 WHERE子句中搜索列中的指定模式
SELECT * FROM Websites//选取 name 以字母 "k" 结尾的所有客户:
WHERE name LIKE '%k';
SELECT * FROM Websites//选取 name 不包含模式 "oo" 的所有客户
WHERE name NOT LIKE '%oo%';
三、SQL 通配符   通配符与 SQL LIKE 操作符一起使用
%(替代任意个字符)  
_(替代一个字符)   
[charlist]字符列中任一字符   
[^charlist]或[!charlist]不在字符列中的任一字符
使用 SQL [charlist] 通配符:MySQL中使用 REGEXP 或 NOT REGEXP 运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式
        SELECT * FROM Websites
        WHERE name REGEXP '^[GFs]';//选取 name 以 "G"、"F" 或 "s" 开始的所有网站
MySQL 、SQLite 只支持 % 和 _ 通配符,不支持 [^charlist] 或 [!charlist] 通配符
MySQL 和 SQLite 会把 like '[xxx]yyy' 的中括号当成普通字符,而不是通配符,如select * from persons WHERE City LIKE '[b]eijing';查出 city 为 [B]eijing 的行
四、SQL IN操作符     在 WHERE子句中规定多个值
五、SQL BETWEEN 操作符  选取介于两个值之间的数据范围内的值
                NOT BETWEEN 操作符   不介于两个值之间的数据范围内的值
在某些数据库中,BETWEEN选取有的包含前后两个值,有的不会包含前后两个值,有的只包含前面值不包含后面值
六、SQL别名    为表名称或列名称指定别名
1.列的 SQL 别名语法:SELECT column_name AS alias_name     FROM table_name;
如果列名称包含空格,要求使用双引号或方括号
把三个列(url、alexa 和 country)结合在一起,并创建一个名为 "site_info" 的别名:SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info  FROM Websites;
2.表的 SQL 别名语法:SELECT column_name(s)    FROM table_name AS alias_name;
别名使用情况:查询涉及多个表、查询中使用了函数、列名称长 或可读性差、多个列结合在一起
七、SQL连接(JOIN)  把多个表的行结合起来,基于这些表之间的共同字段
左连接与右连接的左右指以两张表中的哪一张为基准
left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
inner join : 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
full join : 外连接,返回两个表中的行:left join + right join。
cross join : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。


实例:
SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;//从两个表中,将id=site_id值相同的行(id,name,count,date)结合起来不同的 SQL JOIN:1.INNER JOIN表中至少一个匹配则返回行;2.    LEFT JOIN右表中无匹配,左表返回所有行;3.RIGHT JOIN左表中无匹配,右表返回所有行;4.FULL JOIN存在匹配,则返回行
SQL INNER JOIN关键字   表中存在至少一个匹配时返回行 ps:INNER JOIN 与 JOIN 是相同的。
在使用 join 时,on 和 where 条件的区别:on条件是在生成临时表时使用的条件,无论on中条件是否为真,都返回左表中记录。
                          where 条件是在临时表生成好后,再对临时表进行过滤的条件。此时无left join含义,条件不为真的就全部过滤掉。
SQL LEFT JOIN关键字    从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
SQL RIGHT JOIN关键字  从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
SQL FULL OUTER JOIN关键字  只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.结合了 LEFT JOIN 和 RIGHT JOIN 的结果。
八、SQL UNION操作符  合并多个SELECT语句的结果
UNION 内部的每个 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型,列的顺序必须相同。(a,v,c对应A,B,C不能是a对应B)
默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。
实例://选取所有的中国、名称(允许有重复的值)
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
九、SQL SELECT INTO语句  从一个表复制数据,然后把数据(表或列)插入到另一个新表中。
MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。也可以通过拷贝表数据及结构实现:CREATE TABLE 新表 AS SELECT * FROM 旧表 
实例:复制多个表中的数据插入新表
SELECT Websites.name, access_log.count, access_log.date
INTO WebsitesBackup2016
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id;
SELECT INTO 
添加促使查询没有数据返回的 WHERE 子句可创建一个新的空表:
SELECT *
INTO newtable
FROM table1
WHERE 1=0;
十、SQL INSERT INTO SELECT语句   从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响
复制表结构及其数据:create table table_name_new as select * form table_name_old
只复制表结构:create table table_name_new as select * from table_name_old where 1=2;或者create table table_name_new like table_name_old
只复制表数据:两个表结构一样insert into table_name_new select * from table_name_old
                            两表结构不一样:insert into table_name_new(column1,column2...) select column1,column2...from table_name_old
十一、SQL CREATE DATABASE语句  用于创建数据库
创建一个名为 "my_db" 的数据库:CREATE DATABASE my_db;
十二、SQL CREATE TABLE 语句   创建数据库中的表
CREATE TABLE table_name
(
column_name1 data_type(size),//列的名称  数据类型(列的最大长度)
column_name2 data_type(size),
column_name3 data_type(size),
....
);
十三、SQL 约束(Constraints) 规定表中的数据规则
如果存在违反约束的数据行为,行为会被约束终止。约束可在创建表时规定( CREATE TABLE 语句),或创建之后规定(ALTER TABLE 语句)。
SQL NOT NULL约束   在默认的情况下,表的列接受 NULL值,NOT NULL约束强制列不接受 NULL值。
SQL UNIQUE约束   唯一标识数据库表中的每条记录。
PRIMARY KEY约束  拥有自动定义的 UNIQUE 约束。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
创建UNIQUE约束:
                MySQL:
                            CREATE TABLE Persons
                            (
                            P_Id int NOT NULL,
                            City varchar(255),
                            UNIQUE (P_Id)
                            )
                SQL Server / Oracle / MS Access:
                            CREATE TABLE Persons
                            (
                            P_Id int NOT NULL UNIQUE,
                            City varchar(255)
                            )
                如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:
                MySQL / SQL Server / Oracle / MS Access:
                            CREATE TABLE Persons
                            (
                            P_Id int NOT NULL,
                            LastName varchar(255) NOT NULL,
                            CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
                            )
ALTER TABLE 时的 SQL UNIQUE 约束:
            MySQL / SQL Server / Oracle / MS Access:ALTER TABLE Persons
                                                                                 ADD UNIQUE (P_Id)
            如需命名 UNIQUE 约束,并定义多个列的 UNIQUE 约束:ALTER TABLE Persons    ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
撤销 UNIQUE 约束:
            MySQL:ALTER TABLE Persons    DROP INDEX uc_PersonID
            SQL Server / Oracle / MS Access:ALTER TABLE Persons    DROP CONSTRAINT uc_PersonID
十四、SQL PRIMARY KEY约束    唯一标识数据库表中的每条记录  每个表只能有一个主键,主键必包含唯一的值,主键列不能包含null值
CREATE TABLE时的SQL PRIMARY KEY约束:
            MySQL:
                        CREATE TABLE Persons
                        (
                        P_Id int NOT NULL,
                        LastName varchar(255) NOT NULL
                        PRIMARY KEY (P_Id)
                        )
            SQL Server / Oracle / MS Access:
                        CREATE TABLE Persons
                        (
                        P_Id int NOT NULL PRIMARY KEY,
                        LastName varchar(255) NOT NULL
                        )
            如需命名 PRIMARY KEY 约束,并定义多个列的 PRIMARY KEY 约束:
                        CREATE TABLE Persons
                        (
                        P_Id int NOT NULL,
                        LastName varchar(255) NOT NULL
                        CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
                        )
ALTER TABLE时的SQL PRIMARY KEY约束:
            MySQL / SQL Server / Oracle / MS Access:ALTER TABLE Persons    ADD PRIMARY KEY (P_Id)
            MySQL / SQL Server / Oracle / MS Access:ALTER TABLE Persons            ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
撤销 PRIMARY KEY 约束:
            MySQL:ALTER TABLE Persons        DROP PRIMARY KEY
            SQL Server / Oracle / MS Access:ALTER TABLE Persons        DROP CONSTRAINT pk_PersonID
十五、SQL FOREIGN KEY约束    一个表中的 FOREIGN KEY指向另一个表中的 UNIQUE KEY(唯一约束的键)。
FOREIGN KEY 约束用于预防破坏表之间连接的行为。
FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
            CREATE TABLE时的SQL FOREIGN KEY约束:
                    MySQL:
                                CREATE TABLE Orders
                                (
                                O_Id int NOT NULL,
                                OrderNo int NOT NULL,
                                P_Id int,
                                PRIMARY KEY (O_Id),
                                FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
                                )
                    SQL Server / Oracle / MS Access:
                                CREATE TABLE Orders
                                (
                                O_Id int NOT NULL PRIMARY KEY,
                                OrderNo int NOT NULL,
                                P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
                                )
                    如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:
                            CREATE TABLE Orders
                            (
                            O_Id int NOT NULL,
                            OrderNo int NOT NULL,
                            P_Id int,
                            PRIMARY KEY (O_Id),
                            CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
                            REFERENCES Persons(P_Id)
                            )
ALTER TABLE 时的 SQL FOREIGN KEY 约束:
                    MySQL / SQL Server / Oracle / MS Access:ALTER TABLE Orders
                                                                                                     ADD FOREIGN KEY (P_Id)
                                                                                                     REFERENCES Persons(P_Id)
                    如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束:
                                                                                                     ALTER TABLE Orders
                                                                                                     ADD CONSTRAINT fk_PerOrders
                                                                                                     FOREIGN KEY (P_Id)
                                                                                                     REFERENCES Persons(P_Id)
撤销 FOREIGN KEY 约束:
                    MySQL:ALTER TABLE Orders        DROP FOREIGN KEY fk_PerOrders
                    SQL Server / Oracle / MS Access:ALTER TABLE Orders        DROP CONSTRAINT fk_PerOrders
十六、SQL CHECK约束        限制列中的值的范围
对单个列定义 CHECK 约束,该列只允许特定的值;对一个表定义 CHECK 约束,此约束会基于行中其他列的值在特定的列中对值进行限制。
CREATE TABLE时的 SQL CHECK约束:
                    MySQL:
                            CREATE TABLE Persons
                            (
                            P_Id int NOT NULL,
                            City varchar(255),
                            CHECK (P_Id>0)
                            )
                    SQL Server / Oracle / MS Access:
                            CREATE TABLE Persons
                            (
                            P_Id int NOT NULL CHECK (P_Id>0),
                            City varchar(255)
                            )
                    如需命名 CHECK 约束,并定义多个列的 CHECK 约束:
                            CREATE TABLE Persons
                            (
                            P_Id int NOT NULL,
                            City varchar(255),
                            CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
                            )
ALTER TABLE 时的 SQL CHECK 约束:
                    MySQL / SQL Server / Oracle / MS Access:ALTER TABLE Persons            ADD CHECK (P_Id>0)
                    如需命名 CHECK 约束,并定义多个列的 CHECK 约束:ALTER TABLE Persons        ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes')
撤销 CHECK 约束:
                    SQL Server / Oracle / MS Access:ALTER TABLE Persons        DROP CONSTRAINT chk_Person
                    MySQL:ALTER TABLE Persons            DROP CHECK chk_Person
十七、SQL DEFAULT约束        向列中插入默认值
CREATE TABLE时的 SQL DEFAULT约束:
            CREATE TABLE Persons
            (
                P_Id int NOT NULL,
                City varchar(255) DEFAULT 'Sandnes'
            )
ALTER TABLE 时的 SQL DEFAULT 约束:
        MySQL:ALTER TABLE Persons        ALTER City SET DEFAULT 'SANDNES'
        SQL Server / MS Access:ALTER TABLE Persons        ADD CONSTRAINT ab_c DEFAULT 'SANDNES' for City
        Oracle:ALTER TABLE Persons        MODIFY City DEFAULT 'SANDNES'
撤销 DEFAULT 约束:
        MySQL:ALTER TABLE Persons        ALTER City DROP DEFAULT
        SQL Server / Oracle / MS Access:ALTER TABLE Persons        ALTER COLUMN City DROP DEFAULT
十八、SQL CREATE INDEX 语句        在表中创建索引
为了省时,仅仅在常常被搜索的列(以及表)上面创建索引;用于创建索引的语法在不同的数据库中不一样,所以检查您的数据库中创建索引的语法。
实例:在 "Persons" 表的 "LastName" 列上创建一个名为 "PIndex" 的索引:
        CREATE INDEX PIndex        ON Persons (LastName)  //如果在表上创建一个唯一的索引CREATE UNIQUE INDEX PIndex
        索引不止一个列时用逗号隔开:CREATE INDEX PIndex        ON Persons (LastName, FirstName)
十九、SQL 撤销索引、撤销表以及撤销数据库
        drop语句 删除索引、表和数据库
        DROP INDEX语句  删除表中的索引:
                    MS SQL Server:DROP INDEX table_name.index_name
                    MySQL:ALTER TABLE table_name DROP INDEX index_name
                    DB2/Oracle:DROP INDEX index_name
                    MS Access:DROP INDEX index_name ON table_name
        DROP TABLE语句        删除表
                    DROP DATABASE database_name
        RUNCATE TABLE语句        删除表内的数据,但并不删除表本身
                    TRUNCATE TABLE table_name
二十、SQL ALTER TABLE语句        在已有的表中添加、删除或修改列
        表中添加列:ALTER TABLE table_name        ADD column_name datatype
        删除表中的列(有的数据库不允许这么操作):ALTER TABLE table_name        DROP COLUMN column_name
        改变表中列的数据类型:
                    SQL Server / MS Access:ALTER TABLE table_name        ALTER COLUMN column_name datatype
                    My SQL / Oracle:ALTER TABLE table_name        MODIFY COLUMN column_name datatype//Oracle 10G之后版本可以不写COLUMN
二十一、SQL AUTO INCREMENT字段        在新纪录插入表中时生成一个唯一的数字
        MySQL:CREATE TABLE Persons
                    (//把 "Persons" 表中的 "ID" 列定义为 auto-increment 主键字段
                    ID int NOT NULL AUTO_INCREMENT,
                    LastName varchar(255) NOT NULL,
                    PRIMARY KEY (ID)
                    )
                MySQL 使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务;默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1;
                设置AUTO_INCREMENT的初始值:ALTER TABLE Persons AUTO_INCREMENT=100
        SQL Server:CREATE TABLE Persons
                            (//把 "Persons" 表中的 "ID" 列定义为 auto-increment 主键字段
                            ID int IDENTITY(1,1) PRIMARY KEY,
                            LastName varchar(255) NOT NULL
                            )
                    MS SQL Server 使用 IDENTITY 关键字来执行 auto-increment 任务;IDENTITY 的开始值是 1,每条新记录递增 1;
                    要规定 "ID" 列以 10 起始且递增 5,请把 identity 改为 IDENTITY(10,5)
        Access:CREATE TABLE Persons
                    (
                    ID Integer PRIMARY KEY AUTOINCREMENT,
                    LastName varchar(255) NOT NULL
                    )    
                MS Access 使用 AUTOINCREMENT 关键字来执行 auto-increment 任务;默认地,AUTOINCREMENT 的开始值是 1,每条新记录递增 1;
                要规定 "ID" 列以 10 起始且递增 5,请把 autoincrement 改为 AUTOINCREMENT(10,5)
        Oracle:通过 sequence 对象(该对象生成数字序列)创建 auto-increment 字段
                        创建一个名为 seq_person 的 sequence 对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能:
                                    CREATE SEQUENCE seq_person
                                    MINVALUE 1
                                    START WITH 1
                                    INCREMENT BY 1
                                    CACHE 10
                    在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):
                                    INSERT INTO Persons (ID,FirstName,LastName)
                                    VALUES (seq_person.nextval,'Lars','Monsen')
二十二、SQL 视图(Views) 基于sql语句结果集的可视化的表

视图总是显示最新的数据,当查询视图时数据库引擎通过使用视图的 SQL 语句重建数据。
创建视图:SQL CREATE VIEW
SQL 更新视图:SQL CREATE OR REPLACE VIEW 语法
sql server:ALTER VIEW [ schema_name . ] view_name [ ( column [ ,...n ] ) ]  
                    schema_name: 视图所属架构的名称;view_name: 要更改的视图;column: 将成为指定视图的一部分的一个或多个列的名称(以逗号分隔)
撤销视图:DROP VIEW view_name
二十三、SQL Date函数        日期函数 
MySQL Date 函数:
    NOW()    返回当前的日期和时间
    CURDATE()    返回当前的日期
    DATE()    提取日期或日期/时间表达式的日期部分
    EXTRACT()    返回日期/时间的单独部分
    DATE_ADD()    向日期添加指定的时间间隔
    DATE_SUB()    从日期减去指定的时间间隔
    DATEDIFF()    返回两个日期之间的天数
    DATE_FORMAT()    用不同的格式显示日期/时间
SQL Server Date 函数:
    GETDATE()    返回当前的日期和时间
    DATEPART()    返回日期/时间的单独部分
    DATEADD()    在日期中添加或减去指定的时间间隔
    DATEDIFF()    返回两个日期之间的时间
    CONVERT()    用不同的格式显示日期/时间
SQL Date 数据类型
MySQL 数据类型:
    DATE - 格式:YYYY-MM-DD
    DATETIME - 格式:YYYY-MM-DD HH:MM:SS
    TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
    YEAR - 格式:YYYY 或 YY
SQL SERVER数据类型:
    DATE - 格式:YYYY-MM-DD
    DATETIME - 格式:YYYY-MM-DD HH:MM:SS
    SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
    TIMESTAMP - 格式:唯一的数字
二十四、SQL NULL值        遗漏的未知数据
无法使用比较运算符来测试 NULL 值,比如 =、< 或 <>。必须使用 IS NULL 和 IS NOT NULL 操作符
实例:SELECT LastName,FirstName,Address FROM Persons   WHERE Address IS NULL//查询有空值的列
SELECT LastName,FirstName,Address FROM Persons        WHERE Address IS NOT NULL//查询不带有null的列
二十五、SQL NULL 函数            ISNULL()、NVL()、IFNULL() 和 COALESCE() 函数
实例,如果 "UnitsOnOrder" 是 NULL则 ISNULL() 返回 0:
SQL Server / MS Access:SELECT ProductName,UnitPrice*(UnitsInStock+ISNULL(UnitsOnOrder,0))        FROM Products
Oracle:SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))        FROM Products
MySQL:SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))        FROM Products 或者
            SELECT ProductName,UnitPrice*(UnitsInStock+COALESCE(UnitsOnOrder,0))        FROM Products
二十六、SQL 通用数据类型        定义列中存放的值的种类
二十七、SQL 用于各种数据库的数据类型


//SQL 函数
一、sql函数
SQL Aggregate 函数        计算从列中取得的值,返回一个单一的值
    AVG() - 返回平均值                COUNT() - 返回行数
    FIRST() - 返回第一个记录的值                LAST() - 返回最后一个记录的值
    MAX() - 返回最大值        MIN() - 返回最小值        SUM() - 返回总和
SQL Scalar 函数        基于输入值,返回一个单一的值
    UCASE() - 将某个字段转换为大写            LCASE() - 将某个字段转换为小写
    MID() - 从某个文本字段提取字符,MySql 中使用
    SubString(字段,1,end) - 从某个文本字段提取字符
    LEN() - 返回某个文本字段的长度            ROUND() - 对某个数值字段进行指定小数位数的四舍五入
    NOW() - 返回当前的系统日期和时间            FORMAT() - 格式化某个字段的显示方式
二、SQL AVG() 函数        返回数值列的平均值
SELECT AVG(column_name) FROM table_name
三、SQL COUNT() 函数        返回匹配指定条件的行数
返回指定列的值的数目(NULL 不计入):SELECT COUNT(column_name) FROM table_name;
COUNT(*) 函数返回表中的记录数:SELECT COUNT(*) FROM table_name;
COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:SELECT COUNT(DISTINCT column_name) FROM table_name;//适用于ORACLE和Microsoft SQL Server,无法用于 Microsoft Access。
四、SQL FIRST() 函数        返回指定的列中第一个记录的值
SELECT FIRST(column_name) FROM table_name;//只有 MS Access 支持 FIRST() 函数
SQL Server:SELECT TOP 1 column_name FROM table_name        ORDER BY column_name ASC;
MySQL:SELECT column_name FROM table_name        ORDER BY column_name ASC        LIMIT 1;
Oracle:SELECT column_name FROM table_name        ORDER BY column_name ASC        WHERE ROWNUM <=1;
LAST() 函数        回指定的列中最后一个记录的值
SELECT LAST(column_name) FROM table_name;//只有 MS Access 支持 LAST() 函数
SQL Server:SELECT TOP 1 column_name FROM table_name        ORDER BY column_name DESC;
MySQL:SELECT column_name FROM table_name        ORDER BY column_name DESC        LIMIT 1;
Oracle:SELECT column_name FROM table_name        ORDER BY column_name DESC        WHERE ROWNUM <=1;
五、MAX() 函数        返回指定列的最大值
SELECT MAX(column_name) FROM table_name;
MIN() 函数        返回指定列的最小值
SELECT MMIN(column_name) FROM table_name;
SUM() 函数        返回数值列的总数
SELECT SUM(column_name) FROM table_name;
六、SQL GROUP BY语句        用于结合聚合函数,根据一个或多个列对结果集进行分组
实例,统计 access_log 各个 site_id 的访问量:
SELECT site_id, SUM(access_log.count) AS nums        FROM access_log GROUP BY site_id;
SQL GROUP BY 多表连接:
SELECT Websites.name,COUNT(access_log.aid) AS nums FROM access_log//选取 name,num(相同aid的数量)
LEFT JOIN Websites//以表access_log为主(left)
ON access_log.site_id=Websites.id//(id相等的)
GROUP BY Websites.name;
七、SQL HAVING 子句        WHERE 关键字无法与聚合函数一起使用,HAVING 子句可以让我们筛选分组后的各组数据
实例,查找总访问量大于 200 的网站,并且 alexa 排名小于 200:
SELECT Websites.name, SUM(access_log.count) AS nums FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id
WHERE Websites.alexa < 200 
GROUP BY Websites.name
HAVING SUM(access_log.count) > 200;
八、SQL UCASE() 函数        把字段的值转换为大写
实例,从 "Websites" 表中选取 "name" 和 "url" 列,并把 "name" 列的值转换为大写:
SELECT UCASE(name) AS site_title, url        FROM Websites;
SQL LCASE() 函数        把字段的值转换为小写
实例,从 "Websites" 表中选取 "name" 和 "url" 列,并把 "name" 列的值转换为小写:
SELECT LCASE(name) AS site_title, url        FROM Websites;
九、SQL MID() 函数        从文本字段中提取字符
SELECT MID(column_name,start[,length]) FROM table_name;//要提取的字符字段(必需),开始位置(默认1,必需),返回的字符数(可选,不写返回剩余文本)
实例,从 "Websites" 表的 "name" 列中提取前 4 个字符:SELECT MID(name,1,4) AS ShortTitle        FROM Websites;
Oracle 中没有 MID 函数,有 substr 函数:SELECT substr(name,1,4) AS ShortTitle        FROM Websites;
十、SQL LEN() 函数        返回文本字段中值的长度
SELECT LEN(column_name) FROM table_name;
MySQL:SELECT LENGTH(column_name) FROM table_name;
十一、SQL ROUND() 函数        把数值字段舍入为指定的小数位数
SELECT ROUND(column_name,decimals) FROM table_name;//要舍入的字段,要返回的小数位数
实例,mysql>select ROUND(-1.23);-> -1        mysql> select ROUND(1.298, 1);-> 1.3
十二、SQL NOW() 函数        返回当前系统的日期和时间
SELECT NOW() FROM table_name;
十三、SQL FORMAT() 函数        对字段的显示进行格式化
SELECT FORMAT(column_name,format) FROM table_name;//要格式的字段,规定格式

十四、SQL 快速参考

十五、SQL 主机
最常见的 SQL 主机数据库是 MySQL、MS SQL Server 和 MS Access。
操作系统上对应运行的数据库系统:
    MS SQL Server在 Windows 和 Linux 操作系统上运行。
    MySQL在 Windows, Mac OS X 和 Linux/UNIX 操作系统上运行。
    MS Access(只建议用于小型网站)只在 Windows OS 上运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值