今天做笔试题目的时候,直接被SQL最简单的题目给搞抽抽了,所以我现在的打算是综合的学习一下SQL语句,其实按照网上的东西,SQL语句应该不是很难
在数据库上执行的大部分工作是由sql语句完成,例如:
SELECT lastname FROM Persons
====SQL对大小写不敏感====
SQL主要分为两个部分:数据操作语言(DML)和数据定义语言(DDL)
主要的DML语言有:
- SELECT:从数据库中获取数据;
- UPDATE:更新数据库表中的数据;
- DELETE:从数据库中删除数据;
- INSERT INTO:向数据库中插入数据
SQL中重要的DDL语句:
SELECT语法
SELECT 列名称 FROM 表名称
和
SELECT * FROM 表名称
主要的作用是返回这个表中有哪些数值,distinct主要是重复值
DISTINCT语法
SELECT DISTINCT 列名称 FROM 表名称
主要的作用是有条件冲表中选取数据
WHERE语法
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
运算操作符主要有:
运算符 | 描述 |
---|---|
= | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
= |
大于等于 |
<= | 小于等于 |
BETWEEN | 在某个范围内 |
LINK | 搜索某种模式 |
注意在SQL中单引号在环绕本文值,如果是数值,则不需要引号。
AND和OR运算符可以在WHERE子句中把两个或多个条件结合起来
如果第一个条件和第二个条件都成立,则AND运算符显示一条记录
如果第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录
ORDER BY语句
ORDER BY语句用于根据指定的列对结果集进行排序
ORDER BY语句默认按照升序对记录进行排序
如果希望按照降序对记录进行排序,可以使用DESC关键字
举例:以逆字母顺序显示公司名称,并以数字顺序显示顺序号
SELECT Company,OrderNumber FROM Orders BY Company DESC,OrderNumber ASC
INSERT INTO语句用于向表格中插入新的行
语法:
INSERT INTO 表名称 VALUES(值1,值2,……)
也可以指定要插入数据的列:
INSERT INTO table_name(列1,列2,……)VALUES(值1,值2,……)
update语句用于修改表中的数据
语法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
DELETE语句用于删除表中的行
语法
DELETE FROM 表名称 WHERE 列名称=值
删除所有行的语法是
DELETE FROM table_name
或者
DELETE * FROM table_name
TOP 子句*
TOP子句用于规定要返回的纪录的数目。
对于拥有数千条纪录的大型表来说,TOP子句是非常有用的。
语法:
SELECT TOP number|percent column_name(s) FROM table_name
举例:
从一个数据中选取规定数目的条目:
SELECT TOP 2 * FROM Persons
选取一定比例的条目:
SELECT TOP 50 PERCENT * FROM Persons
LIKE操作符用于在WHERE子句中搜索列中的制定模式。
语法:
SELECT column_name(s)
FROM table_name
WHERE colunm_name LIKE pattern
其实 LIKE操作符的操作精髓在制定模式,我们可以通过通配符,结合LIKE的功能,查找例如所有姓李的客户(”李%”)
通配符 | 描述 |
---|---|
% | 替代一个或者多个字符 |
_ | 仅替代一个字符 |
[charlist] | 字符列中任一一个字符 |
[^charlist]或[!charlist] | 不在字符列中的任意字符 |
IN 操作符允许我们在WHERE子句中规定多个值
SQL IN语法
SELECT colunm_name(s)
FROM table_name
WHERE ccolunm_name IN (value1,value2,……)
BETWEEN操作符在WHERE子句中使用,作用是选取介于两个值之间的数据范围
语法
SELECT column_name(s)
FROM table_name
WHERE colume_name
BETWEEN value1 AND value2
注意:一般情况下这个value是数字之类的能够有统一标准辨别的区间,虽然可以对字符之间的区间进行区别,但是不用的数据库之间还是有区别的。
通过使用Alisa,可以为列名称和表名称制定别名(Alisa)
相关语法
表的SQL Alisa语法
SELECT column_name(s)
FROM table_name
AS alisa_name
列的SQL Alisa语法
SELECT column_name AS alisa_name
From table_name
其实总结的来看 这个就是==AS==的功能
SQL join用于根据两个或者多个表中的列之间的关系,从这些表中查询数据
join有很多种类型,首先举一个例子:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
这里面就用到INNER JOIN(内连接),还有其他的,随后介绍
SQL INNER JOIN 关键字
在表中至少一个匹配时,INNER JOIN 关键字返回。
==INNER JOIN 和 JOIN 是相同的==
INNER JOIN 关键字语法
SELECT column_name(S)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
SQL LEFT JOIN 关键字会从左表(table_name1)那里返回所有行,即使右表(table_name2)中没有匹配的行。
LEFT JOIN关键字语法
SELECT colunm_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.colunm_name
其实这个理解也不是很难,就是左表中的所有数据 即便是没有跟右表匹配,也应该连接一下。
SQL RIGHT JOIN其实和LEFT JOIN想法,应用参考LEFT JOIN 相关的知识。
SQL FULL JOIN 其实就是参考了LEFT 和RIGHT 只要是左右表中的数值,都会出现在最终表中。
SQL UNION操作符用于合并两个或多个select语句的结果集
==注意==UNION 内部的SELECT语句必须拥有相同数量的列,列也必须拥有相似的数据类型。
同时每条SELECT语句中的列的顺序必须相同。
SQL UNION语法
SELECT column_name(s)FROM table_name1
UNION
SELECT colunm_name(s)FROM table_name2
==注释==默认情况,UNION操作符选择不同的数值,需要重复数值,则用UNION ALL
SQL UNION ALL语法
SELECT column_name(s)FROM table_name1
UNION ALL
SELECT c olunm_name(s)FROM table_name2
SQL SELECT INTO语句可用于创建表的备份文件
SQL SELECT INTO语法:
SELECT *(colunme_name)
INTO new_table_name[IN externaldatabase]
FROM old_table_name
==注== select后面的语句是希望整个表备份还是某个列备份。
这个语句后面可以带有WHERE子句、连接语句等
==其实我个人的理解就是,其实这个INTO语句后面可以按照SQL的复杂度进行添加子句==
CREATE DATABASE语句用于创建数据库
用法:
CREATE DATABASE database_name
CREATE TABLE语句用于创建数据库中的表
相关用法
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
……
)
SQL约束用于限制加入表的数据类型,主要的约束有:
CREATE INDEX语句用于在表中创建索引,在不读取整个表的情况下,索引使数据库应用程序可以更快的查找数据。
SQL CREATE INDEX语法
在表上创建一个简单的索引,允许使用重复值:
CREATE INDEX index_name
ON table_name(colunm_name)
通过使用DROP语句,可以轻松的删除索引,表和数据库。
DROP INDEX/TABLE/DATABASE 相对应的名称
==SQL TRUNCATE TABLE==
如果我们仅仅需要删除表内的数据,但不删除表本身,使用TRUNCATE TABLE命令
TRUNCATE TABLE 表名称
ALTER 用于在已有表中添加,修改或删除列
相关的语法
ALTER TABLE table_name
ADD coluMN_name datatype
DROP COLUMN column_name
ALTER COLUNM column_name datatype
AUTO INCREMENT字段:
我们通常希望在每次插入新记录时,自动的创建主键字段的值
==用法==
其实我们在使用的时候 类似的可以在创建的时候,在主键设计相关的值,也可以后期通过alter等相关的操作进行修改。
视图是可视化的表。
SQL CREATE VIEW语法
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_nmae
WHERE condition
==使用视图可以更方便我们以后的查找==
SQL 更新视图
SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition
其实就是我们日常操作数据库或者表的时候的语法,注意前面写成VIEW即可
SQL撤销视图
SQL DROP VIEW Syntas
DROP VIEW view_name
SQL 内建函数的使用方法:
SELECT function(列)FROM 表
相关函数的用法
AVG()
计算平均值,其输出是一个数值
COUNT()
返回的是制定条件的的行数
FIRST()/LAST()
返回表格的第一(最后)个记录的值
MAX()/MIN()
返回一列中的最大(最小)值,NULL不计算其中
SUM()
SUM函数返回数值列的总和
GROUP BY
GROUP BY函数用于合计函数,根据一个或者多个结果集进行分组。
GROUP BY语法
SELECT colume_name,func(colume_name)
FROM table_name
WHERE colume_name operator value
GROUP BY colume_name
HAVING
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用
HAVING的语法如下:
SELECT column_name, 合计函数(column_name)
FROM table_name
WHERE column_name 操作方法
GROUP BY column_name
HAVING 合计函数(column_name) 操作值
UCASE
UCASE 函数把字段的值转换为大写。
LCASE
LCASE函数把字段值转换为小写
LEN
LEN 函数返回文本字段中值的长度。
ROUND
ROUND 函数用于把数值字段舍入为指定的小数位数。
SQL ROUND()语法如下:
SELECT ROUND(column_name,decimals) FROM table_name
decimals字段就是控制小数位数。
NOW
返回当前的时间和日期
FORMAT
FORMAT 函数用于对字段的显示进行格式化。
SQL FORMAT()语法如下:
SELECT ROUND(column_name,format) FROM table_name
相关范式:
范式是符合某一种级别的关系模式的集合。关系数据库中的关系必须满足一定的要求,满足不同程度要求的为不同范式。
第一范式(1NF)
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。
简而言之,==第一范式就是无重复的列==。
第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键、主码。
简而言之,==第二范式就是非主属性非部分依赖于主关键字==。
第三范式(3NF)
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在图3-2的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。
简而言之,==第三范式就是属性不依赖于其它非主属性==。