zoukankan      html  css  js  c++  java
  • MYSQL复习笔记4-基本SQL语句

    Date: 20140115
    Auth: Jin
    参考:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#select
    一:数据库操作
    1:显示数据库mysql> show databases;
    2:创建数据库mysql> create database sky;
    mysql> CREATE DATABASE sky CHARACTER SET utf8 COLLATE utf8_general_ci;
    3:选择数据库mysql> use sky;
    4: 查看当前数据mysql> select database();
    5:删除数据库mysql> drop database sky;
    6、修改数据名
    修改数据库目录,貌似不是一个好方法
    创建一个新库,然后dump管道导入新库,这个也是整库复制的方法
    ALTER {DATABASE | SCHEMA} [db_name]
    ALTER DATABASE用于更改数据库的全局特性。这些特性储存在数据库目录中的db.opt文件中
    CHARACTER SET子句用于更改默认的数据库字符集。COLLATE子句用于更改默认的数据库校对集(COLLATE)
    mysql> alter database dbtest CHARACTER SET utf8 COLLATE utf8_general_ci;
    Query OK, 1 row affected (0.01 sec)
    字符集介绍
    http://blog.sina.com.cn/s/blog_9707fac301016wxm.html
    mysql> show variables like '%character%';
    +--------------------------+----------------------------+
    | Variable_name | Value |
    +--------------------------+----------------------------+
    | character_set_client | latin1 |
    | character_set_connection | latin1 |
    | character_set_database | utf8 |
    | character_set_filesystem | binary |
    | character_set_results | latin1 |
    | character_set_server | latin1 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)

    二:表结构操作
    <一>基本表操作
    1:显示数据表,需要先选择数据库
    mysql> use mysql;
    mysql> show tables;

    2:创建数据表
    mysql> use diege;
    create table 表名 (字段1,字段2,…字段n,[表级约束] [Type|Engine=表类型|存储引擎]
    其中字段格式为:
    字段名 字段类型 [字段约束]
    create table 表名 (字段名1 字段类型1 [字段约束]1,字段2,…字段n,[表级约束] [Type|Engine=表类型|存储引擎]

    mysql> create table tb_name(
    -> id int(6) not null auto_increment,
    -> uname char(15) not null,
    -> sex bit default 1,
    -> birthday date not null default '1970-01-01',
    -> email varchar(20) default null,
    -> comment varchar(100),
    -> primary key(id),
    -> unique(uname)
    -> )ENGINE=Innodb default charset=utf8;

    3 查看表结构
    mysql> describe tb_name;
    mysql> desc tb_name;

    4:复制表
    mysql> create table new_tb_name like tb_name;

    5:根据已存在表的字段产生新表
    SELECT vale1, value2 into Table2 from Table1
    要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。
    Mysql不支持。SQL SERVER支持
    MYSQL可用的方法
    没有指定列
    mysql> create table temp_diege select * from temp_username;
    复制指定列的数据
    mysql> create table temp_diege select username,ctime from log
    mysql> create table testproduct select productId,pname from Product;
    Query OK, 9 rows affected (5.00 sec)
    Records: 9 Duplicates: 0 Warnings: 0
    注意只复制,字段和数据,不会复制索引

    比较:
    Insert into Table2(field1,field2,...) select value1,value2,... from Table1
    要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。

    6:删除表格
    mysql> drop table new_tb_name;

    <二>修改表操作
    字段操作包括:add,drop,change,modify,
    表操作rename(更改表名)
    1. 改变表的名字
    mysql> alter table tb_name1 rename tb_name2;

    2. 增加列
    alter table tb_name add col_name type
    mysql> alter table tb_name add age smallint;
    好像没办法同时添加两列
    增加列并设置默认值
    mysql> alter table tb_name add age smallint default 0;
    增加列并设置为索引
    mysql> alter table tb_name add age smallint not null primary key;
    mysql> alter table tb_name add age smallint not null unique;

    3. 删除列
    alter table tbl_name drop col_name
    mysql> alter table tb_name drop age;

    4. 改变列名字
    alter table tbl_name change old_col_name col_name
    mysql> alter table tb_name change nianning age;
    ERROR 1064 (42000): You have an error in your SQL syntax;
    mysql> alter table tb_name change nianning age int(4);
    必须要指定字段类型,原来什么字段就是什么字段即可

    5. 改变列属性
    方法1:
    alter table tbl_name modify col_name type
    mysql> alter table tb_name modify age int(2);
    从smallint修改为int(2)
    方法2
    alter table tbl_name change old_col_name col_name type
    mysql> alter table tb_name change age age smallint;
    从int(2)修改为smallint

    改变列名的同时改变属性
    mysql> alter table tb30 change uname username varchar(30);
    mysql> alter table tb_name change age nianning int(4);

    6、改变列的属性,为字段添加默认值
    字段已存在,不改变字段的名字和类型,只增加默认值
    mysql> alter table tb_name modify age int(4) default 18;
    必须要指定字段的类型

    <三>修改表添加和删除索引
    (一)添加新字段为为索引
    也就是添加新字段,只不过约束为是索引
    主键索引
    mysql> alter table tb_name add uid int(11) not null primary key;
    唯一索引
    mysql> alter table tb1 add uname varchar(25) not null unique;
    全文索引
    mysql> alter table tb2 add fulltext(email);
    ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes
    innodb不支持全文索引
    普通索引
    不知道怎么直接加,只有新加列再修改为普通索引
    mysql> alter table tb1 add email varchar(50) not null;
    mysql> alter table tb1 add index index_email(email);

    多列索引-联合索引
    先添加两列,然后两列组成联合索引
    mysql> alter table tb1 add username varchar(50) not null;
    mysql> alter table tb1 add uuid int(11) not null;
    mysql> alter table tb1 add index un_index(uuid,username);

    (二)修改原来的字段为索引
    改变列的属性,将现有字段修改为索引
    字段已存在,不改变字段的名字和类型,只是修改该字段为索引
    PRIMARY KEY 主键索引-只可以添加一个,Key_name为PRIMARY
    mysql>ALTER TABLE `table_name`add PRIMARY KEY( `column` )
    mysql> alter table tb1 add PRIMARY KEY(id);
    UNIQUE 唯一索引-可以添加多个, Key_name为字段名,同一个子段都可以添加多次
    mysql>ALTER TABLE `table_name`add UNIQUE( `column` )
    mysql> alter table tb1 add UNIQUE(uname);
    FULLTEXT 全文索引 InnoDB 不支持全文索引
    mysql>ALTER TABLE `table_name` add FULLTEXT( `column` )
    mysql> alter table tb1 add FULLTEXT(comment);
    ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes
    INDEX 普通索引
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
    mysql> alter table tb1 add index index_email(email);
    多列索引-联合索引 联合索引本质上还是普通索引
    mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
    mysql> alter table tb1 add index index_union(id,uname);
    注意:字段不用引号括起来

    (三)查看索引
    mysql> show index from tblname;
    mysql> show keys from tblname;
    mysql> show keys from tb1;
    +-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------
    +------------+---------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null |
    Index_type | Comment |
    +-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------
    +------------+---------+
    | tb1 | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE
    | |
    | tb1 | 0 | uname | 1 | uname | A | 0 | NULL | NULL | | BTREE
    | |
    | tb1 | 1 | index_email | 1 | email | A | 0 | NULL | NULL | | BTREE
    | |
    | tb1 | 1 | index_union | 1 | id | A | 0 | NULL | NULL | | BTREE
    | |
    | tb1 | 1 | index_union | 2 | uname | A | 0 | NULL | NULL | | BTREE
    | |
    +-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------
    +------------+---------+
    · Table
    表的名称。
    · Non_unique
    如果MySQL索引不能包括重复词,则为0。如果可以,则为1。
    · Key_name
    索引的名称。#普通索引才可以指定列名称
    · Seq_in_index 
    索引中的列序列号,从1开始。
    · Column_name
    列名称。
    · Collation
    列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
    · Cardinality
    MySQL索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,
    该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。

    · Sub_part
    如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
    · Packed
    指示关键字如何被压缩。如果没有被压缩,则为NULL。
    · Null
    如果列含有NULL,则含有YES。如果没有,则该列含有NO。
    · Index_type
    用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
    · Comment

    (四)修改表删除索引
    ALTER TABLE 'table_name' DROP INDEX index_name;
    普通索引
    mysql> alter table tb1 drop index index_email;
    唯一索引【唯一索引也像普通索引一样删除】
    mysql> alter table tb1 drop index uname;
    主健索引
    mysql> alter table tb1 drop PRIMARY KEY;
    【注意】:如果主键索引是自增列是无法删除

     三:处理表数据

    insert,delete,update

    准备演示的表

    mysql> create table users (
    -> id int(6) not null auto_increment,
    -> uname varchar(25) not null,
    -> sex bit default 0,
    -> birthday date default '1970-1-1',
    -> email char(35),
    -> department varchar(50),
    -> comment varchar(200) ,
    -> PRIMARY KEY(id),
    -> UNIQUE(uname)
    -> )ENGINE=Innodb DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected (0.04 sec)
    mysql> describe users;
    +------------+--------------+------+-----+------------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +------------+--------------+------+-----+------------+----------------+
    | id | int(6) | NO | PRI | NULL | auto_increment |
    | uname | varchar(25) | NO | UNI | NULL | |
    | sex | bit(1) | YES | | b'0' | |
    | birthday | date | YES | | 1970-01-01 | |
    | email | char(35) | YES | | NULL | |
    | department | varchar(50) | YES | | NULL | |
    | comment | varchar(200) | YES | | NULL | |
    +------------+--------------+------+-----+------------+----------------+
    7 rows in set (0.00 sec)

    1、插入记录 insert
    Insert into 表名 (字段1,字段2,…) values (字段1的值,字段2的值,…);
    关键字value或者values都可以

    插入必须字段,有默认值和自增列字段外的所有字段
    mysql> insert into users (uname,email,department,comment) value ('diege','diege@foxmail.com','tech','a good boy');
    mysql> select * from users;
    +----+-------+------+------------+-------------------+------------+------------+
    | id | uname | sex | birthday | email | department | comment |
    +----+-------+------+------------+-------------------+------------+------------+
    | 1 | diege | | 1970-01-01 | diege@foxmail.com | tech | a good boy |
    +----+-------+------+------------+-------------------+------------+------------+

    插入所有字段,插入所有字段就没有必要列出字段了
    mysql> insert into users values (2,'lily',1,'1990-01-01','lily@foxmail.com','product','a good work');
    mysql> select * from users where uname='lily';
    +----+-------+------+------------+------------------+------------+-------------+
    | id | uname | sex | birthday | email | department | comment |
    +----+-------+------+------------+------------------+------------+-------------+
    | 2 | lily |  | 1990-01-01 | lily@foxmail.com | product | a good work |
    +----+-------+------+------------+------------------+------------+-------------+
    1 row in set (0.00 sec

    一个insert插入多条记录
    mysql> insert into users (uname,email,department,comment) value ('tom','tom@foxmail.com','tech','a good worker'),
    ('sum','sum@foxmail.com','product','a good boy')

    2、删除记录 delete 和truncate
    (1)清空表
    mysql> delete from table_name;
    mysql> truncate table_name;
    两者区别
    truncate 相当于drop table table_nam,然后再create table_name 速度快
    delete from table_name; 是一条条记录删除
    (2)根据条件删除
    一般不会delete from table_name 删除数据,都会根据条件删除,所以要根据where子句约束删除的范围
    mysql> delete from users where uname='lily';
    mysql> delete from users where uname like 'lily%';
    mysql> delete from users where id > 5;
    mysql> delete from users where uname like 'tom%' and department='tech';
    (3)同时删除多表记录
    两张表:Product表和ProductPrice表。前者存在Product的基本信息,后者存在Product的价格。

    mysql> create table Product (
    -> productId intdesign(6) not null auto_increment,
    -> pname varchar(25) not null,
    -> created date default '2000-1-1',
    -> PRIMARY KEY(productId),
    -> UNIQUE(pname)
    -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    mysql> create table ProductPrice (
    -> productId int(6) not null,
    -> price int not null,
    -> PRIMARY KEY(productId)
    -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    插入测试数据
    mysql> insert into Product(pname,created) values ('hat1','2000-11-25'),('hat2','2003-11-25'),('hat3','2008-06-25'),
    ('hat4','2010-08-08');
    mysql> insert into Product(pname,created) values ('T-Shirts1','2004-06-15'),('T-Shirts2','2002-11-10'),('T-Shirts3','2000-03
    -19'),('T-Shirts4','2013-07-15'),('T-Shirts5','2009-04-05')
    mysql> select * from Product;
    +-----------+-----------+------------+
    | productId | pname | created |
    +-----------+-----------+------------+
    | 1 | hat1 | 2000-11-25 |
    | 2 | hat2 | 2003-11-25 |
    | 3 | hat3 | 2008-06-25 |
    | 4 | hat4 | 2010-08-08 |
    | 15 | T-Shirts1 | 2004-06-15 |
    | 16 | T-Shirts2 | 2002-11-10 |
    | 17 | T-Shirts3 | 2000-03-19 |
    | 18 | T-Shirts4 | 2013-07-15 |
    | 19 | T-Shirts5 | 2009-04-05 |
    +-----------+-----------+------------+
    mysql> insert ProductPrice values (1,100),(2,88),(3,150),(4,218),(15,190),(16,168),(17,218),(18,298),(19,398);
    注意 这里的id没有外键约束
    备份两份数据
    mysql> create table ProductBak select * from Product;
    mysql> create table ProductPriceBak select * from ProductPrice;

    第一种跨表删除的方式是不用join,在delete时指定用半角逗号分隔多个表来删除,如下sql语句:
    mysql> select a.*,b.* from Product as a,ProductPrice as b where a.productId=b.productId and a.created < '2004-01-01';
    +-----------+-----------+------------+-----------+-------+
    | productId | pname | created | productId | price |
    +-----------+-----------+------------+-----------+-------+
    | 1 | hat1 | 2000-11-25 | 1 | 100 |
    | 2 | hat2 | 2003-11-25 | 2 | 88 |
    | 16 | T-Shirts2 | 2002-11-10 | 16 | 168 |
    | 17 | T-Shirts3 | 2000-03-19 | 17 | 218 |
    +-----------+-----------+------------+-----------+-------+

    mysql> select p.*, pp.* FROM Product p, ProductPrice pp WHERE p.ProductId = pp.productId AND p.created < '2004-01-01';

    +-----------+-----------+------------+-----------+-------+
    | productId | pname | created | productId | price |
    +-----------+-----------+------------+-----------+-------+
    | 1 | hat1 | 2000-11-25 | 1 | 100 |
    | 2 | hat2 | 2003-11-25 | 2 | 88 |
    | 16 | T-Shirts2 | 2002-11-10 | 16 | 168 |
    | 17 | T-Shirts3 | 2000-03-19 | 17 | 218 |
    +-----------+-----------+------------+-----------+-------+
    4 rows in set (0.01 sec)

    删除操作

    DELETE p.*, pp.* 
    FROM product p, productPrice pp 
    WHERE p.productId = pp.productId 
    AND p.created < '2004-01-01' 

    两张表都删除

    mysql> delete a.*,b.* from Product as a,ProductPrice as b where a.productId=b.productId and a.created < '2004-01-01'; 

    确认
    mysql> select a.*,b.* from Product as a,ProductPrice as b where a.productId=b.productId and a.created < '2004-01-01';
    Empty set (0.00 sec)
    两个表个删除4条
    只删除其中一张表
    用 p.created > '2004-01-01'; 做条件
    mysql> select a.*,b.* from Product as a,ProductPrice as b WHERE a.ProductId = b.productId AND a.created > '2004-01-01';
    +-----------+-----------+------------+-----------+-------+
    | productId | pname | created | productId | price |
    +-----------+-----------+------------+-----------+-------+
    | 3 | hat3 | 2008-06-25 | 3 | 150 |
    | 4 | hat4 | 2010-08-08 | 4 | 218 |
    | 15 | T-Shirts1 | 2004-06-15 | 15 | 190 |
    | 18 | T-Shirts4 | 2013-07-15 | 18 | 298 |
    | 19 | T-Shirts5 | 2009-04-05 | 19 | 398 |
    +-----------+-----------+------------+-----------+-------+
    上面如果除去一个相同的字段productId则为自然连接
    已经删除ProductPrice以为例

    mysql> delete b.* from Product as a,ProductPrice as b WHERE a.ProductId = b.productId AND a.created > '2004-01-01';

    查询ProductPrice表
    mysql> select * from ProductPrice;
    Empty set (0.00 sec)
    mysql> select * from Product;
    +-----------+-----------+------------+
    | productId | pname | created |
    +-----------+-----------+------------+
    | 3 | hat3 | 2008-06-25 |
    | 4 | hat4 | 2010-08-08 |
    | 15 | T-Shirts1 | 2004-06-15 |
    | 18 | T-Shirts4 | 2013-07-15 |
    | 19 | T-Shirts5 | 2009-04-05 |
    +-----------+-----------+------------+
    5 rows in set (0.00 sec)


    第二种跨表删除的方式是使用inner join在join中指定两表之间的关联关系,如下sql语句:
    mysql> select a.*,b.* from Product as a INNER JOIN ProductPrice as b ON a.productID = b.productID WHERE a.created < '2004-01
    -01';
    +-----------+-----------+------------+-----------+-------+
    | productId | pname | created | productId | price |
    +-----------+-----------+------------+-----------+-------+
    | 1 | hat1 | 2000-11-25 | 1 | 100 |
    | 2 | hat2 | 2003-11-25 | 2 | 88 |
    | 6 | T-Shirts2 | 2002-11-10 | 6 | 168 |
    | 7 | T-Shirts3 | 2000-03-19 | 7 | 218 |
    +-----------+-----------+------------+-----------+-------+
    4 rows in set (0.00 sec)
    mysql> select p.*, pp.* FROM Product p INNER JOIN ProductPrice pp ON p.productId = pp.productId WHERE p.created < '2004
    -01-01';
    +-----------+-----------+------------+-----------+-------+
    | productId | pname | created | productId | price |
    +-----------+-----------+------------+-----------+-------+
    | 1 | hat1 | 2000-11-25 | 1 | 100 |
    | 2 | hat2 | 2003-11-25 | 2 | 88 |
    | 6 | T-Shirts2 | 2002-11-10 | 6 | 168 |
    | 7 | T-Shirts3 | 2000-03-19 | 7 | 218 |
    +-----------+-----------+------------+-----------+-------+
    INNER连接
    关键字 A INNER JOIN B ON A.id=B.id
    Product as a INNER JOIN ProductPrice as b ON a.productID = b.productID

    DELETE p.*, pp.* 
    FROM product p 
    INNER JOIN productPrice pp 
    ON p.productId = pp.productId 
    WHERE p.created < '2004-01-01'
    mysql> delete a.*,b.* from Product as a INNER JOIN ProductPrice as b ON a.productID = b.productID WHERE a.created < '2004- 
    01-01'; 

    确认
    mysql> select a.*,b.* from Product as a INNER JOIN ProductPrice as b ON a.productID = b.productID WHERE a.created < '2004-
    01-01';
    Empty set (0.01 sec)
    只删除一个表
    这次我删除物品表格
    mysql> select a.*,b.* from Product as a INNER JOIN ProductPrice as b ON a.productID = b.productID WHERE a.created > '2004-01
    -01';
    +-----------+-----------+------------+-----------+-------+
    | productId | pname | created | productId | price |
    +-----------+-----------+------------+-----------+-------+
    | 3 | hat3 | 2008-06-25 | 3 | 150 |
    | 4 | hat4 | 2010-08-08 | 4 | 218 |
    | 5 | T-Shirts1 | 2004-06-15 | 5 | 190 |
    | 8 | T-Shirts4 | 2013-07-15 | 8 | 298 |
    | 9 | T-Shirts5 | 2009-04-05 | 9 | 398 |
    +-----------+-----------+------------+-----------+-------+

    mysql> delete b.* from Product as a INNER JOIN ProductPrice as b ON a.productID = b.productID WHERE a.created > '2004-01-01'; 

    确认
    mysql> select * from ProductPrice;
    Empty set (0.00 sec)
    mysql> select * from Product;
    +-----------+-----------+------------+
    | productId | pname | created |
    +-----------+-----------+------------+
    | 3 | hat3 | 2008-06-25 |
    | 4 | hat4 | 2010-08-08 |
    | 5 | T-Shirts1 | 2004-06-15 |
    | 8 | T-Shirts4 | 2013-07-15 |
    | 9 | T-Shirts5 | 2009-04-05 |
    +-----------+-----------+------------+
    5 rows in set (0.00 sec)

    注意:跨表删除不必删除所有表的数据,上面的sql语句表会同时删除Product和ProductPrice两张表中的数据,但是你可以指定 DELETE
    product.*从而只删除product表中的记录,
    而不处理ProductPrice表中的记录。

    跨表删除也可以使用left join,例如我们要删除所有在ProductPrice表中没有记录的Product表记录。如下sql语句:
    DELETE p.*
    FROM product p
    LEFT JOIN productPrice pp
    ON p.productId = pp.productId
    WHERE pp.productId is null

    3 修改记录 update
    update tb_name set 字段=值1,子段2=值2 where 条件
    1)修改单个记录
    mysql> update users set uname='hellen' where id=2;

    2)修改一个表的多条记录
    mysql> update users set sex=1 where id>2;
    Query OK, 3 rows affected (0.37 sec)
    还是条件控制,条件控制一个还是多个,控制需要修改的记录范围

    3)跨表修改多条记录
    http://www.jb51.net/article/32648.htm
    假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price;另外一张表是ProductPrice表,
    我们要将ProductPrice表中的价格字段Price更新为Price表中价格字段的80%。
    准备表
    mysql> describe Product;
    +-----------+-------------+------+-----+------------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +-----------+-------------+------+-----+------------+----------------+
    | productId | int(6) | NO | PRI | NULL | auto_increment |
    | pname | varchar(25) | NO | UNI | NULL | |
    | created | date | YES | | 2000-01-01 | |
    +-----------+-------------+------+-----+------------+----------------+
    3 rows in set (0.00 sec)

    mysql> describe ProductPrice;
    +-----------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-----------+---------+------+-----+---------+-------+
    | productId | int(6) | NO | PRI | NULL | |
    | price | int(11) | NO | | NULL | |
    +-----------+---------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
    mysql> alter table Product add price int(11) default 200;
    mysql> update Product as a,ProductPrice as b set a.price=b.price where a.productId=b.productId;
    Query OK, 9 rows affected (0.01 sec)
    Rows matched: 9 Changed: 9 Warnings: 0
    上面仅仅是准备数据,可以无视
    mysql> select * from Product;
    +-----------+-----------+------------+-------+
    | productId | pname | created | price |
    +-----------+-----------+------------+-------+
    | 1 | hat1 | 2000-11-25 | 100 |
    | 2 | hat2 | 2003-11-25 | 88 |
    | 3 | hat3 | 2008-06-25 | 150 |
    | 4 | hat4 | 2010-08-08 | 218 |
    | 15 | T-Shirts1 | 2004-06-15 | 190 |
    | 16 | T-Shirts2 | 2002-11-10 | 168 |
    | 17 | T-Shirts3 | 2000-03-19 | 218 |
    | 18 | T-Shirts4 | 2013-07-15 | 298 |
    | 19 | T-Shirts5 | 2009-04-05 | 398 |
    +-----------+-----------+------------+-------+
    9 rows in set (0.00 sec)
    假设Product中price 是总公司的产品定价,现在网络商务部要搞双11活到,所有商品8折,现在要修改对外显示的ProductPrice的表
    方法1,类自然连接

    mysql> update Product as a,ProductPrice as b set b.price=a.price*0.8 where a.productId=b.productId; 
    Query OK, 9 rows affected (0.01 sec)
    Rows matched: 9 Changed: 9 Warnings: 0

    确认
    mysql> select * from ProductPrice;
    +-----------+-------+
    | productId | price |
    +-----------+-------+
    | 1 | 80 |
    | 2 | 70 |
    | 3 | 120 |
    | 4 | 174 |
    | 15 | 152 |
    | 16 | 134 |
    | 17 | 174 |
    | 18 | 238 |
    | 19 | 318 |
    +-----------+-------+
    9 rows in set (0.00 sec)
    方法2 内连接 INNER JOIN on set

    mysql> update Product as a INNER JOIN ProductPrice as b ON a.productId=b.productId set b.price=a.price*0.6 where a.created < 
    '2004-01-01'; 
    Query OK, 0 rows affected (0.01 sec)
    Rows matched: 4 Changed: 0 Warnings: 0

    方法3 左外连接 left outer join #未实践

    UPDATE product p
    LEFT JOIN productPrice pp
    ON p.productId = pp.productId
    SET p.deleted = 1
    WHERE pp.productId IS null

    同时修改两个表

    UPDATE product p 
    INNER JOIN productPrice pp 
    ON p.productId = pp.productId 
    SET pp.price = pp.price * 0.8, 
    p.dateUpdate = CURDATE() 
    WHERE p.dateCreated < '2004-01-01';
  • 相关阅读:
    node
    github
    [模块] pdf转图片-pdf2image
    python 15 自定义模块 随机数 时间模块
    python 14 装饰器
    python 13 内置函数II 匿名函数 闭包
    python 12 生成器 列表推导式 内置函数I
    python 11 函数名 迭代器
    python 10 形参角度 名称空间 加载顺序
    python 09 函数参数初识
  • 原文地址:https://www.cnblogs.com/diege/p/3538492.html
Copyright © 2011-2022 走看看