这是我参与「第四届青训营 」笔记创作活动的第12天
SQL
1、数据库(DataBase/DB):用于存储和管理数据的仓库
数据库特点:
- 持久化存储数据。其实数据库就是一个文件系统
- 方便存储和管理数据
- 使用了统一的方式操作数据库--SQL
2、SQL(Structured Query Language):结构化查询语言,使我们有能力访问数据库
其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”
3、SQL通用语法:
-
SQL语句可以单行或多行书写,以分号结尾
-
可使用空格和缩进来增强语句的可读性
-
MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
-
3种注释:
- 单行注释:-- 注释内容(两个横杠一个空格)或# 注释内容(MySQL特有)
- 多行注释:/*注释 */
-
注:SQL对大小写不敏感
4、数据库表
一个数据库通常包含一个或多个表。每个表由一个名字标识(例如“客户”或者“订单”)。表包含带有数据的记录(行)。
下面的例子是一个名为 "Persons" 的表:
| ID | LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|---|
| 1 | Adams | John | Oxford Street | London |
| 2 | Bush | George | Fifth Avenue | New York |
| 3 | Carter | Thomas | Changan Street | Beijing |
上面的表包含三条记录(每一条对应一个人)和五个列(Id、姓、名、地址和城市)。
4、SQL分类:
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
-
DDL(操作数据库、表):数据定义语言,用来定义数据库对象:数据库,表,关键字:create,drop,alter等
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
-
DQL(查询表中数据):数据查询语言,用来查询数据库中表的记录(数据)。关键字:select,where等
-
DML(增删改表中的数据):数据操作语言,用来对数据库中表的数据进行增删改,关键字:insert,delete,update等
查询和更新指令构成了 SQL 的 DML 部分:
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
-
DCL(授权):数据控制语言(了解),用来定义数据库的访问权限和安全级别,及创建用户,关键字:GRANT,REVOKE等
5、DDL:操作数据库、表
-
创建:
- 创建数据库:create database 数据库名称
- 创建数据库:判断不存在,再创建
- create database if not exists 数据库名称;
- 创建数据库,并指定字符集
- create database 数据库名称 character set 字符集名;
-
查询:
-
查询所有数据库名称:show databases;
-
查询某个数据库的字符集:查询某个数据库的创建语句
show create database 数据库名称
-
-
删除:
-
删除数据库:drop database 数据库名称;
-
判断数据库存在,存在再删除
drop database if exists 数据库名称;
-
-
使用数据库:
- 查询当前正在使用的数据库名称:select database();
- 使用数据库:use 数据库名称;
操作表:
-
创建:Create table 表名{
列名1,数据类型1,
列名2,数据类型2,
……
列名n,数据类型n}
注意:最后一列不需要加逗号(,)
-
数据库类型:
1.int :整数类型:age int,
2.double:小数类型:score double(5,2)
3.date:日期,只包含年月日,yyy-MM-dd
4.datetime:日期,包含年月日时分秒 yyyy-MM-dd HH:mm-dd
5.timestamp:时间戳类型 包含年月日时分秒 yyyy-MM-dd
HH:mm:ss
注:如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间,来自动赋值
6.varchar:字符串
name varchar(20):姓名最大20个字符
zhangsan 8个字符 张三 2个字符
eg:创建表
create table student(
id int,
name varchar(32),
age int,
score double(4,1),
birthday date,
insert_time_timestamp
);
复制表:
create table 表名 like 被复制的表名;
-
-
查询:
- 查询某个数据库中所有表名称:show tables;
- 查询表结构:desc 表名;
-
删除:drop table 表名;
drop table if exists 表名;
-
修改:
1.修改表名:
alter table 表名 rename to 新的表名;
2.修改表的字符集:
alter table 表名 character set 字符集名称;
3.添加一列:
alter table 表名 add 列名 数据类型;
4.修改列名称 类型:
alter table 表名 change 列名 新列别 新数据类型;
alter table 表名 modify 列名 新数据类型;
5.删除列:
alter table 表名 drop 列名;
6、DML:增删改表中数据
1.添加数据:
insert into 表名(列名1,列名2,……列名n)values(值1,值2,……值n);
注意:
-
列名和值要一一对应
-
如果表名后,不定义列名,则默认给所有列添加值:
insert into 表名 values (值1,值2,……值n);
-
除了数字类型,其他类型需要使用
2.删除数据:
delete from 表名{where 条件}
注意:
-
如果不加条件,则删除表中所有记录
-
如果要删除所有记录
-
delete from 表名;--不推荐使用,有多少条记录就会执行多少次删除操作
-
TRUNCATE TABLE 表名;-- 推荐使用,效率更高,先删除表,然后再创建一张一样的表
-
delete和drop区别:
delete删除表数据
drop删除表结构和数据库
-
3、修改数据:
update 表名 set 列名1=值1,列名2=值2,……{where 条件};
注意:如果不加任何条件,则会将表中所有记录全部修改
7、DQL:查询语句
- 基础查询:
1.多个字段的查询:
select 字段名1,字段名2,……from 表名;
注意:如果查询所有字段,则可以使用*来替代字段列表
2.去除重复:
distinct
3.计算列:
一般可以使用四则运算计算一些列的值。(一般只会进行数值型的计算)
ifnull(表达式1,表达式2):null参与的运算,计算结果都为null
表达式1:哪个字段需要判断是否为null
如果该字段为null后的替换值
4.起别名:as:as也可以省略
-
条件查询:
1.where子句后跟条件
2.运算符
-
*>、<、<=,>=,=,<>
-
BETEEN...AND
-
IN(集合)
-
LIKE
_:单个任意字符
%:多个任意字符
-
IS NULL
-
and 或&&
-
or 或||
-
not | 或!
eg:查询年龄大于20岁:
SELECT_FROM student WHERE age>20;
-
-
DQL:查询语句
排序查询
order by 子句
order by 排序字段1,排序方式1, 排序字段1,排序方式2……
排序方式:
ASC:升序,默认的
DESC:降序
注意:如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件
2.聚合函数:将一列数据作为一个整体,进行纵向的计算
-
count:计算个数
一般选择非空的列:主键
count(* )
-
max:计算最大值
-
min:计算最小值
-
sum:计算和
-
avg:计算平均值
注意:聚合函数的计算,排除null值
解决方案:
- 选择不包含非空的列进行计算
- IFNULL函数
3.分组查询
语法:group by 分组字段;
注意:
-
分组之后查询的字段:分组函数,聚合函数
-
where和having'的区别:
1.where在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
2.where后不可以跟聚合函数,having可以进行聚合函数的判断
4.分页查询
-
语法:limit 开始的索引,每页查询的条数;
-
公式:开始的索引=(当前的页码-1)* 每页显示的条数
eg:
SELECT * FROM student LIMIT 0,3 - - 第1页
SELECT * FROM student LIMIT 3,3 - - 第2页
SELECT * FROM student LIMIT 6,3 - - 第3页
-
limit 是一个MySQL“方言”
5.SQL SELECT 语句
SELECT 语句用于从表中选取数据。
结果被存储在一个结果表中(称为结果集)。
SQL SELECT 语法
SELECT 列名称 FROM 表名称
以及:
SELECT * FROM 表名称
注释: SQL 语句对大小写不敏感。SELECT 等效于 select。
6.SQL SELECT DISTINCT 语句
在表中,可能会包含重复值。这并不成问题,不过,有时您也许希望仅仅列出不同(distinct)的值。
关键词 DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称
7、WHERE 子句
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。
语法
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
下面的运算符可在 WHERE 子句中使用:
| 操作符 | 描述 |
|---|---|
| = | 等于 |
| <> | 不等于 |
| 大于 | |
| < | 小于 |
| >= | 大于等于 |
| <= | 小于等于 |
| BETWEEN | 在某个范围内 |
| LIKE | 搜索某种模式 |
注: 在某些版本的 SQL 中,操作符 <> 可以写为 !=。
eg:使用 WHERE 子句
如果只希望选取居住在城市 "Beijing" 中的人,我们需要向 SELECT 语句添加 WHERE 子句:
SELECT * FROM Persons WHERE City='Beijing'
引号的使用
请注意,我们在例子中的条件值周围使用的是单引号。
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
文本值:
这是正确的:
SELECT * FROM Persons WHERE FirstName='Bush'
这是错误的:
SELECT * FROM Persons WHERE FirstName=Bush
数值:
这是正确的:
SELECT * FROM Persons WHERE Year>1965
这是错误的:
SELECT * FROM Persons WHERE Year>'1965'
8、AND 和 OR 运算符:
用于基于一个以上的条件对记录进行过滤。
AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录
AND 运算符实例
使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
9、SQL ORDER BY 子句
ORDER BY 语句用于对结果集进行排序。
ORDER BY 语句用于根据指定的列对结果集进行排序。
ORDER BY 语句默认按照大小升序/字母表顺序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
例子:
原始的表 :
Orders 表:
| COMPANY | ORDERNUMBER |
|---|---|
| IBM | 3532 |
| W3School | 2356 |
| Apple | 4698 |
| W3School | 6953 |
实例 1
以字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
结果:
| COMPANY | ORDERNUMBER |
|---|---|
| Apple | 4698 |
| IBM | 3532 |
| W3School | 6953 |
| W3School | 2356 |
实例 2
以字母顺序显示公司名称(Company),并以数字顺序显示顺序号(OrderNumber):
SELECT Company, OrderNumber FROM Orders ORDER BY Company, OrderNumber
结果:
| COMPANY | ORDERNUMBER |
|---|---|
| Apple | 4698 |
| IBM | 3532 |
| W3School | 2356 |
| W3School | 6953 |
实例 3
以逆字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC
结果:
| COMPANY | ORDERNUMBER |
|---|---|
| W3School | 6953 |
| W3School | 2356 |
| IBM | 3532 |
| Apple | 4698 |
实例 4
以逆字母顺序显示公司名称,并以数字顺序显示顺序号:
SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC
结果:
| COMPANY | ORDERNUMBER |
|---|---|
| W3School | 2356 |
| W3School | 6953 |
| IBM | 3532 |
| Apple | 4698 |
注意: 在以上的结果中有两个相等的公司名称 (W3School)。只有这一次,在第一列中有相同的值时,第二列是以升序排列的。如果第一列中有些值为 nulls 时,情况也是这样的。
10、SQL INSERT INTO 语句
INSERT INTO 语句用于向表格中插入新的行。
语法
INSERT INTO 表名称 VALUES (值1, 值2,....)
我们也可以指定所要插入数据的列:
INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)
插入新的行
"Persons" 表:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Carter | Thomas | Changan Street | Beijing |
SQL 语句:
INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
结果:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Carter | Thomas | Changan Street | Beijing |
| Gates | Bill | Xuanwumen 10 | Beijing |
在指定的列中插入数据
"Persons" 表:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Carter | Thomas | Changan Street | Beijing |
| Gates | Bill | Xuanwumen 10 | Beijing |
SQL 语句:
INSERT INTO Persons (LastName, Address) VALUES ('Wilson', 'Champs-Elysees')
结果:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Carter | Thomas | Changan Street | Beijing |
| Gates | Bill | Xuanwumen 10 | Beijing |
| Wilson | Champs-Elysees |
11.SQL UPDATE 语句
Update 语句用于修改表中的数据。
语法:
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
Person:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Gates | Bill | Xuanwumen 10 | Beijing |
| Wilson | Champs-Elysees |
更新某一行中的一个列
我们为 lastname 是 "Wilson" 的人添加 firstname:
UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
结果:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Gates | Bill | Xuanwumen 10 | Beijing |
| Wilson | Fred | Champs-Elysees |
更新某一行中的若干列
我们会修改地址(address),并添加城市名称(city):
UPDATE Person SET Address = 'Zhongshan 23', City = 'Nanjing'
WHERE LastName = 'Wilson'
结果:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Gates | Bill | Xuanwumen 10 | Beijing |
| Wilson | Fred | Zhongshan 23 | Nanjing |
12.SQL DELETE 语句
DELETE 语句用于删除表中的行。
语法
DELETE FROM 表名称 WHERE 列名称 = 值
Person:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Gates | Bill | Xuanwumen 10 | Beijing |
| Wilson | Fred | Zhongshan 23 | Nanjing |
删除某行
"Fred Wilson" 会被删除:
DELETE FROM Person WHERE LastName = 'Wilson'
结果:
| LASTNAME | FIRSTNAME | ADDRESS | CITY |
|---|---|---|---|
| Gates | Bill | Xuanwumen 10 | Beijing |
删除所有行
可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:
DELETE FROM table_name
或者:
DELETE * FROM table_name