首頁 資料庫 mysql教程 SQL也疯狂:MySQL绘制简单几何图形(2013-04-12)

SQL也疯狂:MySQL绘制简单几何图形(2013-04-12)

Jun 07, 2016 pm 02:57 PM
mysql sql 幾何圖形 簡單 繪製

用SQL SELECT 语句而非存储过程来画基本几何图形,以加深对 SELECT 语句的理解。因为 SELECT 语句隐含了一个或多个循环,看上去只是一个语句,其实包含了一个完整的程序所包含的顺序、分支、循环,因此不必用存储过程就能实现一般的程序的功能 需要有一个表

  • 用SQL SELECT 语句而非存储过程来画基本几何图形,以加深对 SELECT 语句的理解。因为 SELECT 语句隐含了一个或多个循环,看上去只是一个语句,其实包含了一个完整的程序所包含的顺序、分支、循环,因此不必用存储过程就能实现一般的程序的功能
  • 需要有一个表有 100 行以上的数据,数据是什么没关系,因为下面的语句已经避开使用数据库记录中的数据了。如果没有现成的就使用如下代码生成一个吧: 语句
    DELIMITER ;;
    
    DROP PROCEDURE IF EXISTS test_num;;
    
    CREATE PROCEDURE test_num(MAX_COUNT INTEGER)
    BEGIN
    	DECLARE i INTEGER;
    	SET i = 0;
    
    	DROP TABLE IF EXISTS number;
    	CREATE TABLE number(num INT(10), PRIMARY KEY (num));
    
    	WHILE i < MAX_COUNT DO
    		INSERT INTO number(num) VALUES (i);
    		SET i = i + 1;
    	END WHILE;
    END;;
    
    DELIMITER ;
    
    CALL test_num(100);
    
    登入後複製
  1. 画横线 语句
    SET @w := 24;  # 宽 <span>SELECT</span> repeat(<span>"*"</span>, @w) AS line;
    
    登入後複製
    结果
    +--------------------------+
    | line                     |
    +--------------------------+
    | ************************ |
    +--------------------------+
    
    登入後複製
  2. 画竖线 语句
    SET @h := 12;  # 高
    SET @y := 0;   # y 座标 <span>SELECT</span> <span>"*"</span> AS line <span>FROM</span> number <span>WHERE</span> @y < @h and @y := @y + 1;
    
    登入後複製
    结果
    +------+
    | line |
    +------+
    | *    |
    | *    |
    | *    |
    | *    |
    | *    |
    | *    |
    | *    |
    | *    |
    | *    |
    | *    |
    | *    |
    | *    |
    +------+
    
    登入後複製
  3. 画斜线 语句
    SET @h := 12;   # 高
    SET @y := 0;    # y 座标
    SET @rate := 2; # x y 座标比例(斜率倒数) <span>SELECT</span> lpad(<span>"*"</span>, @y * @rate, <span>" "</span>) AS line <span>FROM</span> number <span>WHERE</span> @y < @h and @y := @y + 1;
    
    登入後複製
    结果
    +--------------------------+
    | line                     |
    +--------------------------+
    |  *                       |
    |    *                     |
    |      *                   |
    |        *                 |
    |          *               |
    |            *             |
    |              *           |
    |                *         |
    |                  *       |
    |                    *     |
    |                      *   |
    |                        * |
    +--------------------------+
    
    登入後複製
  4. 画XX 语句
    SET @h := 12;           # 高
    SET @w := 24;           # 宽
    SET @y := 0;            # y 座标
    SET @rate := @w / @h;   # x y 座标比例(斜率倒数) <span> SELECT</span> X <span>FROM</span> ( <span> SELECT</span> concat(lpad(<span>"*"</span>, @y * @rate - 1, <span>" "</span>), repeat(<span>" "</span>, @w - 2 * @y * @rate - 2 + 1), IF(@w - 2 * @y * @rate - 2 + 1 <= 0, <span>"",  "</span>*")) AS X <span>FROM</span> number <span>WHERE</span> @y < @h / 2 and @y := @y + 1
    
        UNION ALL <span> SELECT</span> concat(lpad(<span>"*"</span>, @y * @rate - 1, <span>" "</span>), repeat(<span>" "</span>, @w - 2 * @y * @rate - 2 + 1), IF(@w - 2 * @y * @rate - 2 + 1 <= 0, <span>"",  "</span>*")) AS X <span>FROM</span> number <span>WHERE</span> @y < @h and (@y := @y - 1) > 0
    ) AS Temp;
    
    登入後複製
  5. 结果
    +-----------------------+
    | X                     |
    +-----------------------+
    | *                   * |
    |   *               *   |
    |     *           *     |
    |       *       *       |
    |         *   *         |
    |           *           |
    |         *   *         |
    |       *       *       |
    |     *           *     |
    |   *               *   |
    | *                   * |
    +-----------------------+
    
    登入後複製
  6. 画矩形 语句
    SET @x := 0;    # x 座标
    SET @rate := 2; # x y 轴长比例,调整显示效果
    SET @h := 12;   # 长
    SET @w := 12;   # 宽 <span> SELECT</span> rect <span>FROM</span> ( <span>SELECT</span> repeat(<span>"*"</span>, @w * @rate) AS rect 
    
        UNION ALL <span> SELECT</span> concat(<span>"*"</span>, repeat(<span>" "</span>, @w * @rate - 2), <span>"*"</span>) <span>FROM</span> number <span>WHERE</span> @x < @h and @x := @x + 1
    
        UNION ALL <span>SELECT</span> repeat(<span>"*"</span>, @w * @rate)
    ) AS Temp;
    
    登入後複製

  7. 结果
    +--------------------------+
    | rect                     |
    +--------------------------+
    | ************************ |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | *                      * |
    | ************************ |
    +--------------------------+
    
    登入後複製
  8. 把XX用矩形框起来 语句
    SET @h := 12;           # 高
    SET @w := 24;           # 宽
    SET @y := 0;            # y 座标
    SET @rate := @w / @h;   # x y 座标比例(斜率倒数) <span> SELECT</span> rectXX <span>FROM</span> ( <span>SELECT</span> repeat(<span>"*"</span>, (@w - 2 * 2)) AS rectXX
    
        UNION ALL <span>SELECT</span> concat(<span>"*"</span>, lpad(<span>"*"</span>, @y * @rate - 1, <span>" "</span>), repeat(<span>" "</span>, (@w - 2 * 2) - 2 * @y * @rate - 2 + 1), IF((@w - 2 * 2) - 2 * @y * @rate - 2 + 1 <= 0, <span>"",  "</span>*<span>"), repeat("</span> <span>", @y * @rate - 1), "</span>*") <span>FROM</span> number <span>WHERE</span> @y < (@h - 2) / 2 and @y := @y + 1
    
        UNION ALL <span> SELECT</span> concat(<span>"*"</span>, lpad(<span>"*"</span>, @y * @rate - 1, <span>" "</span>), repeat(<span>" "</span>, (@w - 2 * 2) - 2 * @y * @rate - 2 + 1), IF((@w - 2 * 2) - 2 * @y * @rate - 2 + 1 <= 0, <span>"",  "</span>*<span>"), repeat("</span> <span>", @y * @rate - 1), "</span>*") <span>FROM</span> number <span>WHERE</span> @y < (@h - 2) and (@y := @y - 1) > 0
    
        UNION ALL <span>SELECT</span> repeat(<span>"*"</span>, (@w - 2 * 2)) AS rect
    ) AS Temp;
    
    登入後複製
  9. 结果
    +----------------------+
    | rectXX               |
    +----------------------+
    | ******************** |
    | **               * * |
    | *  *           *   * |
    | *    *       *     * |
    | *      *   *       * |
    | *        *         * |
    | *      *   *       * |
    | *    *       *     * |
    | *  *           *   * |
    | **               * * |
    | ******************** |
    +----------------------+
    
    登入後複製
  10. 画等腰三角形 语句
    SET @h := 10;       # 高
    SET @w := 10;       # 底
    SET @x := 0;        # x 座标
    SET @y := 0;        # y 座标
    SET @k := @w/@h/2;  # 1/2底高比例,即边的斜率的倒数
    SET @rate := 2;     # x y 轴比例,调整显示效果 <span>SELECT</span> concat(repeat(<span>" "</span>, @rate * (@w / 2 - (@y - 1) * @k) - 1), <span>"*"</span>, repeat(IF(@y = @h, <span>"*"</span>, <span>" "</span>), @rate * (2 * (@y - 1) * @k) - 1), IF(@y = 1, <span>"", "</span>*")) AS triangle <span>FROM</span> number <span> WHERE</span> (@y := @y + 1) AND @y <= @h;
    
    登入後複製
    结果
    +---------------------+
    | triangle            |
    +---------------------+
    |          *          |
    |         * *         |
    |        *   *        |
    |       *     *       |
    |      *       *      |
    |     *         *     |
    |    *           *    |
    |   *             *   |
    |  *               *  |
    | ******************* |
    +---------------------+
    
    登入後複製
  11. 画正弦曲线 语句
    SET @x := 0;        # x 座标
    SET @offset := 15;  # y 偏移
    SET @am := 15;      # 振幅
    SET @rate := 10;    # x y 轴比例(影响波长),调整显示效果
    SET @len := 30;     # 长度 <span> SELECT</span> lpad(<span>"*"</span>, round(@am * sin(@x * 3.14 / @rate) + @offset) + 1, ' ') AS 'sin' <span>FROM</span> number <span>WHERE</span> (@x := @x + 1) < @len;
    
    登入後複製
    结果
    +---------------------------------+
    | sin                             |
    +---------------------------------+
    |                     *           |
    |                         *       |
    |                            *    |
    |                              *  |
    |                               * |
    |                              *  |
    |                            *    |
    |                         *       |
    |                     *           |
    |                *                |
    |           *                     |
    |       *                         |
    |    *                            |
    |  *                              |
    | *                               |
    |  *                              |
    |    *                            |
    |       *                         |
    |           *                     |
    |                *                |
    |                     *           |
    |                         *       |
    |                            *    |
    |                              *  |
    |                               * |
    |                              *  |
    |                            *    |
    |                         *       |
    |                     *           |
    +---------------------------------+
    
    登入後複製
  12. 画圆 语句
    SET @r := 12;           # 半径
    SET @d := 2 * (@r + 1); # 图形范围,即直径(避免减到0,偏移 1)
    SET @x := 0;            # x 座标
    SET @y := @r + 1;       # y 座标
    SET @rate := 2;         # x y 轴长比例,调整显示效果 <span> SELECT</span> circle <span>FROM</span> ( <span>SELECT</span> @x := round(@rate * sqrt(pow(@r, 2) - pow(@y, 2))) + 1, concat(lpad(<span>"*"</span>, @d - @x, <span>" "</span>), lpad(<span>"*"</span>, 2 * @x, <span>" "</span>)) AS circle <span>FROM</span> number <span>WHERE</span> (@y := @y - 1) > 0 AND @y <= @r
        UNION ALL <span>SELECT</span> @x := round(@rate * sqrt(pow(@r, 2) - pow(@y, 2))) + 1, concat(lpad(<span>"*"</span>, @d - @x, <span>" "</span>), lpad(<span>"*"</span>, 2 * @x, <span>" "</span>)) AS circle <span>FROM</span> number <span>WHERE</span> (@y := @y + 1) > 0 AND @y <= @r
    ) AS Temp;
    
    登入後複製
    结果
    +-----------------------------------------------------+
    | circle                                              |
    +-----------------------------------------------------+
    |                         * *                         |
    |               *                     *               |
    |            *                           *            |
    |         *                                 *         |
    |       *                                     *       |
    |      *                                       *      |
    |    *                                           *    |
    |   *                                             *   |
    |  *                                               *  |
    |  *                                               *  |
    | *                                                 * |
    | *                                                 * |
    | *                                                 * |
    |  *                                               *  |
    |  *                                               *  |
    |   *                                             *   |
    |    *                                           *    |
    |      *                                       *      |
    |       *                                     *       |
    |         *                                 *         |
    |            *                           *            |
    |               *                     *               |
    |                         * *                         |
    +-----------------------------------------------------+
    
    登入後複製
  • UNION 后再用一个 SELECT 仅是包装一下,看起来像一个整体,不那么松散
  • 回头想想,上面用了 UNION 的都可以用 IF 来整合在一个语句里,不过会显得很臃肿
  • 亚丹
    seesea2517#gmail#com
    http://seesea.blog.chinaunix.net
    http://blog.csdn.net/nicenight
    http://my.oschina.net/seesea2517
<无>
x
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP 的大數據結構處理技巧 PHP 的大數據結構處理技巧 May 08, 2024 am 10:24 AM

PHP 的大數據結構處理技巧

如何優化 PHP 中的 MySQL 查詢效能? 如何優化 PHP 中的 MySQL 查詢效能? Jun 03, 2024 pm 08:11 PM

如何優化 PHP 中的 MySQL 查詢效能?

如何在 PHP 中使用 MySQL 備份和還原? 如何在 PHP 中使用 MySQL 備份和還原? Jun 03, 2024 pm 12:19 PM

如何在 PHP 中使用 MySQL 備份和還原?

如何使用 PHP 插入資料到 MySQL 表? 如何使用 PHP 插入資料到 MySQL 表? Jun 02, 2024 pm 02:26 PM

如何使用 PHP 插入資料到 MySQL 表?

如何修復 MySQL 8.4 上的 mysql_native_password 未載入錯誤 如何修復 MySQL 8.4 上的 mysql_native_password 未載入錯誤 Dec 09, 2024 am 11:42 AM

如何修復 MySQL 8.4 上的 mysql_native_password 未載入錯誤

如何在 PHP 中使用 MySQL 預存程序? 如何在 PHP 中使用 MySQL 預存程序? Jun 02, 2024 pm 02:13 PM

如何在 PHP 中使用 MySQL 預存程序?

如何使用 PHP 建立 MySQL 表? 如何使用 PHP 建立 MySQL 表? Jun 04, 2024 pm 01:57 PM

如何使用 PHP 建立 MySQL 表?

oracle資料庫和mysql的區別 oracle資料庫和mysql的區別 May 10, 2024 am 01:54 AM

oracle資料庫和mysql的區別

See all articles