SQL总复习带例子(部分个人注释)

distinct:用于返回唯一不同的值

例子
select distinct Company from Orders;

where:有条件的选取表中数据

操作符 描述
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

BETWEEN 在某个范围内
LIKE 搜索某种模式

例子
Select * from Persons where Firstname=’Jack’;
Select * from Persons where score>80;
Select * from Persons where Firstname like ‘Xie %’;
Select * from Persons where Secondname not like ‘%qq%’;

And 和 Or运算符:用户将多个条件相结合

例子
Select * from Persons where Firstname=‘Xie’and where SecondName like “xie%”;
Select * from Persons where (Firstname = ‘Xie’ OR Firstname =’Zhang’) and Secondname = ‘%xie’;

Order by:根据指定的列对结果集进行排序

例子
Select name,score From users order by score desc ;
Select name,score from users order by score desc,name asc;

Insert into:用于向表格中插入新的行

例子
Insert into Users values (‘Jack’,100,’1,’beijing’);
Insert into Users(name,score) values(‘Jack’,99);

Update:用于修改表中的数据

例子
Update Users set name=’Mary’,score=288 where id=99;

Delete:用于删除表中的行

例子
Delete from users where id = 28;
Delete from users;//删除所有数据,表结构依然存在

Top/limit:规定要返回的记录的数目

例子
Select top 2 name,user from users;
Select top 50 percent user,score from users;
Select * from users limit 5;
Select * from users where rownum <= 5;
① selete * from testtable limit 2,1;
② selete * from testtable limit 2 offset 1;
2.offset X是跳过X个数据,limit Y是选取Y个数据
3.limit X,Y 中X表示跳过X个数据,读取Y个数据
①是从数据库中第三条开始查询,取一条数据,即第三条数据读取,一二条跳过
②是从数据库中的第二条数据开始查询两条数据,即第二条和第三条。

Like:用于在where字句中搜索列中的指定模式。

例子
Select name,score form users where name like ’Xie%’;
Select name,score form users where name not like ’Xie%’;

SQL通配符:在搜索数据库中的数据时,SQL通配符可替代一个或多个字符。

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

例子
Select name,score form users where name like ’Xie%’;
Select name,score from users where name like ‘_ie%’;
Select name,score from users where name not like ‘C_r_er’;
Select name,City,score from users where City like ‘[SSB]%’;//将查询所所有S或S或B开头的城市
Select name,City,score from users where City like ‘[!SSB]%’;

IN操作符:允许我们在where字句中规定多个值

例子
Select name,score from users where Firstname In(‘Xie’,’Zhang’);

Between操作符:在where字句中使用,作用是介于两个值的数据范围

例子
Selecst name,score from users where score between 100 and 90;//MySQL包含了100和90两个边界值
Select name,score from users where name not between ‘Xie%’ and ‘__ang%’;

SQL Alias(别名):可以为列名称和表名称指定别名

例子
Select u.id,u.score,o.id,o.orderId,o.total_price from users as u,Orders as o where u.id=o.id,o.status=1;//连表查询+别名
Select Lastname as Family ,FirstName As Name from users;

SQL Join:用于两个或多个表中的列之间的关系,从这些表中查询数据

例子
Select u.id,u.name,o.id,o.total_price,o.uid from users as u inner join orders as o on u.id = o.uid order by o.total_price desc;//inner join内连接查询+别名+根据总价降序排名

SQL inner join(与join相同):在表表中至少存在一个匹配时,inner join关键字返回行 //只显示匹配的字段

例子:同上

SQL Left join:会从左表那里返回所有的行,即使右表中没有匹配的行 //左边所有+右边匹配

例子
Select u.id,u.name,o.id,o.total_price,o.uid from users as u left join orders as o on u.id = o.uid order by o.total_price desc;//left join左连接查询+别名+根据总价降序排名

SQL right join:会从右表那里返回所有的行,即使左表中没有匹配的行 //右边所有+左边匹配

例子:
Select u.id,u.name,o.id,o.total_price,o.uid from users as u right join orders as o on u.id = o.uid order by o.total_price desc;//right join右连接查询+别名+根据总价降序排名

SQL full join:只要其中某个表存在匹配,full join关键字就会返回行 //在inner的基础上,也就是只显示匹配的关键字+其余不匹配字段也显示出来

LastName FirstName OrderNo
Adams John 22456
Adams John 24562
Carter Thomas 77895
Carter Thomas 44678
Bush George
34764

例子
Select u.id,u.name,o.id,o.total_price,o.uid from users as u full join orders as o on u.id = o.uid order by o.total_price desc;//full join 全连接查询+别名+根据总假降序排名

SQL union操作符:用于合并两个或多个SELECT语句的结果集

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
例子
Select name from users1 union select name from users2;//不包括重复值
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill

Select name from users1 union all select name from users2;//包括重复值
E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill

SQL select into:用于创建表的备份附件

例子
Select * into Back.users_backup from users;//备份表
Select id,name,city into Back.users_backup from users where city=’Beijing’;//仅备份指定字段且城市为背景的信息

SQL Constraints(约束):约束用于限制加入表的数据类型
Not null:约束强制列不接受NULL值
Ninque:约束唯一标识数据库中的每条记录,每个表允许多个unique约束
primary key:约束唯一标志数据库的每条记录,主键必须包含唯一的值,每个表只能有个一个主键,主键列不能为NULL值
联合主键:主键可以是一个字段,也可以是多个字段。当为多个字段时,只要不是所有的字段均相同即可插入数据,可有效的防止类似同名不同班级的情况。

例子
建表时,命名主键约束名,且一个主键多字段
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 CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
撤销主键
ALTER TABLE Persons
DROP PRIMARY KEY

Foreign key:一个表的foreign key 指向另一个表的primary key

例子
建表时,关联已定义的字段作为外键
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)
)
建表时,关联两个字段作为外键,多对多关系(联合主键对应多个关键)
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,name_P)
REFERENCES Persons(Id_P,name_P)
)
在已有表添加外键,添加约束名和外键多字段
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (Id_P,name_P)
REFERENCES Persons(Id_P,name_P)
撤销外键
ALTER TABLE Orders
DROP FOREIGN KEY fk_PerOrders

Check:约束用于限定列中的值的范围

例子
建表时,约束id大于0,城市只能是Sandnes
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’)
)
已有表的情况下建立check约束
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City=‘Sandnes’)
撤销约束
ALTER TABLE Persons
DROP CHECK chk_Person
Default:约束用于向列中插入默认值
例子
建表时
CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT ‘Sandnes’
)
已有表的情况下建立default约束
ALTER TABLE Persons
ALTER City SET DEFAULT ‘SANDNES’
撤销
ALTER TABLE Persons
ALTER City DROP DEFAULT

索引:可以在表中建立索引,以便更加快速高效的查询数据,用户无法看到,它们只能被用来加速搜索或查询——注意:更新一个包含索引的表比更新一个没有索引的表花费更多的时间,因为索引本身也需要更新。因此,理想的做法是仅在常常被搜索的列以及表上面建立索引

例子
索引单列
CREATE INDEX index_name
ON table_name (column_name)
在表上建立一个唯一的索引列,并以降序索引某个列的值
CREATE UNIQUE INDEX PersonIndex
ON Person (LastName DESC)
多个列索引
CREATE INDEX PersonIndex
ON Person (LastName, FirstName)

查看索引

(1)show index from tblname;
(2)show keys from tblname;
Drop:用于删除索引、表和数据库
例子
Drop index users.index_name;
Alter table:用于在已有的表中添加、修改、删除列
例子

增加列
Alter table users add sex tinyint defau 1;
修改列的数据类型
Alter table users alter column sex char(1);
删除列
Alter table users drop column city;
Auto increment:在每次插入新记录时,自动创建主键字段的值,唯一
例子
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)
)

SQL VIEW(视图):视图是基于SQL语句的结果集的可视化的表,数据库的设计和结构不会受视图的影响。

例子
创建视图语法:
CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

创建视图:联合两表查询并筛选条件。
Create view view_all_users as Select name,member_id,city from users1 where age>=18 and where city = ‘Shenzhen’ union select name,member_id,city from user2 where age>=18 and where name =’_ieDong%’;

创建视图:嵌套查询建立view,查询出高于表自身平均价格的产品名及其价格。
Create view view_avg_price as select product_name,unit_price from products where unit_price>(select avg(unit_price) from products);

创建视图:嵌套查询建立view,从另一个视图中查询出某列的数据并建立新的视图,注意:需指出原先视图对应的数据表
Create view category_sales_for_1997 as select distinct CategoryName,Sum(ProductSales) as CategorySales from product_sales_for_1997 group by CategoryName;
使用select * from category_sales_for_1997;
或者加条件select product_name from category_sales_for_1997 where name = ‘potato’;

视图添加列:
CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No

撤销视图:
SQL DROP VIEW Syntax
DROP VIEW view_name

Date函数:只要数据包含的只是日期部分,查询一般没什么问题,但包含时间一般比较复杂。

函数 描述:

NOW()

返回当前的日期和时间

CURDATE()

返回当前的日期

CURTIME()

返回当前的时间

DATE()

提取日期或日期/时间表达式的日期部分

EXTRACT()

返回日期/时间按的单独部分

DATE_ADD()

给日期添加指定的时间间隔

DATE_SUB()

从日期减去指定的时间间隔

DATEDIFF()

返回两个日期之间的天数

DATE_FORMAT()

用不同的格式显示日期/时间
例子
SELECT * FROM Orders WHERE OrderDate=‘2008-12-26’

SQL null值:NULL是遗漏的未知数据,使用is null 和 is not null来查询,null !=0无法使用算术运算符来进行查询

例子
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

IFNULL:如果为空,返回*值

例子,如果为空,返回0
SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products

数据类型:MySQL的
Text 类型:

数据类型 描述
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 无符号*。在括号中规定最大位数。
MEDIUMINT(size) -8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。
INT(size) -2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。
BIGINT(size) -9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。
FLOAT(size,d) 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DOUBLE(size,d) 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。
DECIMAL(size,d) 作为字符串存储的 DOUBLE 类型,允许固定的小数点。

这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。

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。

即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。

SQL函数:用于计数和计算的内建函数
AVG():平均值,计算时不高考NULL

例子
SELECT Customer FROM Orders
WHERE OrderPrice>(SELECT AVG(OrderPrice) FROM Orders)

COUNT():函数返回匹配指定条件的行数

例子
SELECT COUNT(Customer) AS CustomerNilsen FROM Orders
WHERE Customer=‘Carter’
CustomerNilsen
2

First():函数返回指定的字段中第一个记录的值

例子
SELECT FIRST(OrderPrice) AS FirstOrderPrice FROM Orders
FirstOrderPrice
1000
Last():函数返回指定的字段中最后一个记录的值
例子
SELECT LAST(OrderPrice) AS LastOrderPrice FROM Orders
LastOrderPrice
100

Max():函数返回一列中的最大值,Null不包含在计算中

例子
SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders
LargestOrderPrice
2000

Min():同上,最小值
Sum():函数返回数值列的总数(总额)

例子
SELECT SUM(OrderPrice) AS OrderTotal FROM Orders
OrderTotal
5700

Group by:结合合计函数,根据一个或多个列对结果集进行分组

例子
对单个字段,用户名进行分组,得出的价格会进行根据查询的sum自动分组sum运算
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
Customer SUM(OrderPrice)
Bush 2000
Carter 1700
Adams 2000
对多个字段进行分组
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders
GROUP BY Customer,OrderDate

Having():增加Having字句——where无法和合计函数一起使用

例子
使用where进行条件限制+having使用合计函数计算
SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer=‘Bush’ OR Customer=‘Adams’
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
Customer SUM(OrderPrice)
Bush 2000
Adams 2000

Ucase():函数把字段的值转换为大写

例子
SELECT UCASE(LastName) as LastName,FirstName FROM Persons
LastName FirstName
ADAMS John
BUSH George
CARTER Thomas

Lcase():同上,转换为小写

例子
SELECT LCASE(LastName) as LastName,FirstName FROM Persons

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

SELECT MID(column_name,start[,length]) FROM table_name
参数 描述
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。如果省略,则 MID() 函数返回剩余文本。
例子
SELECT MID(City,1,3) as SmallCity FROM Persons
SmallCity
Lon
New
Bei

Len():返回文本字段中值的长度

例子
SELECT LEN(City) as LengthOfCity FROM Persons
LengthOfCity
6
8
7

Round():函数用于把数值字段四舍五入指定的小树位数

例子
SELECT ROUND(column_name,decimals) FROM table_name

参数 描述
column_name 必需。要舍入的字段。
decimals 必需。规定要返回的小数位数。
SELECT ProductName, ROUND(UnitPrice,0) as UnitPrice FROM Products
ProductName UnitPrice
gold 32
silver 12
copper 7

Now():函数返回当前的日期和时间

SELECT ProductName, UnitPrice, Now() as PerDate FROM Products
ProductName UnitPrice PerDate
gold 32.35 12/29/2008 11:36:05 AM
silver 11.56 12/29/2008 11:36:05 AM
copper 6.85 12/29/2008 11:36:05 AM

Format():用于对字段的显示进行格式化

例子
SELECT FORMAT(column_name,format) FROM table_name
参数 描述
column_name 必需。要格式化的字段。
format 必需。规定格式。
例子
SELECT ProductName, UnitPrice, FORMAT(Now(),‘YYYY-MM-DD’) as PerDate
FROM Products
ProductName UnitPrice PerDate
gold 32.35 12/29/2008
silver 11.56 12/29/2008
copper 6.85 12/29/2008

IF(expr1,expr2,expr3)

如果expr1是true,则IF的返回值为expr2,否则返回expr3

Case…when…then

第一种 格式 : 简单Case函数 :
格式说明
    case 列名
    when 条件值1 then 选择项1
    when 条件值2 then 选项2…
    else 默认值 end
eg:
    select
    case   job_level
    when ‘1’ then ‘1111’
    when  ‘2’ then ‘1111’
    when  ‘3’ then ‘1111’
    else ‘eee’ end
    from dbo.employee


第二种 格式 :Case搜索函数
格式说明
    case
    when 列名= 条件值1 then 选择项1
    when 列名=条件值2 then 选项2…
    else 默认值 end
eg:
    update employee
    set e_wage =
    case
    when job_level = ‘1’ then e_wage1.97
    when job_level = ‘2’ then e_wage
1.07
    when job_level = ‘3’ then e_wage1.06
    else e_wage
1.05
    end

最好刷刷题巩固一下 https://leetcode.com/

MySQL大部分 http://www.w3school.com.cn/sql/index.asp
MySQL函数 https://www.runoob.com/mysql/mysql-functions.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章