zoukankan      html  css  js  c++  java
  • MySQL数据库-表操作-SQL语句(二)

    1. MySQL多表查询

    1.1 外键约束

    为了消除多张表查询出现的笛卡尔积的现象,MySQL在建表并进行多表之间的关键查询可以使用外键关联查询。

    外键:从表1(sub)的某列引用(ref)另外一个表2(main)的某列的值,把表1的这列叫做表2这列的外键。

    1.2 外键的设置使用

    比如上述最简单的员工(employee)和部门表(department),设置外键dept_id与id相关联。

    步骤如下:

    ①在多方表中设置fk外键,使用外键dept_id关联一方表中的主键id,并选择好参考表;

    ②修改选项设置中的存储引擎为InnoDB,支持设置外键操作;

    注意:在MySQL中,InnoDB支持事务和外键.MyISAM 不支持事务和外键

    上述操作也可以使用SQL语句方式修改存储引擎为InnDB:

    ALTER TABLE 表名 ENGINE='InnoDB';

    如在命令行界面输入如下语句:

    同样使用SQL语句创建外键关联:

    ALTER TABLE employee ADD CONSTRAINT employee_fk(外键名) FOREIGN KEY (dept_id) REFERENCES  dept(dept_id);

    1.3 连接查询分类

    连接查询总的分类可以用一张图来简单描述,主要分为外连接查询(左外连接、右外连接、全连接)、内连接查询(内连接、自连接)。

    1.4 内连接查询

    内连接两张表的情况如下图,连接查询得到的是两张表的交集部分。

    SQL语句写法上可分为显式隐式写法:

    隐式内连接写法:

    select <selectList>
    From table1,table2 where table1.列 = table2.列;

    显式内连接写法(推荐写法):

    select <selectList>
    From table1 [inner] join table2 on table1.列 = table2.列;

    查询实例:

    说明:本例以下所有查询以product、product_category、product_stock三张表为例;

    ①需求:查询所有商品的名称和分类名称:

    隐式写法:

    SELECT p.product_name, pc.category_name
    
    FROM product p, product_category pc
    
    WHERE p.category_id = pc.id;

    显式写法:

    SELECT p.product_name, pc.category_name
    
    FROM product p INNER JOIN product_category pc
    
    ON p.category_id = pc.id;
    
     
    SELECT p.product_name, pc.category_name
    
    FROM product p JOIN product_category pc
    
    ON p.category_id = pc.id;

    ②需求: 查询货品id,货品名称,货品所属分类名称;

    隐式写法:

    SELECT *
    
    FROM product p, product_category pc
    
    WHERE p.category_id = pc.id AND
    
    p.sale_price > 200 AND pc.category_name = '无线鼠标';

    显式写法:

    SELECT *
    
    FROM product p
    
    JOIN product_category pc ON p.category_id = pc.id
    
    AND p.sale_price > 200 AND pc.category_name = '无线鼠标';

    1.5 外连接查询

    外连接查询分为左外连接查询右外连接查询

    左外连接:查询出JOIN左边表的全部数据与右表满足ON条件的部分,JOIN右边表不匹配的数据使用NULL来填充数据行。

    右外连接:查询出JOIN右边表的全部数据与左表满足ON条件的部分,JOIN左边表不匹配的数据使用NULL来填充数据行。

    语法格式:

    select <selectList>
    
    from table1 left/right [outer] join table2
    
    on table1.列 = table2.列;

    查询实例:

    查询每种商品名称,分类的名称和包含的具体商品总数(storeNum)

    SELECT p.product_name, pc.category_name, IFNULL(ps.store_num,0)
    
    FROM product p
    
    LEFT JOIN product_category pc
    
    ON p.category_id = pc.id
    
    LEFT JOIN product_stock ps
    
    ON p.id = ps.product_id;

    注:IFNULL(expr1,expr2)的使用是如果当前expr1为NULL,则显示expr2的值

    1.6 自连接查询

    在特定的查询场景下(商品分类、地区、权限),需要设计将表中的数据进行分类或二级关联时,可能会用到自连接查询的表设计方法。

    自连接方式:

    查询实例:

    查询每个商品分类的名称和父分类名称

    #隐式写法
    
    SELECT pare.category_name, sub.category_name FROM
    
    product_category sub, product_category pare
    
    WHERE sub.id = pare.parent_id;
    # 显示写法
    
    SELECT pare.category_name, sub.category_name FROM
    
    product_category sub JOIN product_category pare
    
    ON sub.id = pare.parent_id;

    查询结果:

    1.7 子查询

    子查询(嵌套查询):一个查询语句嵌套在另一个查询语句中,内层查询的结果可以作为外层查询条件。(相当于查询出来一个结果,然后把结果当着一张表在进行查询)

    一般的,嵌套在WHERE或者FROM字句中。

    子查询(嵌套查询)一般分为单行单列子查询和单行多列子查询。

    查询实例:

    ① 单行单列子查询

    # 单行单列子查询
    
    # 查询零售价比罗技MX1100更高的所有商品信息
    
    SELECT * FROM product WHERE
    
    sale_price > ( SELECT sale_price FROM product WHERE product_name = '罗技MX1100' );

    查询结果:

    ②单行多列子查询

    # 查询分类编号和折扣与罗技M100相同的所有商品信息
    
    SELECT * FROM product WHERE (category_id, cutoff) IN (SELECT category_id, cutoff FROM product WHERE product_name = '罗技MX1100');
    
     
    
    SELECT * FROM product WHERE (category_id, cutoff) = (SELECT category_id, cutoff FROM product WHERE product_name = '罗技MX1100');

    查询结果:

    2.MySQL数据操作DML语句

    2.1 插入语句(insert)

    插入语句:一次只插入一行。

    语法:

    insert into table_name (column1,column2,column3...) values (value1, value2, value3…);

    插入多行数据记录。

    语法:

    insert into table_name (column1,column2,column3...) values
    
    (value1, value2, value3…), (value4, value5, value6…), (value7, value8, value9…);

    实例:

    # 插入一行

    INSERT INTO mytable(id, name, age, sex) VALUES (1, '', 21, 0);

    INSERT INTO mytable(sex, age, name, id) VALUES (1, 18, '小白', 2); #顺序可以打乱,只要插入的键值一一对应即可

    # 插入多行-- MySQL特有
    INSERT INTO mytable(id, name, age, sex) 
    VALUES (3, 'test01', 26, 0), (4, 'test02', 27, 1), (5, 'test03', 28, 1);

    2.2 修改语句(update)

    修改语法:

    update table_name set column1 = value1, column2 = value2, column3 = value3…
    
    [where condition];

    注意:如果省略了where语句,则是修改全表的数据。

    修改实例:

    # 修改数据
    # 将零售价大于300的货品零售价上调0.2倍
    UPDATE product SET sale_price = sale_price * 1.2 WHERE sale_price > 300;
    
    # 将零售价大于300的有线鼠标的货品零售价上调0.1倍
    UPDATE product p JOIN product_category pc ON p.category_id = pc.id 
    SET sale_price = sale_price * 1.1 WHERE sale_price > 300 AND pc.category_name = '有线鼠标';

     

    2.3 删除语句(delete)

    语法:

    delete from table_name [where condition];

    注:如果省略了where,则会全表数据都进行删除

    实例:

    # 删除一条
    
    DELETE FROM mytable WHERE id = 4;
    
    # 删除多条
    
    DELETE FROM mytable WHERE id >=3;

    3. MySQL数据备份

    MySQL数据备份有两种方式:通过Navicat工具的SQL导入/导出和使用命令行的方式导入/导出。这里主要说明使用命令行的方式。

    语法:

    导出:mysqldump -u账户 -p密码 数据库名称>脚本文件存储地

    MySql自身的数据库维护

    通过cmd命令进入dos窗口:

    mysqldump -uroot -padmin jdbcdemo> C:/shop_bak.sql

    导入:mysql -u账户 -p密码 数据库名称< 脚本文件存储地址

    mysql -uroot -padmin jdbcdemo< C:/shop_bak.sql

  • 相关阅读:
    安装VMtools vim编辑器的使用 压缩包命令 Linux下的用户管理 (第三天)
    VM虚拟机安装 常用Linux命令 网卡配置 (第二天)
    数据库的交互模式 常用的dos命令 (第一天)
    Validate US Telephone Numbers FreeCodeCamp
    Arguments Optional FreeCodeCamp
    Everything Be True FreeCodeCamp
    Binary Agents FreeCodeCamp
    Steamroller FreeCodeCamp
    Drop it FreeCodeCamp
    Smallest Common Multiple FreeCodeCamp
  • 原文地址:https://www.cnblogs.com/yif0118/p/11310979.html
Copyright © 2011-2022 走看看