clllll  

了解Mysql

一般叫DBMS DataBase Management System 数据库管理系统

表 table : 一个结构化的文件。来存储数据。一个数据库中表名是唯一的。
列 column: 存储表中的某一部分信息。有一个或多个主键primary key 来区分唯一的记录/行,正确的将数据分成列很重要。
行 row: 有的叫记录record.

SQL: Structured Query Language 结构化查询语言。与数据库沟通的语言。
方便查询和读写。

kail linux登录数据库

样例表

创建数据库
create database sample
选择数据库
use database sample
四个任务

  • 管理供应商
  • 管理产品目录
  • 管理顾客列表
  • 录入顾客顶单
    5个表

1.Vendors表

存储销售产品的供应商
vend_id用于进行产品与供应商的匹配

说明
vend_id 唯一的供应商ID,主键
vend_name 供应商名
vend_address 供应商地址
vend_city 所在城市
vend_state 所在州
vend_zip 邮政编码
vend_country 所在国家

创建Vendors表

create table Vendors
(
vend_id char(10) NOT NULL,
vend_name char(50) NOT NULL,
vend_address char(50) NULL,
vend_city char(50) NULL,
vend_state char(5) NULL,
vend_zip char(10) NULL,
vend_country char(50) NULL
);

定义主键
alter table Vendors add primary key (vend_id);
image

Products表

说明
prod_id 唯一的产品ID
vend_id 供应商ID
prod_name 产品名
prod_price 产品价格
prod_desc 产品描述
create table Products
(
prod_id char(10) NOT NULL,
vend_id char(10) NOT NULL,
prod_name char(255) NOT NULL,
prod_price decimal(8,2) NOT NULL,
prod_desc text NULL
);

定义主键
ALTER TABLE Products ADD PRIMARY KEY (prod_id);
关联外键

ALTER TABLE Products ADD CONSTRAINT FK_Products_Vendors FOREIGN KEY (vend_id) REFERENCES Vendors (vend_id);

image

3.Customers表

说明
cust_id 唯一的顾客ID
cust_name 顾客名
cust_address 顾客地址
cust_city 城市
cust_state
cust_zip 邮政编码
cust_country 国家
cust_contact 联系名
cust_email 电子邮件
CREATE TABLE Customers
(
cust_id char(10) NOT NULL ,
cust_name char(50) NOT NULL ,
cust_address char(50) NULL ,
cust_city char(50) NULL ,
cust_state char(5) NULL ,
cust_zip char(10) NULL ,
cust_country char(50) NULL ,
cust_contact char(50) NULL ,
cust_email char(255) NULL
);
ALTER TABLE Customers ADD PRIMARY KEY (cust_id);

4.Orders表

说明
order_num 订单号
order_date 订单日期
cust_id 顾客ID
CREATE TABLE Orders
(
order_num int NOT NULL ,
order_date datetime NOT NULL ,
cust_id char(10) NOT NULL
);
ALTER TABLE Orders ADD PRIMARY KEY (order_num);

5.OrderItems 表

说明
order_num 订单号
order_item 订单物品号,订单内的顺序
prod_id 产品ID
quantity 物品数量
item_price 物品价格
CREATE TABLE OrderItems
(
order_num int NOT NULL ,
order_item int NOT NULL ,
prod_id char(10) NOT NULL ,
quantity int NOT NULL ,
item_price decimal(8,2) NOT NULL
);
ALTER TABLE OrderItems ADD PRIMARY KEY (order_num, order_item);
ALTER TABLE OrderItems ADD CONSTRAINT FK_OrderItems_Orders FOREIGN KEY (order_num) REFERENCES Orders (order_num);
ALTER TABLE OrderItems ADD CONSTRAINT FK_OrderItems_Products FOREIGN KEY (prod_id) REFERENCES Products (prod_id);

插入数据

Customers

INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000001', 'Village Toys', '200 Maple Lane', 'Detroit', 'MI', '44444', 'USA', 'John Smith', 'sales@villagetoys.com');
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES('1000000002', 'Kids Place', '333 South Lake Drive', 'Columbus', 'OH', '43333', 'USA', 'Michelle Green');
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000003', 'Fun4All', '1 Sunny Place', 'Muncie', 'IN', '42222', 'USA', 'Jim Jones', 'jjones@fun4all.com');
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email)
VALUES('1000000004', 'Fun4All', '829 Riverside Drive', 'Phoenix', 'AZ', '88888', 'USA', 'Denise L. Stephens', 'dstephens@fun4all.com');
INSERT INTO Customers(cust_id, cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact)
VALUES('1000000005', 'The Toy Store', '4545 53rd Street', 'Chicago', 'IL', '54545', 'USA', 'Kim Howard');

Vendors

INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES('BRS01','Bears R Us','123 Main Street','Bear Town','MI','44444', 'USA');
INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES('BRE02','Bear Emporium','500 Park Street','Anytown','OH','44333', 'USA');
INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES('DLL01','Doll House Inc.','555 High Street','Dollsville','CA','99999', 'USA');
INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES('FRB01','Furball Inc.','1000 5th Avenue','New York','NY','11111', 'USA');
INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES('FNG01','Fun and Games','42 Galaxy Road','London', NULL,'N16 6PS', 'England');
INSERT INTO Vendors(vend_id, vend_name, vend_address, vend_city, vend_state, vend_zip, vend_country)
VALUES('JTS01','Jouets et ours','1 Rue Amusement','Paris', NULL,'45678', 'France');

Products

INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BR01', 'BRS01', '8 inch teddy bear', 5.99, '8 inch teddy bear, comes with cap and jacket');
INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BR02', 'BRS01', '12 inch teddy bear', 8.99, '12 inch teddy bear, comes with cap and jacket');
INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BR03', 'BRS01', '18 inch teddy bear', 11.99, '18 inch teddy bear, comes with cap and jacket');
INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BNBG01', 'DLL01', 'Fish bean bag toy', 3.49, 'Fish bean bag toy, complete with bean bag worms with which to feed it');
INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BNBG02', 'DLL01', 'Bird bean bag toy', 3.49, 'Bird bean bag toy, eggs are not included');
INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('BNBG03', 'DLL01', 'Rabbit bean bag toy', 3.49, 'Rabbit bean bag toy, comes with bean bag carrots');
INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('RGAN01', 'DLL01', 'Raggedy Ann', 4.99, '18 inch Raggedy Ann doll');
INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('RYL01', 'FNG01', 'King doll', 9.49, '12 inch king doll with royal garments and crown');
INSERT INTO Products(prod_id, vend_id, prod_name, prod_price, prod_desc)
VALUES('RYL02', 'FNG01', 'Queen doll', 9.49, '12 inch queen doll with royal garments and crown');

Orders

INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20005, '2020-05-01', '1000000001');
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20006, '2020-01-12', '1000000003');
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20007, '2020-01-30', '1000000004');
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20008, '2020-02-03', '1000000005');
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(20009, '2020-02-08', '1000000001');

OrderItems

INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 1, 'BR01', 100, 5.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20005, 2, 'BR03', 100, 10.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20006, 1, 'BR01', 20, 5.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20006, 2, 'BR02', 10, 8.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20006, 3, 'BR03', 10, 11.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 1, 'BR03', 50, 11.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 2, 'BNBG01', 100, 2.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 3, 'BNBG02', 100, 2.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 4, 'BNBG03', 100, 2.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20007, 5, 'RGAN01', 50, 4.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20008, 1, 'RGAN01', 5, 4.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20008, 2, 'BR03', 5, 11.99);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20008, 3, 'BNBG01', 10, 3.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20008, 4, 'BNBG02', 10, 3.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20008, 5, 'BNBG03', 10, 3.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 1, 'BNBG01', 250, 2.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 2, 'BNBG02', 250, 2.49);
INSERT INTO OrderItems(order_num, order_item, prod_id, quantity, item_price)
VALUES(20009, 3, 'BNBG03', 250, 2.49);

检索数据

select 关键字
从哪里取 from
取哪些:select

获取具体某列的数据,多个列使用逗号分割。 空格会忽略。所有列使用*。


获取多少。 limit

从第多少行开始获取, offset

简化版 limit 5,2 从第5行开始,获取2行数据

获取唯一的数据,是多列组合唯一 distinct , 作用于所有select列

单行注释 -- 。多行注释 /* sdfasdf */

关键字不区分大小写,但是表名,列名区分。

排序检索数据 Order By 子句

未加Order By子句检索出来的数据没有任何顺序上的意义
子句clause . order by必须是select最后的一个子句。否则会出错。
sql由子句构成,有些子句是必须的,有些是可选的。 一个子句由一个关键字加上所提供的的数据组成。 from 也是子句。

根据某一列排序,默认是升序

降序 DESC 全名 descending, 在列名的后面。

根据排序的列名不一定要在检索的列名里

多个列名排序,每个列名后面写desc关键字,不能作用于所有列名。

where 子句

根据某列的值来选择

操作符

  • 不等于 : <> 或者 !=
  • 某个范围内 between x1 and x2
  • NULL: IS NULL

注意:order by子句必须在where子句之后。

高级数据过滤,组合where 子句 and or .

多个过滤条件。and or 逻辑组合

求值顺序

括号 大于 and 大于 or

优先处理and操作符,导致理解为 vend_id为BRS01的价格大于5 和 所有的vend_id为 DLL01.

IN操作符

和多个and 一样。但是方便,直观,效率快。

IN还可以包含SELECT语句。

NOT操作符

否定 跟在其后的条件。

通配符进行过滤

前面的搜索条件都是具体已知的。

使用like操作符 和 % _ [] 通配符来搜索符合条件的数据

  • % 代表 0 个 1 个 和 多个 任意字符
  • _ 代表1个字符 __就是俩个
  • [] 中括号内的一个字符。 mysql不支持。


计算字段

我们需要的不是数据库存储的值。需要进一步处理,拼接或者计算。

拼接 concat 操作符

去除左、右、全部空格。RTrim LTrim Trim

计算 + - * /

计算某个订单的总价格

使用函数处理数据

  • 处理文本字符串:删除、填充、转换大小写
  • 数值上操作:绝对值、代数运算
  • 日期:提取特定成分:日期之差,时间函数。
  • 格式化函数

文本处理函数

函数 说明
left 返回字符串左边的字符
length 字符串长度
lower 转换为小写
upper 转换为大写
right 返回字符串右边的字符
rtrim 去掉字符串右边的空格
substring 提取字符串的组成部分
soundex 返回字符串的soundex值
upper 将字符串转为大写

日期和时间处理函数


数值处理函数

函数 说明
abs() 绝对值
cos 余弦
exp 指数
pi pai

一般用不着。

汇总数据

五个函数

函数 说明
avg 平均
max 最大
min 最小
count 统计行数,如果指定列名,会忽略值为NULL的行
sum 求和

如果需要聚集不同值。需要使用DISTINCT

组合聚集函数

分组数据

聚集函数在没有分组的情况下,是对整个表进行聚集计算的。
当加入group_by就是以分组为单位进行计算
如果有多个列,就细分。
NULL为一组。

对分组数据进行过滤

where:是行级别的过滤
having: 是组级别的过滤。只能出现在group by子句之后。

对分组数据排序

select 子句顺序

select from where group by having order by

子查询

嵌套在其他查询中的查询。

列出订购物品RGAN01的所有顾客。
步骤1:从OrderItems查询出所有RGAN01的订单号

步骤2:根据订单查询所有的顾客编号

步骤3: 根据顾客编号查询顾客信息

合一:

注意:子查询只能返回一列数据。

作为计算字段使用子查询

从Customers每返回一行数据,都从Orders里执行一次子查询。所以执行了5次子查询。

联结表

联结表:多个表联结起来。
关系数据库:表与表之间是有关系的。为了数据的唯一、不冗余。存储在同一个地方。可伸缩性好

创建联结


select所选择的列来自俩个表
from也是从俩个表。
where来建立联结。

联结俩个表:实际要做的就是将第一个表中的每一个行与第二个表中的每一行配对。where作为过滤条件。
笛卡尔积:没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。也叫叉联结 cross join.

  • 不要忘了where语句,联结条件一定要正确。否则返回的则是不正确的数据。

内连接

当前使用的是等值联结 equijoin .也称为内连接 inner join.
inner join ... on 语法

inner join ... on 语法和where 一样。

联结多个表

不要联结不必要的表

创建高级联结

使用别名

表也可以使用别名。一是为了区分列属于哪个表。二是可以缩写表名

三种联结

自连接 self join

表自己和自己联结

实现这种方式还可以用子查询

但是,自连接可能比子查询性能好。实际测试一下看使用哪种。

内连接 自然联结 nat

俩个或俩个以上的表进行联结 .
通配符只对第一个表使用。

外联结

联结将一个表的行与另一个表的行相关联,有时候需要包含没有关联行的那些行。
有左外联结 和右外联结 。左是基于左边的表进行联结。
left outer join ... on

带聚集函数的联结

组合查询

使用union关键字将select语句查询的结果组合起来。
当然使用union的肯定可以通过where 语句 来获取。 实际可以测试俩种方法哪个快。
注意:select的列必须一样或者可以隐式转换。
union默认去除重复列。 不去除使用union all

order_by 作用于所有union的所有 结果


插入数据

insert into 表名 values()

这种方式有缺点,表结构有变化就会失败。

指定要插入的列名

PS:指定的列名不一定要是所有的,可以是部分,但是未指定的一定要有默认值,或者 可以为null.

insert into .. select

insert into 只能插入一条记录,但是结合select就可以插入多条。

从一个表复制到另一个表

create table CustCopy as select * from Customers

更新和删除数据

更新数据update

  1. 更新哪个表
  2. 更新哪些列, 列与列之间逗号分割
  3. 过滤条件。如果没有过滤条件,将作用于所有的列。

删除数据 delete from

  1. 删除哪个表中的数据
  2. 过滤条件

更快的删除整个表

truncate table ...

创建和操纵表

创建表

create table 表名(
列名 类型 null/not null, default ,
....

默认是null.
deafult 日期:current_date()

更新表

最好先设计好。。

  • 增加列
    alter table Vendors add vend_phone char(20);

删除表

drop table 表名

使用视图

视图

视图是虚拟的表。视图只包含 使用时动态检索数据的查询。 SQLite仅支持只读视图。
视图不包含任何列和数据,包含 的是一个查询。

Why 视图

  • 重用sql语句
  • 简化复制的sql操作
  • 使用表的一部分
  • 保护数据。授予用户访问表的特定部分的权限。
  • 更改数据格式和表示。

使用表的方式和使用视图的方式一致。
添加或更改表中的数据,视图将放回改变过的数据。

视图的规则和限制

  • 视图唯一命名
  • 视图数目没有限制
  • 视图可以嵌套
  • 许多DBMS禁止视图使用Order by子句
  • 视图不能索引,不能有默认值

创建视图

使用存储过程

存储过程

大多数sql语句都是针对一个或多个表的单条语句。
并非所有操作都这么简单。会有一些复杂的操作需要多条语句才能完成。
存储过程就是为以后使用而保存的一条或多条SQL语句。 类似批文件。

Why存储过程

  • 封装在一个易用的单元中。简化复杂的操作
  • 统一
  • 防止延伸错误。保证了数据的一致性。
  • 简化对变动的管理。表名变了,只需要更改存储过程的代码。
  • 安全
  • 存储过程以编译的形式存储。DBMS处理命令所需的工作量少。 提高了性能
    使用简单、安全、高性能。

缺陷

  • 不同的DBMS的存储过程语法不同。编写真正的可移植的存储过程几乎是不可能的。 但至少客户端不需要变动。
  • 语句复杂,难。。

执行存储过程

execute 存储过程名称(参数)

  • 参数可选
  • 不按次序给出参数,以“参数=值”的方式给出参数值。
  • 输出参数。允许存储过程在正执行的应用程序中更新所用的参数
  • 用select语句检索数据
  • 返回代码,允许存储过程返回一个值到正在执行的应用程序

创建存储过程

create procedure mailingListCOunt(
ListCOunt OUT INTEGER
)
IS
v_rows INTEGER;
begin
select count(*) INTO v_rows from Customers where not cust_email is Null ;
ListCount := v_rows;
end;

管理事务处理

利用commit 和 rollback语句管理事务处理

事务处理 transaction processing .

使用事务处理 确保成批的sql操作要么完全执行,要么完全不执行,来维护数据库的完整性。

  • 事务 tacnsaction 指一组sql语句
  • 回退 rollback 撤销指定sql语句的过程
  • 提交 commit 将未存储的sql语句结果写入数据库表
  • 保留点 savepoint 指事务处理中设置的临时占位符 placeholder.可以对它发布回退

控制事务处理

sql server
begin transaction
..
commit tracsaction

mysql
start transaction
...

rollback

delete from Orders;
rollback ;

commit

一般的sql语句都是隐式提交的 implicit commit .提交操作是自动执行的。
在事务处理模块中,提交不会隐式执行。

使用保留点

rollback 和 commit 可以写入和撤销整个事务。
复杂的事务可能需要部分提交或回退

要支持回退部分事务。必须在事务处理块中的合适位置防止占位符。

savepoint delete1;

rollback to delete1;

使用游标

游标

sql检索操作返回一组称为结果集的行。 没有办法得到第一行、下一行或者前10行。
result set
需要在检索出来的行中前进或者后退一行或多行。这就是游标的用途所在。

cursor . 是一个存储在DBMS服务器上的数据库查询。 不是一条select语句,而是select语句检索出来的结果集。
在存储了游标之后,可以根据需要滚动或浏览其中的数据。

  • 能够标记游标为只读
  • 能控制可以执行的定向操作
  • 标记某些列可编辑、某些列不可编辑
  • 规定范围

游标主要用于交互式应用。其中用户需要滚动屏幕上的数据。并对数据进行浏览或做出更改。

创建游标

declare CustCusor cursor
for
select * from Customsers where cust_email is null;

使用游标

  • 打开游标
    open cursor CUstCusor
  • fetch 访问游标数据
    oracle 语法

declare type CustCusor is ref cursor
return Customers%ROWTYPE;
delcare CustRecord Customers%ROWTYPE
begin
open CustCusor;
fetch CustCusor INTO CustRecord;
close CustCusor;
end;

高级sql特性

约束 constraint

管理如何插入或处理数据库数据的规则

主键 primary key

保证一列中的值是唯一的。而且永不改动。主键值不能重用。删除之后不能分配给新的行。

create table Vendors(
vend_id char(10) not null primary key,
...
)

外键

外键是表中的一列。其值必须列在另一个表的主键中。
外键是保证引用完整性的极其重要的组成部分。

create table orders (
order_num integer not null primary key,
cust_id not null references Customers(cust_id)
)

PS: 外键防止意外删除。

唯一约束

保证一列的数据是唯一的。 类似于主键。
区别

  • 表可以包含多个唯一约束,但是只允许一个主键。
  • 唯一约束可以包含NULL值。
  • 唯一约束可修改
  • 唯一约束可重复使用
  • 唯一约束不能用来定义外键

关键字 UNIQUE 。 CONSTRAINT .

检查约束

用来保证一列中的数据满足一组指定的条件。

  • 最大值或最小值。 比如:防止0个物品的订单
  • 指定范围。 保证发货日期大于等于今天的日期
  • 只允许特定的值。 性别字段 M or F
create table OrderItems(
quantity integer not null check (quantity > 0)
)

alter table Customers add constraint check (gender like '[MF]')

索引

用来排序数据以加快搜索和排序操作的速度。

  • 索引改善检索操作的性能。但降低了数据插入、修改、删除的性能
  • 索引数据可能要占用大量的存储空间
  • 并非所有数据都适合做索引。取值不多的数据不如具有更多可能值的数据。
  • 索引用于数据过滤和数据排序。
  • 可以在索引中定义多个列。

create index prod_name_inx ON Products(prod_name)

触发器

触发器是特殊的存储过程。在特定的数据库活动时自动执行。
触发器可以与特定表上的INSERT、update\delete操作相关联。

触发器与单个的表相关联。
尽量使用约束。约束的处理比触发器块。

create trigger customer_state
after insert or update
begin
update customers
set cust_state = Upper(cust_state)
where Customers.cust_id = :OLD.cust_id
end;

数据库安全

grand 和revoke语句来管理。

posted on   llcl  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
 
点击右上角即可分享
微信分享提示