sql学习

字符串用单引号引用,数值字段不需要使用引号。

select 查询

​ select * from Student;

select distinct

去掉重复值,用于返回唯一不同的值。

​ select distinct country from Student;

select where

提取满足特殊条件的语句

​ SELECT * FROM Websites WHERE country=‘CHINA’;

运算符描述
=等于
<>不等于。**注释:**在 SQL 的一些版本中,该操作符可被写成 !=
>大于
<小于
>=大于等于
<=小于等于
BETWEEN在某个范围内
LIKE搜索某种模式
IN指定针对某个列的多个可能值

1.空值判断: is null

​ select * from Student where score = null;

2.between and (在…之间的值)

select * from Student where score between 60 and 100;

3.In

select * from Student where score in (100,99,98);

4.like(模糊查询)

  • % 表示多个字值,_ 下划线表示一个字符;

  • M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。

  • %M% : 表示查询包含M的所有内容。

  • %M_ : 表示查询以M在倒数第二位的所有内容。

    select * from Student where name like ‘黄%’;

WHERE 子句并不一定带比较运算符,当不带运算符时,会执行一个隐式转换。当 0 时转化为 false,1 转化为 true。例如:

SELECT studentNO FROM student WHERE 0

则会返回一个空集,因为每一行记录 WHERE 都返回 false。

SELECT  studentNO  FROM student WHERE 1

返回 student 表所有行中 studentNO 列的值。因为每一行记录 WHERE 都返回 true。

AND & OR

如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。

如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。

​ select * from Student where name = ‘黄明明’ and score >90;

ORDER BY

对结果集进行排序。

​ select * from Student order by score;

​ select * from Student order by score,age;

ORDER BY 多列的时候,先按照第一个column name排序,在按照第二个column name排序;

order by A,B 这个时候都是默认按升序排列

order by A desc,B 这个时候 A 降序,B 升序排列

order by A ,B desc 这个时候 A 升序,B 降序排列

LIMIT 和 OFFSET 用法

当 LIMIT 后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量。

当 LIMIT 后面跟一个参数的时候,该参数表示要取的数据的数量。MySQL 里分页一般用 LIMIT 来实现。

当 LIMIT 和 OFFSET 组合使用的时候,LIMIT 后面只能有一个参数,表示要取的的数量,OFFSET表示要跳过的数量 。

select* from article LIMIT 1,3
与
select * from article LIMIT 3 OFFSET 1

上面两种写法都表示取 2、3、4 三条条数据:

select* from article LIMIT 1,3 就是跳过 1 条数据,从第 2 条数据开始取,取 3 条数据,也就是取 2、3、4 三条数据。

例如 select* from article LIMIT 3 表示直接取前三条数据,类似 sqlserver 里的 top 语法。

例如 select * from article LIMIT 3 OFFSET 1 表示跳过 1 条数据,从第 2 条数据开始取,取3条数据,也就是取 2、3、4 三条数据。

INSERT INTO

INSERT INTO 语句用于向表中插入新记录。

有两种编写方式:

第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:

INSERT INTO table_name
VALUES (value1,value2,value3,…);

第二种形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,…)
VALUES (value1,value2,value3,…);

例如:INSERT INTO Websites (name, url, alexa, country) VALUES (‘百度’,‘https://www.baidu.com/’,‘4’,‘CN’);

也可写成:INSERT INTO Websites VALUES (‘百度’,‘https://www.baidu.com/’,‘4’,‘CN’);

没有指定要插入数据的列名的形式需要列出插入行的每一列数据:

UPDATE

UPDATE 语句用于更新表中已存在的记录。

UPDATE Websites SET alexa=‘5000’, country=‘USA’ WHERE name=‘菜鸟教程’;

DELETE

DELETE FROM Websites WHERE name=‘Facebook’ AND country=‘USA’;

truncate table 命令将快速删除数据表中的所有记录,但保留数据表结构。这种快速删除与 delete from 数据表的删除全部数据表记录不一样,delete 命令删除的数据将存储在系统回滚段中,需要的时候,数据可以回滚恢复,而 truncate 命令删除的数据是不可以恢复的。

相同点

truncate 和不带 where 子句的 delete, 以及 drop 都会删除表内的数据。

不同点:

\1. truncate 和 delete 只删除数据不删除表的结构(定义) ,drop 语句将删除表的结构被依赖的约束(constrain), 触发器(trigger), 索引(index); 依赖于该表的存储过程/函数将保留, 但是变为 invalid 状态。

2.delete 语句是 dml, 这个操作会放到 rollback segement 中, 事务提交之后才生效; 如果有相应的 trigger, 执行的时候将被触发。 truncate, drop 是 ddl, 操作立即生效, 原数据不放到 rollback segment 中, 不能回滚。 操作不触发 trigger。

3.delete 语句不影响表所占用的 extent, 高水线(high watermark)保持原位置不动。 显然 drop 语句将表所占用的空间全部释放 。 truncate 语句缺省情况下见空间释放到 minextents 个 extent, 除非使用 reuse storage; truncate会将高水线复位(回到最开始)。

4.速度:一般来说: drop > truncate > delete 。

5.安全性: 小心使用 drop 和 truncate, 尤其没有备份的时候。否则哭都来不及。

使用上, 想删除部分数据行用 delete, 注意带上 where 子句。 回滚段要足够大。

想删除表, 当然用 drop。

想保留表而将所有数据删除。如果和事务无关, 用 truncate 即可。 如果和事务有关, 或者想触发 trigger, 还是用 delete。

如果是整理表内部的碎片, 可以用 truncate 跟上 reuse stroage, 再重新导入/插入数据。

mysql 中可以通过参数 sql_safe_updates 来限制 update/delete,防止全表更新或删除。

以下 3 种情况在采用此参数的情况下都不能正常进行操作:

  • 1: 没有加where条件的全表更新操作;
  • 2: 加了 where 条件字段,但是 where 字段没有走索引的表更新;
  • 3: 全表 delete 没有加 where 条件或者 where 条件没有走索引。

SELECT TOP, LIMIT, ROWNUM

SELECT TOP 子句用于规定要返回的记录的数目。

从 “Websites” 表中选取头两条记录:SELECT * FROM Websites LIMIT 2;

从 websites 表中选取前面百分之 50 的记录:SELECT TOP 50 PERCENT * FROM Websites;

LIKE

选取 name 以字母 “G” 开始的所有客户:SELECT * FROM Websites WHERE name LIKE ‘G%’;

选取 name 以字母 “k” 结尾的所有客户:SELECT * FROM Websites WHERE name LIKE ‘%k’;

选取 name 包含模式 “oo” 的所有客户:SELECT * FROM Websites WHERE name LIKE ‘%oo%’;

选取 name 不包含模式 “oo” 的所有客户:SELECT * FROM Websites WHERE name NOT LIKE ‘%oo%’;

SQL 通配符

在 SQL 中,通配符与 SQL LIKE 操作符一起使用。

SQL 通配符用于搜索表中的数据。

在 SQL 中,可使用以下通配符:

通配符描述
%替代 0 个或多个字符
_替代一个字符
[charlist]字符列中的任何单一字符
[^charlist] 或 [!charlist]不在字符列中的任何单一字符

选取 name 以一个任意字符开始,然后是 “oogle” 的所有客户:SELECT * FROM Websites WHERE name LIKE ‘_oogle’;

选取 name 以 “G” 开始,然后是一个任意字符,然后是 “o”,然后是一个任意字符,然后是 “le” 的所有网站:

SELECT * FROM Websites WHERE name LIKE ‘G_o_le’;

选取 name 以 “G”、“F” 或 “s” 开始的所有网站:SELECT * FROM Websites WHERE name REGEXP ‘1’;

选取 name 以 A 到 H 字母开头的网站:SELECT * FROM Websites WHERE name REGEXP ‘2’;

选取 name 不以 A 到 H 字母开头的网站:SELECT * FROM WebsitesWHERE name REGEXP ‘3’;

IN

IN 操作符允许您在 WHERE 子句中规定多个值。

选取 name 为 “Google” 或 “菜鸟教程” 的所有网站:SELECT * FROM Websites WHERE name IN (‘Google’,‘菜鸟教程’);

BETWEEN

BETWEEN 操作符用于选取介于两个值之间的数据范围内的值。

**选取 alexa 介于 1 和 20 之间的所有网站:**select * from websites where alexa between 1 and 20.

NOT BETWEEN:select * from websites where alexa not between 1 and 20.

选取 alexa 介于 1 和 20 之间但 country 不为 USA 和 IND 的所有网站:

select * from websites where (alexa between 1 and 20) and country not in (‘USA’,‘IND’);

选取 name 以介于 ‘A’ 和 ‘H’ 之间字母开始的所有网站:

select * from websites where name between ‘A’ and ‘H’;

选取 name 不介于 ‘A’ 和 ‘H’ 之间字母开始的所有网站:

select * from websites where name not between ‘A’ and ‘H’;

选取 date 介于 ‘2016-05-10’ 和 ‘2016-05-14’ 之间的所有访问记录:

select * from access_log where date between ‘2016-05-10’ and ‘2016-05-14’;

请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!

在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。

在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段。

在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。

别名

通过使用 SQL,可以为表名称或列名称指定别名。

下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。

**提示:**如果列名称包含空格,要求使用双引号或方括号:

SELECT name AS n, country AS c FROM Websites;

把三个列(url、alexa 和 country)结合在一起,并创建一个名为 “site_info” 的别名:

SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info FROM Websites;

使用 “Websites” 和 “access_log” 表,并分别为它们指定表别名 “w” 和 “a”(通过使用别名让 SQL 更简短):

SELECT w.name, w.url, a.count, a.date FROM Websites AS w, access_log AS a WHERE a.site_id=w.id and w.name=“菜鸟教程”;

在下面的情况下,使用别名很有用:

  • 在查询中涉及超过一个表
  • 在查询中使用了函数
  • 列名称很长或者可读性差
  • 需要把两个列或者多个列结合在一起

连接(JOIN)

JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。

最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN)。 SQL INNER JOIN 从多个表中返回满足 JOIN 条件的所有行。

不同的 SQL JOIN

在我们继续讲解实例之前,我们先列出您可以使用的不同的 SQL JOIN 类型:

  • INNER JOIN:如果表中有至少一个匹配,则返回行
  • LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
  • FULL 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;

INNER JOIN

在表中存在至少一个匹配时返回行。

返回所有网站的访问记录:

select websites.name,access_log.count,access_log.date from websites inner join access_log

on websites.id = access_log.site_id order by access_log.count;

LEFT JOIN

从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。

SELECT Websites.name, access_log.count, access_log.date FROM Websites LEFT JOIN access_log

ON Websites.id=access_log.site_id ORDER BY access_log.count DESC;

当前操作把Websites当做坐表,会保留左表中的全部数据,右表中如果没有匹配值则返回NULL。

RIGHT JOIN

从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。

SELECT websites.name, access_log.count, access_log.date FROM websites RIGHT JOIN access_log

ON access_log.site_id=websites.id ORDER BY access_log.count DESC;

FULL OUTER JOIN

FULL OUTER JOIN 关键字只要左表(table1)和右表(table2)其中一个表中存在匹配,则返回行.

FULL OUTER JOIN 关键字结合了 LEFT JOIN 和 RIGHT JOIN 的结果。

A inner join B 取交集。

A left join B 取 A 全部,B 没有对应的值为 null。

A right join B 取 B 全部 A 没有对应的值为 null。

A full outer join B 取并集,彼此没有对应的值为 null。

对应条件在 on 后面填写。

UNION

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

使用UNION命令时需要注意,只能在最后使用一个ORDER BY命令,是将两个查询结果合在一起之后,再进行排序!绝对不能写两个ORDER BY命令。

SELECT INTO

从一个表复制数据,然后把数据插入到另一个新表中。

CREATE TABLE 新表 AS SELECT * FROM 旧表

创建 Websites 的备份复件:

SELECT * INTO WebsitesBackup2016 FROM Websites;

INSERT INTO SELECT

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

select into from 和 insert into select 都是用来复制表

两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。

CREATE DATABASE

用于创建数据库。

CREATE DATABASE dbname;

CREATE TABLE

用于创建数据库中的表。

CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),

);

例子:CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

约束(Constraints)

SQL 约束用于规定表中的数据规则。

如果存在违反约束的数据行为,行为会被约束终止。

约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。

NOT NULL

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

UNIQUE

UNIQUE 约束唯一标识数据库表中的每条记录。

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。

请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。

PRIMARY KEY

唯一标识数据库表中的每条记录。

create table student(

​ id int not null,

​ name varchar(255) not null,

​ age int,

​ info varchar(255),

​ city varchar(255),

​ primary key (id)

)

ALTER TABLE 时的 SQL PRIMARY KEY 约束

alter table student

add primary key (id);

撤销 PRIMARY KEY 约束

alter table student

drop primary key;

FOREIGN KEY

一个表中的 FOREIGN KEY 指向另一个表中的 UNIQUE KEY(唯一约束的键)。

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

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

CHECK

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

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

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

CREATE TABLE Persons
(
P_Id int NOT NULL,
CHECK (P_Id>0)
)

DEFAULT

DEFAULT 约束用于向列中插入默认值。

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

当表已被创建时,如需在 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons ALTER City SET DEFAULT ‘SANDNES’

撤销 DEFAULT 约束:

如需撤销 DEFAULT 约束,请使用下面的 SQL:

ALTER TABLE Persons ALTER City DROP DEFAULT

CREATE INDEX

CREATE INDEX 语句用于在表中创建索引。

在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

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

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

CREATE INDEX index_name ON table_name (column_name)

DROP

DROP INDEX 语句

DROP INDEX 语句用于删除表中的索引。

DROP INDEX index_name ON table_name

DROP TABLE 语句

DROP TABLE 语句用于删除表。

DROP TABLE table_name

DROP DATABASE 语句

DROP DATABASE 语句用于删除数据库。

DROP DATABASE database_name

TRUNCATE TABLE 语句

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

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

AUTO INCREMENT

Auto-increment 会在新记录插入表中时生成一个唯一的数字。

我们通常希望在每次插入新记录时,自动地创建主键字段的值。

我们可以在表中创建一个 auto-increment 字段。

视图(Views)

视图是可视化的表。

视图的作用:

1、视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结构及其之间的关系。

2、视图提供了一个统一访问数据的接口。(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)

3、从而加强了安全性,使用户只能看到视图所显示的数据。

4、视图还可以被嵌套,一个视图中可以嵌套另一个视图。

CREATE VIEW

在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。

您可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,也可以呈现数据,就像这些数据来自于某个单一的表一样。

CREATE VIEW 语法

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

**注释:**视图总是显示最新的数据!每当用户查询视图时,数据库引擎通过使用视图的 SQL 语句重建数据。

视图 “Current Product List” 会从 “Products” 表列出所有正在使用的产品(未停产的产品)。这个视图使用下面的 SQL 创建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

查询视图:

SELECT * FROM [Current Product List]

Northwind 样本数据库的另一个视图会选取 “Products” 表中所有单位价格高于平均单位价格的产品:

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products)

更新视图

SQL CREATE OR REPLACE VIEW 语法

CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

例如:

CREATE VIEW [Current Product List] AS SELECT ProductID,ProductName,Category FROM Products WHERE Discontinued=No

撤销视图

DROP VIEW view_name

Date

Date 函数

下面的表格列出了 MySQL 中最重要的内建日期函数:

函数描述
NOW()返回当前的日期和时间
CURDATE()返回当前的日期
CURTIME()返回当前的时间
DATE()提取日期或日期/时间表达式的日期部分
EXTRACT()返回日期/时间的单独部分
DATE_ADD()向日期添加指定的时间间隔
DATE_SUB()从日期减去指定的时间间隔
DATEDIFF()返回两个日期之间的天数
DATE_FORMAT()用不同的格式显示日期/时间

NULL值

如果表中的某个列是可选的,那么我们可以在不向该列添加值的情况下插入新记录或更新已有的记录。这意味着该字段将以 NULL 值保存。

NULL 值的处理方式与其他值不同。

NULL 用作未知的或不适用的值的占位符。

Note**注释:**无法比较 NULL 和 0;它们是不等价的。

NULL 函数

微软的 ISNULL() 函数用于规定如何处理 NULL 值。

NVL()、IFNULL() 和 COALESCE() 函数也可以达到相同的结果。

通用数据类型

数据类型描述
CHARACTER(n)字符/字符串。固定长度 n。
VARCHAR(n) 或 CHARACTER VARYING(n)字符/字符串。可变长度。最大长度 n。
BINARY(n)二进制串。固定长度 n。
BOOLEAN存储 TRUE 或 FALSE 值
VARBINARY(n) 或 BINARY VARYING(n)二进制串。可变长度。最大长度 n。
INTEGER§整数值(没有小数点)。精度 p。
SMALLINT整数值(没有小数点)。精度 5。
INTEGER整数值(没有小数点)。精度 10。
BIGINT整数值(没有小数点)。精度 19。
DECIMAL(p,s)精确数值,精度 p,小数点后位数 s。例如:decimal(5,2) 是一个小数点前有 3 位数,小数点后有 2 位数的数字。
NUMERIC(p,s)精确数值,精度 p,小数点后位数 s。(与 DECIMAL 相同)
FLOAT§近似数值,尾数精度 p。一个采用以 10 为基数的指数计数法的浮点数。该类型的 size 参数由一个指定最小精度的单一数字组成。
REAL近似数值,尾数精度 7。
FLOAT近似数值,尾数精度 16。
DOUBLE PRECISION近似数值,尾数精度 16。
DATE存储年、月、日的值。
TIME存储小时、分、秒的值。
TIMESTAMP存储年、月、日、小时、分、秒的值。
INTERVAL由一些整数字段组成,代表一段时间,取决于区间的类型。
ARRAY元素的固定长度的有序集合
MULTISET元素的可变长度的无序集合
XML存储 XML 数据

用于各种数据库的数据类型

MySQL 数据类型

在 MySQL 中,有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。

数据类型描述
CHAR(size)保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。
VARCHAR(size)保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。**注释:**如果值的长度大于 255,则被转换为 TEXT 类型。
TINYTEXT存放最大长度为 255 个字符的字符串。
TEXT存放最大长度为 65,535 个字符的字符串。
BLOB用于 BLOBs(Binary Large OBjects)。存放最多 65,535 字节的数据。
MEDIUMTEXT存放最大长度为 16,777,215 个字符的字符串。
MEDIUMBLOB用于 BLOBs(Binary Large OBjects)。存放最多 16,777,215 字节的数据。
LONGTEXT存放最大长度为 4,294,967,295 个字符的字符串。
LONGBLOB用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。
ENUM(x,y,z,etc.)允许您输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。**注释:**这些值是按照您输入的顺序排序的。可以按照此格式输入可能的值: ENUM(‘X’,‘Y’,‘Z’)
SET与 ENUM 类似,不同的是,SET 最多只能包含 64 个列表项且 SET 可存储一个以上的选择。

Number 类型:

数据类型描述
TINYINT(size)带符号-128到127 ,无符号0到255。
SMALLINT(size)带符号范围-32768到32767,无符号0到65535, size 默认为 6。
MEDIUMINT(size)带符号范围-8388608到8388607,无符号的范围是0到16777215。 size 默认为9
INT(size)带符号范围-2147483648到2147483647,无符号的范围是0到4294967295。 size 默认为 11
BIGINT(size)带符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。size 默认为 20
FLOAT(size,d)带有浮动小数点的小数字。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。
DOUBLE(size,d)带有浮动小数点的大数字。在 size 参数中规显示定最大位数。在 d 参数中规定小数点右侧的最大位数。
DECIMAL(size,d)作为字符串存储的 DOUBLE 类型,允许固定的小数点。在 size 参数中规定显示最大位数。在 d 参数中规定小数点右侧的最大位数。

以上的 size 代表的并不是存储在数据库中的具体的长度,如 int(4) 并不是只能存储4个长度的数字。

实际上int(size)所占多少存储空间并无任何关系。int(3)、int(4)、int(8) 在磁盘上都是占用 4 btyes 的存储空间。就是在显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。

int的值为10 (指定zerofill)

int(9)显示结果为000000010
int(3)显示结果为010

Date 类型:

数据类型描述
DATE()日期。格式:YYYY-MM-DD**注释:**支持的范围是从 ‘1000-01-01’ 到 ‘9999-12-31’
DATETIME()*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS**注释:**支持的范围是从 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’
TIMESTAMP()*时间戳。TIMESTAMP 值使用 Unix 纪元(‘1970-01-01 00:00:00’ UTC) 至今的秒数来存储。格式:YYYY-MM-DD HH:MM:SS**注释:**支持的范围是从 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-09 03:14:07’ UTC
TIME()时间。格式:HH:MM:SS**注释:**支持的范围是从 ‘-838:59:59’ 到 ‘838:59:59’
YEAR()2 位或 4 位格式的年。**注释:**4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

SQL 函数

Aggregate 函数

Aggregate 函数计算从列中取得的值,返回一个单一的值。

有用的 Aggregate 函数:

AVG() - 返回平均值

SELECT AVG(count) AS CountAverage FROM access_log;

SELECT site_id, count FROM access_log
WHERE count > (SELECT AVG(count) FROM access_log);

COUNT() - 返回行数

SELECT COUNT(column_name) FROM table_name;

计算 “access_log” 表中 “site_id”=3 的总访问量:

select count(count) as nums from access_log where site_id = 3;

计算 “access_log” 表中总记录数:

select count(*) as nums from access_log

计算 “access_log” 表中不同 site_id 的记录数:

select count(distinct site_id) as nums from access_log;

FIRST() - 返回第一个记录的值

FIRST() 函数返回指定的列中第一个记录的值。

用法:SELECT FIRST(column_name) FROM table_name;

**注释:**只有 MS Access 支持 FIRST() 函数。

选取 “Websites” 表的 “name” 列中第一个记录的值:

SELECT name AS FirstSite FROM Websites LIMIT 1;

LAST() - 返回最后一个记录的值

SELECT LAST(column_name) FROM table_name;

SELECT TOP 1 column_name FROM *table_name
ORDER BY column_name DESC;

SELECT name FROM Websites
ORDER BY id DESC
LIMIT 1;

MAX() - 返回最大值

MAX() 函数返回指定列的最大值。

SELECT MAX(column_name) FROM table_name;

MIN() - 返回最小值

SELECT MIN(column_name) FROM table_name;

SUM() - 返回总和

SUM() 函数返回数值列的总数。

SELECT SUM(column_name) FROM table_name;

Scalar 函数

Scalar 函数基于输入值,返回一个单一的值。

有用的 Scalar 函数:

UCASE() - 将某个字段转换为大写

SELECT UCASE(column_name) FROM table_name;

例:SELECT UCASE(name) AS site_title, url FROM Websites;

LCASE() - 将某个字段转换为小写

LCASE() 函数把字段的值转换为小写。

SELECT LCASE(column_name) FROM table_name;

MID() - 从某个文本字段提取字符,MySql 中使用

MID() 函数用于从文本字段中提取字符。

参数描述
column_name必需。要提取字符的字段。
start必需。规定开始位置(起始值是 1)。
length可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。

语法:SELECT MID(column_name,start[,length]) FROM table_name;

SELECT MID(name,1,4) AS ShortTitle FROM Websites;

SubString(字段,1,end) - 从某个文本字段提取字符

LEN() - 返回某个文本字段的长度

SELECT LEN(column_name) FROM table_name;

SELECT name, LENGTH(url) as LengthOfURL
FROM Websites;

ROUND() - 对某个数值字段进行指定小数位数的四舍五入

参数描述
column_name必需。要舍入的字段。
decimals必需。规定要返回的小数位数。

ROUND(X): 返回参数X的四舍五入的一个整数。

mysql> select ROUND(-1.23);
        -> -1
mysql> select ROUND(-1.58);
        -> -2
mysql> select ROUND(1.58);
        -> 2

ROUND(X,D): 返回参数X的四舍五入的有 D 位小数的一个数字。如果D为0,结果将没有小数点或小数部分。

mysql> select ROUND(1.298, 1);
        -> 1.3
mysql> select ROUND(1.298, 0);
        -> 1

NOW() - 返回当前的系统日期和时间

SELECT NOW() FROM table_name;

SELECT name, url, Now() AS date
FROM Websites;

FORMAT() - 格式化某个字段的显示方式

FORMAT() 函数用于对字段的显示进行格式化。

参数描述
column_name必需。要格式化的字段。
format必需。规定格式。

GROUP BY

GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。

HAVING 子句

在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。

HAVING 子句可以让我们筛选分组后的各组数据。

where 和having之后都是筛选条件,但是有区别的:

1.where在group by前, having在group by 之后

2.聚合函数(avg、sum、max、min、count),不能作为条件放在where之后,但可以放在having之后

EXISTS 运算符

EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。

查找总访问量(count 字段)大于 200 的网站是否存在。

我们使用下面的 SQL 语句:

SELECT Websites.name, Websites.url FROM Websites WHERE EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);


  1. GFs ↩︎

  2. A-H ↩︎

  3. ^A-H ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值