澳门十大赌场最新排名 > 澳门十大赌场 > mySql常用命令,交叉连接

原标题:mySql常用命令,交叉连接

浏览次数:134 时间:2019-07-11

一、联结表

  数据仍使用前文中的数据。

1.连接数据库

1.连接

  有时候需要将连个表的数据合并成一个结果集来显示。为了解决这个问题,就需要用到JOIN连接。

 

  1、子查询

  作为子查询的SELECT语句只能查询单个列。企图检索多个列将返回错误。

-- 作为查询条件使用
-- 查看TNT2订单对应的客户ip(order表)
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2');
-- 根据TNT2订单的客户ip查看客户信息(cust表)
SELECT cust_name, cust_contact FROM customers WHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2'));
-- 作为计算字段使用
-- 计算每个客户的订单数据
SELECT cust_name, cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS orders FROM customers ORDER BY cust_name;

  mysql -u用户名 -p密码

2.内部连接

  内部连接根据一个或几个共同的字段将记录匹配到一起。内部连接仅仅返回那些存在字段匹配的记录。

  图片 1

  例子:

       film表                                 Actors表

 

  图片 2                    图片 3

 

          图片 4图片 5

 

   内部连接的关键就是排他性,如上面的Actor表中演员Bogart因为在Film表中没有对应的ID,所以在结果集中就没有显示。

  2、创建链接

 图片示例  链接方式 关键字 语句示例
  内连接 INNER JOIN ... ON SELECT <select_list> FROM A INNER JOIN B ON A.key = B.key
左外连接 LEFT JOIN ... ON SELECT <select_list> FROM A LEFT JOIN B ON A.key = B.key
左外连接 LEFT JOIN ... ON ... WHERE B.key IS NULL SELECT <select_list> FROM A LEFT JOIN B ON A.key = B.key WHERE B.key IS NULL
右外连接 RIGHT JOIN ... ON SELECT <select_list> FROM A RIGHT JOIN B ON A.key = B.key
右外连接 RIGHT JOIN ... ON ... WHERE A.key IS NULL SELECT <select_list> FROM A RIGHT JOIN B ON A.key = B.key WHERE A.key IS NULL
全外连接 UNION

SELECT <select_list> FROM A LEFT JOIN B ON A.key = B.key

UNION

SELECT <select_list> FROM A RIGHT JOIN B ON A.key = B.key

全外连接 (WHER IS NULL) UNION ... (WHER IS NULL)

SELECT <select_list> FROM A LEFT JOIN B ON A.key = B.key WHERE B.key IS NULL

UNION

SELECT <select_list> FROM A RIGHT JOIN B ON A.key = B.key WHERE A.key IS NULL

   用例:

-- 笛卡尔积:n * m
-- SELECT * FROM vendors, products;
SELECT orders.cust_id, cust_name FROM orders CROSS JOIN customers;-- 没有WHERE子句
-- 内连接
-- SELECT * FROM vendors, products WHERE vendors.vend_id = products.vend_id;
SELECT * FROM vendors INNER JOIN products on vendors.vend_id = products.vend_id;
-- 左外连接(a),根据A表相应字段取列
SELECT orders.cust_id, cust_name FROM orders LEFT JOIN customers on customers.cust_id = orders.cust_id;
-- 左外连接b,只取A表中无B表相应字段的列
SELECT vendors.vend_id, vend_name, vend_country  FROM vendors LEFT JOIN products on vendors.vend_id = products.vend_id where products.vend_id IS NULL ORDER BY vend_id;
-- 右外连接(a),同左外连接(a)
SELECT orders.cust_id, cust_name FROM orders RIGHT JOIN customers on customers.cust_id = orders.cust_id;
-- 右外连接(b),同左外连接(b)
SELECT customers.cust_id, cust_name FROM orders RIGHT JOIN customers on customers.cust_id = orders.cust_id WHERE orders.cust_id IS NULL;

-- 全外连接,两者id相等的行和不相等的行都保留
SELECT customers.cust_id, orders.order_num FROM orders LEFT JOIN customers on customers.cust_id = orders.cust_id
UNION
SELECT customers.cust_id, orders.order_num FROM orders RIGHT JOIN customers on customers.cust_id = orders.cust_id;
-- 全外连接,只保留两者id不相等的行,这里两个WHERE子句一样是因为customers的id字段完全包含orders中的字段
SELECT customers.cust_id, orders.order_num FROM orders LEFT JOIN customers on customers.cust_id = orders.cust_id WHERE orders.cust_id IS NULL
UNION
SELECT customers.cust_id, orders.order_num FROM orders RIGHT JOIN customers on customers.cust_id = orders.cust_id WHERE orders.cust_id IS NULL

2.显示所有数据库

3. 外部连接

   外部连接本质上是包含!!!

  图片 6

    

    左外部连接:个人理解就是左表边的全保留(包含),如果右边根据条件没有对应的行,则全是NULL,但还是会保留,不像内连接是直接不显示!

              Action表                        Film表

      图片 7   图片 8

                         内连接

       图片 9

 

        左外连接(左表Film表)                                右外连接(左表Film表)

图片 10                图片 11

  3、视图

  视图是虚拟的表。它只包含使用时动态检索数据的查询,换言之,视图存储查询语句。保存查询语句可以使用视图。视图的一些规则:

  - 与表名一样,视图必须唯一命名。

  - 视图数目没有限制。

  - 为了创建视图,必须具有足够的访问权限。

  - 视图可以嵌套。

  - 视图查询中不要使用GROUP BY。

  - 视图不能索引,也不能有关联的触发器或默认值。

-- 创建视图
-- CREATE VIEW viewname AS SELECT *
CREATE VIEW productcustomers AS SELECT cust_name, cust_contact, prod_id FROM customers, orders, orderitems WHERE customers.cust_id = orders.cust_id AND orderitems.order_num = orders.order_num;

CREATE VIEW orderitemsexpanded AS SELECT order_num, prod_id, quantity, item_price, quantity*item_price AS expanded_price FROM orderitems;

-- 执行视图查询时会首先执行视图
SELECT cust_name, cust_contact FROM productcustomers WHERE prod_id ='FB';
SELECT * FROM orderitemsexpanded WHERE order_num = 20009;
-- 删除视图
-- DROP VIEW viewname;
DROP VIEW productcustomers;

  show databases;

 4.完全连接

  顾名思义,将两个表的数据全部匹配。相当于左外连接加右外连接!

图片 12

二、存储过程

3.使用数据库

5.交叉连接

  交叉连接不使用ON运算符,使用CROSS关键字。将左侧表与右侧表所有的记录连接,返回所有记录的笛卡尔积。

  图片 13

  1、存储过程

  use 数据库名;

6.联合

  联合(UNION)运算符,用于使两个或两个以上的查询产生一个结果集。

  把一个结果集拼到另一个结果集的末尾。

  使用UNION的注意事项:1.两个结果集(表)的列数要相同

             2.UNION返回结果集的列名以第一个SELECT为准

             3.两个结果集对应列的必须可以隐式转换

             4.UNION默认消去重复行,可以使用关键字ALL来返回重复行

 

仍然是之前的两张表:第一个SELECT 起名叫File 之后无论起什么名字都是File,以第一个为准。

图片 14  

 

  1.简介

  存储过程是存储在数据库目录中的一段声明性SQL语句。它像是编程语言中的函数或者可执行代码块。通过声明一段可执行的SQL语句,既可以避免一行行的输入SQL语句,又可以将这段SQL语句重复使用。

  存储过程的优点:

  - 通常存储过程有助于提高应用程序的性能。

  - 存储过程有助于减少应用程序和数据库服务器之间的流量,因为应用程序不必发送多个冗长的SQL语句,而只能发送存储过程的名称和参数。

  - 存储的程序对任何应用程序都是可重用的和透明的。

  - 存储的程序是安全的。

  存储过程的缺点:

  - 如果使用大量存储过程,那么使用这些存储过程的每个连接的内存使用量将会大大增加。

  - 存储过程的构造使得开发具有复杂业务逻辑的存储过程变得更加困难。

  - 很难调试存储过程。

  - 开发和维护存储过程并不容易。

4.显示某个数据库下的所有表

  2.使用

-- 创建存储过程
DELIMITER // -- DELIMITER // 和DELIMITER;用于划分一块范围来声明存储过程
CREATE PROCEDURE GetAllProducts()-- CRAET PROCEDURE 创建一个存储过程
   BEGIN-- 存储过程的主体的开始
   DECLARE id INT(20) DEFAULT 1003;-- DECLARE variable datatype(size) DEFAULT value,声明局部变量;它只能在BEGIN和END之间生效
    SET id = 1001;-- 变量赋值
   SELECT * FROM products WHERE vend_id = id;-- SQL语句
   END //-- 存储过程的主体的结束,结尾用//
DELIMITER ;

-- 调用存储过程
CALL GetAllProducts();
-- 删除存储过程
DROP PROCEDURE IF EXISTS `GetAllProducts`;

-- 设置参数
DELIMITER //
CREATE PROCEDURE GetProductsByVendId(IN id INT(20), OUT outcome VARCHAR(20))-- 参数默认前缀是IN,即只允许调用函数时给参数传递值;OUT则表示将存储过程的运行结果传递出去,它是个单值参数;
    BEGIN
    SELECT count(*) INTO outcome FROM products WHERE vend_id = id;
    END //
DELIMITER ;
CALL GetProductsByVendId(1003, @outcome);-- 不直接打印结果,而是把结果传递给了全局变量@outcome
SELECT @outcome;-- 设置全局变量可以用SET variable = value;

-- 条件语句
/* IF condition THEN 
    sql
ELSEIF condition THEN
    sql
...
ELSE 
    sql
END IF */

DELIMITER //
CREATE PROCEDURE GetPriceLevel(IN prod_id CHAR(10), OUT price_level VARCHAR(20))
    BEGIN
    DECLARE price DECIMAL(8,2);
    SELECT prod_price INTO price FROM products WHERE products.prod_id = prod_id;

    IF price <= 5 THEN
        SET price_level = 'cheap';
    ELSEIF (price > 5 AND price <= 10) THEN
        SET price_level = 'ordinary';
    ELSE
        SET price_level = 'expensive';
    END IF;
    END //
DELIMITER ;
CALL GetPriceLevel('ANV01', @price_list);
SELECT @price_list;

-- 循环语句
/* WHILE condition DO
   statements
END WHILE */
-- 函数 略
-- 游标 https://www.yiibai.com/mysql/cursor.htm

  show tables;

  2、事务处理

5.显示表结构

  1.概念

  事务处理(transaction processing)用于保证SQL操作的完整性。它提供一种处理机制来应对SQL或者其它环境因素可能造成的异常结果。事务处理中的几个术语:

  - 事务(transaction),指一组SQL语句。

  - 回退(rollback),指撤销指定SQL语句的过程。

  - 提交(commit),指将未存储的SQL语句结果些人数据库表。

  - 保留点(savepoint),指事务处理中设置的临时占位符(placeholder),它可以回退。

  事务处理用来管理(可以回退)INSERT、UPDATE和DELETE语句,不能回退SELECT语句,也不能回退CREATE或者DROP操作。

  在MySQL中,事务开始使用COMMIT或ROLLBACK语句开始工作和结束。开始和结束语句的SQL命令之间形成了大量的事务。

  desc表明;

本文由澳门十大赌场最新排名发布于澳门十大赌场,转载请注明出处:mySql常用命令,交叉连接

关键词: ag电子游戏大奖

上一篇:创建和修改数据表,数据库导入

下一篇:没有了