MySQL语法(二) 数据的写入与基本的查询
2023-09-09 本文已影响0人
石志不渝
表数据的初步操作(简单写入与查询)
对表数据的操作,主要包括增、删、改。而数据库最重要的应用之一,则是:查。
一 新增数据
语法
insert into <table_name>[(col_name1,col_name2,...)] values(),(),...
解释:
-
insert into
写入 -
<table_name>
要写入数据的表名 -
[(col_name1,col_name2,...)]
要写数据的字段,可选,如果不指定,则是向所有字段中写入数据 -
values
值,其后面括号里,需要包裹具体的,要写入的数据。括号里数据的排列顺序,与上述第三步中,指定字段的顺序需要相同;如果没指定字段,则需要和数据表的字段定义顺序相同。每一个括号为一条记录。指定字段时,可以随意指定顺序,值和指定的顺序对应就可以。
示例:
/*建表语句*/
use db_test;
drop table if exists info_sales;
CREATE TABLE info_sales (
product_code varchar(255) NOT NULL,
sale_date date NOT NULL,
sale_quantity int,
sale_id varchar(255) PRIMARY key NOT NULL
);
/*
写入单条数据
*/
insert into info_sales values('0011','2021-01-01',5,'a771')
/*
写入多条
*/
insert into info_sales
values
('0011','2021-01-01',5,'a772'),
('1012','2021-01-01',13,'a773')
/*
指定字敦写入
*/
insert into info_sales(product_code,sale_date,sale_id)
values('a3325','2021-04-01','a774')
几个注意事项:
- 如果指定字段与要写入的值不对应,则会报错,比如:
/* 报错 指定的字敦和要写入的值数量不匹配 */ use db_test; insert into info_sales(product_code,sale_date,sale_id) values('a3325','2021-04-01',3,'a775'); use db_test; insert into info_sales values('a3325','2021-04-01','a776');
- 如果要写入的数据,违反了字段的约束条件,则无法写入。比如:
use db_test; /* 报错 主键重复 */ insert into info_sales(product_code,sale_date,sale_id) values('a3325','2021-04-01','a773'); /* 报错 不允许为null,需要有一个默认值 */ use db_test; insert into info_sales(sale_date,sale_id) values('2021-04-01','a777'); /*对有 not null约束条件的字段,解决方法一 传入空*/ use db_test; insert into info_sales(product_code,sale_date,sale_id) values('','2021-04-01','a777'); /*解决方法二 设置默认值*/ use db_test; alter table info_sales MODIFY product_code varchar(255) not null default ''; insert into info_sales(sale_date,sale_id) values('2021-04-01','a778');
二 查询数据
2.1. 单表查询
单表查询,顾名思义,用于从单一表中查询数据。语法:
SELECT <col_list> FROM <table_name> [WHERE condition]
[ORDER BY <column_name> [ASC | DESC]] [LIMIT offset, row_count];
解释:
-
<col_list>
为你要查询的字段,可以直接使用*
号替代,。指定的字段字段之间使用,
分割。 -
<table_name>
要查询的表名 -
[WHERE condition]
查询条件,可选 -
[ORDER BY <column_name> [ASC | DESC]]
依据哪个字段(<column_name>
)排序,ASC
为正序,DESC
为倒叙 -
[LIMIT offset, row_count]
查询结果的数量和偏移,如果没有offset
可以直接使用[LIMIT row_count]
示例:
- 使用星号,可以查出所有字段。不推荐
use db_test; select * from info_sales;
- 可以指定想要查询的具体字段
use db_test; select product_code,sale_id,sale_quantity from info_sales
- 添加条件过滤 等号
use db_test; select product_code,sale_id,sale_quantity from info_sales where sale_id='a778'
- 添加条件过滤 大于 小于号
use db_test; select product_code,sale_id,sale_quantity from info_sales where sale_quantity>0
- 添加条件过滤 同时满足多个条件
use db_test; select product_code,sale_id,sale_quantity from info_sales where sale_quantity>0 and sale_quantity<10
- 添加条件过滤 满足多个条件之一
use db_test; select product_code,sale_id,sale_quantity from info_sales where sale_quantity>0 or sale_id='a778'
- 排序。正(由小到大)
use db_test; select product_code,sale_id,sale_quantity from info_sales where sale_quantity>0 order by sale_quantity asc
- 排序。倒序(由大到小)
use db_test; select product_code,sale_id,sale_quantity from info_sales where sale_quantity>0 order by sale_quantity desc
2.2. 多表查询
之前我们多次提到过,关系型数据库,存在大量的多表关系。比如我们有销售表和货物表,我想查看货物的基本信息和每一笔销量情况,怎么办?
销售表:
货物编号 | 销售时间 | 销售数量 | 销售编号 |
---|---|---|---|
a0001 | 2021-04-01 | 10 | a770 |
a0010 | 2021-04-01 | 16 | a771 |
a009 | 2021-04-01 | 5 | a772 |
a0001 | 2021-04-01 | 4 | a773 |
货物表:
货物编号 | 货物名称 |
---|---|
a0001 | 苹果 |
a0010 | 西瓜 |
a0035 | 洗衣液 |
a0037 | 牛油果 |
如我们前述所将,我们可以使用货物编号
字段将两个表进行关联,但可以发现,销售表
中的货物类别,与货物表
中并不对应,比如货物表中,没有编号为a009
的货物,而销售表中,没有编号为a0037
的货物。那么,我们可以选择几种不同的形势去组织数据:
- 以
货物表
为主,将所有货物表中有的,都列出来(无论是否销售);货物表里没有的,不列;那么,表格数据就应该如下货物编号 货物名称 销售时间 销售数量 销售编号 a0001 苹果 2021-04-01 10 a770 a0001 苹果 2021-04-01 4 a773 a0010 西瓜 2021-04-01 16 a771 a0035 洗衣液 NULL NULL NULL a0037 牛油果 NULL NULL NULL - 以
销售表
为主,将所有销售表中有的,都列出来(无论货物表里是否有);销售表里没有的,不列;那么,表格数据就应该如下货物编号 货物名称 销售时间 销售数量 销售编号 a0001 苹果 2021-04-01 10 a770 a0010 西瓜 2021-04-01 16 a771 NULL NULL 2021-04-01 16 a772 a0001 苹果 2021-04-01 4 a773 - 以两个表里的数据为准,只列在两个表里都有的;那么,表格数据就应该如下
货物编号 货物名称 销售时间 销售数量 销售编号 a0001 苹果 2021-04-01 10 a770 a0010 西瓜 2021-04-01 16 a771 a0001 苹果 2021-04-01 4 a773 - 最大范围列出数据,只要在两个表里有的,都列出来,那么表格数据应该如下
货物编号 货物名称 销售时间 销售数量 销售编号 a0001 苹果 2021-04-01 10 a770 a0001 苹果 2021-04-01 4 a773 a0010 西瓜 2021-04-01 16 a771 NULL NULL 2021-04-01 16 a772 a0035 洗衣液 NULL NULL NULL a0037 牛油果 NULL NULL NULL
上面所说的这些组织数据的方式,数据库中叫做关联查询
或者连接查询
。而上面四种方式,也都有自己的名字和语法。
- 左连接 (关键字:
left join
)。就是以你更列出的查询表名为基础进行数据组织。select code,goods_name,sale_date,sale_quantity,sale_id from info_goods left join info_sales on info_goods.code=info_sales.product_code
- 右连接 (关键字:
right join
)。就是以你更列出的查询表名为基础进行数据组织。select code,goods_name,sale_date,sale_quantity,sale_id from info_goods right join info_sales on info_goods.code=info_sales.product_code
- 内连接(关键字:
inner join
)。查出两个表里的数据。select code,goods_name,sale_date,sale_quantity,sale_id from info_goods inner join info_sales on info_goods.code=info_sales.product_code
- 全连接。查出两个表里的数据。mysql中,并没有为全连接的直接查询提供支持,需要多个语句的组合,较为复杂,此处暂时不涉及。