美文网首页
MySQL语法(二) 数据的写入与基本的查询

MySQL语法(二) 数据的写入与基本的查询

作者: 石志不渝 | 来源:发表于2023-09-09 11:38 被阅读0次

表数据的初步操作(简单写入与查询)

对表数据的操作,主要包括增、删、改。而数据库最重要的应用之一,则是:查。

一 新增数据

语法

insert into <table_name>[(col_name1,col_name2,...)] values(),(),...

解释:

  1. insert into 写入
  2. <table_name> 要写入数据的表名
  3. [(col_name1,col_name2,...)] 要写数据的字段,可选,如果不指定,则是向所有字段中写入数据
  4. 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')

几个注意事项:

  1. 如果指定字段与要写入的值不对应,则会报错,比如:
     /*
     报错  指定的字敦和要写入的值数量不匹配
     */
     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');
    
  2. 如果要写入的数据,违反了字段的约束条件,则无法写入。比如:
    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];

解释:

  1. <col_list>为你要查询的字段,可以直接使用*号替代,\color{red}{但不建议}。指定的字段字段之间使用,分割。
  2. <table_name> 要查询的表名
  3. [WHERE condition] 查询条件,可选
  4. [ORDER BY <column_name> [ASC | DESC]] 依据哪个字段(<column_name>)排序,ASC为正序,DESC为倒叙
  5. [LIMIT offset, row_count] 查询结果的数量和偏移,如果没有offset可以直接使用[LIMIT row_count]

示例:

  1. 使用星号,可以查出所有字段。不推荐
     use db_test;
     select * from info_sales;
    
  2. 可以指定想要查询的具体字段
    use db_test;
    select product_code,sale_id,sale_quantity 
    from info_sales 
    
  3. 添加条件过滤 等号
    use db_test;
    select product_code,sale_id,sale_quantity 
    from info_sales 
    where sale_id='a778'
    
  4. 添加条件过滤 大于 小于号
    use db_test;
    select product_code,sale_id,sale_quantity 
    from info_sales 
    where sale_quantity>0 
    
  5. 添加条件过滤 同时满足多个条件
    use db_test;
    select product_code,sale_id,sale_quantity 
    from info_sales 
    where sale_quantity>0 and sale_quantity<10
    
  6. 添加条件过滤 满足多个条件之一
    use db_test;
    select product_code,sale_id,sale_quantity 
    from info_sales 
    where sale_quantity>0 or sale_id='a778'
    
  7. 排序。正(由小到大)
    use db_test;
    select product_code,sale_id,sale_quantity 
    from info_sales 
    where sale_quantity>0
    order by sale_quantity asc
    
  8. 排序。倒序(由大到小)
    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的货物。那么,我们可以选择几种不同的形势去组织数据:

  1. 货物表为主,将所有货物表中有的,都列出来(无论是否销售);货物表里没有的,不列;那么,表格数据就应该如下
    货物编号 货物名称 销售时间 销售数量 销售编号
    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
  2. 销售表为主,将所有销售表中有的,都列出来(无论货物表里是否有);销售表里没有的,不列;那么,表格数据就应该如下
    货物编号 货物名称 销售时间 销售数量 销售编号
    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
  3. 以两个表里\color{red}{共有}的数据为准,只列在两个表里都有的;那么,表格数据就应该如下
    货物编号 货物名称 销售时间 销售数量 销售编号
    a0001 苹果 2021-04-01 10 a770
    a0010 西瓜 2021-04-01 16 a771
    a0001 苹果 2021-04-01 4 a773
  4. 最大范围列出数据,只要在两个表里有的,都列出来,那么表格数据应该如下
    货物编号 货物名称 销售时间 销售数量 销售编号
    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

上面所说的这些组织数据的方式,数据库中叫做关联查询或者连接查询。而上面四种方式,也都有自己的名字和语法。

  1. 左连接 (关键字:left join)。就是以你更\color{red}{早}列出的查询表名为基础进行数据组织。
    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
    
  2. 右连接 (关键字:right join)。就是以你更\color{red}{晚}列出的查询表名为基础进行数据组织。
    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
    
  3. 内连接(关键字:inner join)。查出两个表里\color{red}{共同存在}的数据。
    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
    
  4. 全连接。查出两个表里\color{red}{所有}的数据。mysql中,并没有为全连接的直接查询提供支持,需要多个语句的组合,较为复杂,此处暂时不涉及。

相关文章

网友评论

      本文标题:MySQL语法(二) 数据的写入与基本的查询

      本文链接:https://www.haomeiwen.com/subject/qvcjvdtx.html