010 mysql

/*
时间:2021/12/18
功能:MySql
目录: 
    一: mysql
    二: 库操作
    三: 表
    四: 字段/列
    五: 记录/行 
    六: 查询
        1 条件
        2 关键字
        3 排序
        4 分页
        5 聚合函数
        6 分组
        7 连接
    七: 外键
    八: 多表 
    九: 索引
    十: 其他
    十二: 思考
    十三: 问题
*/

一: mysql

-- mysql
    -- 登录 
        mysql -uroot -p
            -u: 表示MySQL服务端的用户名
            -p: 表示MySQL服务端的密码

    -- 退出 
        quit
        exit
    -- 清屏
        system clear;
    -- 显示当前时间 
        select now();

二: 库操作

-- 库操作
    -- 创建: 数据库 
        create database database_name charset=utf8;
        alter database database_name character set utf8; -- 修改编码
    -- 删除: 数据库 
        drop database database_name;
    -- 修改: 使用数据库 
        use database_name;
    -- 查询: 所有数据库 
        show databases;
    -- 查询: 当前使用数据库
        select database();

三: 表

--
    -- 创建表 
        create table name(
        字段名称, 数据类型, 约束条件
        );
        create table students(
            id int unsigned primary key auto_increment not null,
            name varchar(20) not null,
            age tinyint unsigned default 0,
            height decimal(5,2),
            gender enum('','')
        );
        CREATE TABLE st(
            id INT UNSIGNED PRIMARY KEY auto_increment NOT NULL,
            name VARCHAR(20) NOT NULL,
            age TINYINT UNSIGNED DEFAULT 0,
            height DECIMAL(5, 2),
            gender enum('','')
        );
        
    -- 删除表
        drop table table_name;
        drop table st;        
    -- 清空表
        -- delete : 可恢复
            DELETE FROM table_name;
            DELETE FROM areas;
        -- truncate : 不可恢复
            truncate FROM table_name;
            truncate FROM areas; 
                   
    -- 查询: 创表语句
        show create table table_name;
        show create table st;   
    -- 查询: 所有字段 
        desc table_name;
        desc st;
    -- 查看: 所有表
        show tables;

四: 字段/列

-- 字段/列
    -- 添加: add
        alter table table_name add column_name 数据类型 约束; 
        alter table st add birthday datetime; 
        
    -- 修改: 属性
        -- 1 修改类型: modify
            alter table table_name modify column_name 数据类型 约束; 
            alter table st modify birthday date not null;
        -- 2 修改名称和类型: change
            alter table table_name change column_name new_name 数据类型 约束; 
            alter table st change birthday birth datetime not null;    
    -- 修改: 数值 
        UPDATE <表名> 
            SET <列名> = <表达式>           
        UPDATE st 
            set age=18, height=1.78   
            
    -- 删除: drop  
        alter table table_name drop column_name;
        alter table st drop birth;

五: 记录/行

-- 记录/行 
    -- 添加
        -- 1 全部字段
            INSERT INTO table_name values(字段...);
            INSERT INTO st VALUES(0, '小明', 12, 1.7, '')
        -- 2 部分字段
            INSERT INTO table_name(column_name) VALUES(column_value);
            INSERT INTO st(id, name) VALUES(98, '小钱');
        -- 3 默认字段
            INSERT INTO table_name(column_name) VALUES(DEFAULT);
            INSERT INTO st(id, name) VALUES(DEFAULT, '小孙');
        -- 4 多行插入
            -- (1) 全部字段
            INSERT INTO st VALUES(DEFAULT, '小周', DEFAULT, 1.69, DEFAULT),
            (DEFAULT, '小吴', DEFAULT, 1.69, DEFAULT);
            -- (1) 部分字段
            INSERT INTO st(id, name) VALUES(DEFAULT, '诸葛'),(DEFAULT, '司马');
        -- 5 复制表 
            --(1) 全部复制
            insert into table1 
                select  * from table2
            --(1) 部分复制
            INSERT INTO table2(id, name)
                SELECT id, name FROM table1;
            
    -- 修改 
        UPDATE <表名> 
            SET <列名> = <表达式>
        WHERE <条件>;
            
        UPDATE st 
            set age=18, height=1.78
        WHERE id = 5;
        
        
    -- 删除
        -- 1 逻辑删除
            ALTER TABLE st ADD is_delete bit DEFAULT 0;
            
            UPDATE st 
                set is_delete=1
            WHERE name = '小明';

        -- 2 物理删除 
            DELETE FROM <表名> 
                WHERE <条件>; 
        
            DELETE FROM st
                WHERE id = 5;

六: 查询
  1 条件

-- 条件
    -- 比较: = > >= < <= <> !=
    -- 逻辑: and or not 
    -- 模糊: like  
    -- 范围: between...and...; in 
    -- null: is not 

    -- 比较: = > >= <= <> !=
        --: =
        SELECT * FROM st
            WHERE NAME = "小明";
        --: > >= < <=
        SELECT * FROM st
            WHERE height >= 1.7;   
        --: <> != 
        SELECT * FROM st
            WHERE NAME <> "小明";
    
    -- 逻辑: and or not 
        --: and 
        SELECT * FROM st
            WHERE id > 3 AND is_delete = 0
        --: or
        SELECT * FROM st
            WHERE id < 3 or id > 3;
        --: not 
        SELECT * FROM st
            WHERE not(id < 3 or id > 3); 
    
    -- 模糊: like
        --: %
        SELECT * FROM st
            WHERE `name` LIKE "小%";
        --: _
          SELECT * FROM st
            WHERE `name` LIKE "小_";

    -- 范围: 
        --: 1 between...and...
        SELECT * FROM st
            WHERE id BETWEEN 3 and 100;
        --: 2 in 
        SELECT * FROM st
            WHERE id in (3, 5, 100);
    
    -- null: 
        --: 1 is 
        SELECT * FROM st 
            WHERE height is NULL;
        --: 2 is not 
        SELECT * FROM st 
            WHERE height is not NULL;  

  2 关键字

-- 关键字: as distinct
    -- as: 
        -- 字段 
        SELECT id, name as "姓名"
            FROM st;      
        --
        SELECT s.id, s.name
            FROM st AS s;

    -- distinct
        SELECT DISTINCT name, age FROM st;

  3 排序

-- 排序 
    -- order by
        SELECT * FROM st 
            ORDER BY id;
    -- order by desc
        SELECT * FROM st 
            ORDER BY id DESC;

  4 分页

-- 分页
    -- limit 
        select * from 表名 limit start,count
            limit: 分页查询 - 关键字
            start: 开始行索引, 默认0行
            count: 查询条数
            
        SELECT * FROM st LIMIT 3;
        SELECT * FROM st LIMIT 3, 5;
        
    -- n页线索
        -- 每页m条数据,求第n页显示的数据
        -- select * from st limit (n-1)*m, m;

  5 聚合函数

-- 聚合函数  
    -- count(): 列总行数
    -- max(): 列最大值 
    -- min(): 列最小值
    -- sum(): 列数值和 
    -- avg(): 列数值和

    -- count(): 列总行数
        -- 总行数: 不包含null
            SELECT COUNT(height) FROM st;
        -- 总行数: 包含null
            SELECT COUNT(*) FROM st;    
    -- max(): 列最大值 
        SELECT MAX(height) FROM st;
    -- min(): 列最小值
        SELECT MIN(height) FROM st;
    -- sum(): 列数值和 
        SELECT AVG(height) FROM st;
    -- avg(): 列数值和
        SELECT SUM(height) FROM st;
    -- null 
        select avg(ifnull(height, 0)) from st 
            WHERE gender='';   

  6 分组

-- 分组查询
    -- 单字段
        SELECT gender FROM st
            GROUP BY gender;
    -- 多字段
        SELECT name, gender FROM st
            GROUP BY name, gender;         
    -- GROUP_CONCAT : 统计集合 - 分组字段
        SELECT gender, GROUP_CONCAT(id)
            FROM st GROUP BY gender         
    -- 聚合函数
        SELECT gender, AVG(height) FROM st
            GROUP BY gender;
            
        SELECT gender, COUNT(*) FROM st
            GROUP BY gender;          
    -- having
    SELECT gender, COUNT(*)
        FROM st 
        GROUP BY gender
        HAVING COUNT(*) > 3;
    -- with rollup - 统计集合 - 所有分组
    SELECT gender,GROUP_CONCAT(height) 
        FROM st 
        GROUP BY gender 
        with rollup;    

  7 连接

-- 连接查询
    -- 内连接
       SELECT s.id, s.`name`, s.class_id, c.`name`
            FROM st as s
            INNER JOIN class as c 
            on s.class_id = c.id
    -- 左连接 
        SELECT s.id, s.`name`, s.class_id, c.`name`
            FROM st as s
            LEFT JOIN class as c 
            on s.class_id = c.id
    -- 右连接
        SELECT s.id, s.`name`, s.class_id, c.`name`
            FROM st as s
            RIGHT JOIN class as c 
            on s.class_id = c.id       
    -- 子连接
        -- 导入数据
            create table areas(
                id varchar(30) not null primary key, 
                title varchar(30), 
                pid varchar(30)
            );

            source areas.sql; -- 执行sql文件 

        -- 自查询
            SELECT a1.id, a1.title, a2.title
                FROM areas AS a1 
                INNER JOIN areas AS a2 
                ON a1.pid = a2.id    
                WHERE a2.title = "河北省";

        -- 子查询 
            -- 查询: 省 市
            SELECT * FROM areas 
                WHERE pid = (SELECT id 
                FROM areas 
                WHERE title = "河北省");
            
            -- 平均身高
            select * FROM st 
                WHERE height > (SELECT avg(height) FROM st)
                
            -- 查询学生表中不为空的班级名称
            SELECT `name` FROM class
                WHERE class.id in (SELECT class_id 
                FROM st
                WHERE class_id IS NOT NULL);
            
            -- 年龄和身高都是最大
            SELECT * FROM st
                WHERE (age, height) = (SELECT MAX(age), MAX(height) FROM st);    

七: 外键

-- 外键约束
    数据类型(无符合)
    -- 添加约束
        ALTER TABLE table_name1 add FOREIGN KEY(column_id) REFERENCES table_name2(id);
        ALTER TABLE st add FOREIGN KEY(class_id) REFERENCES class(id);
    
    -- 创造添加 
        CREATE TABLE school(
            id int not null PRIMARY KEY auto_increment,
            name VARCHAR(10)
        );

        CREATE TABLE teacher(
            id int not null PRIMARY key auto_increment,
            name VARCHAR(10),
            s_id int not null,
            FOREIGN key(s_id) REFERENCES school(id)
        );
    
    -- 删除约束 
        想·SHOW CREATE TABLE st;   --获取名称 : 外键  
        ALTER TABLE st DROP FOREIGN KEY st_ibfk_1;  --删除外键  

八: 多表

-- 多表操作 
    -- 复制表 
        --(1) 全部复制
        insert into table1 
            select  * from table2
        --(2) 部分复制
        INSERT INTO table2(id, name)
            SELECT id, name FROM table1;
        --(3) 创建复制 
        CREATE TABLE good_brands(
            id int UNSIGNED PRIMARY KEY auto_increment,
            NAME VARCHAR(40) NOT NULL)
            SELECT brand_name as name FROM goods GROUP BY brand_name; 
            
    -- 更新表值 
        UPDATE goods g INNER JOIN good_cates gc 
            on g.cate_name = gc.`name`
        SET g.cate_name = gc.id
    
    -- 更改名称: 字段  
        ALTER TABLE goods change brand_name brand_id int not null 
        CHANGE brand_name brand_id int NOT NULL;

九: 索引

-- 索引
    -- 查看索引
        show index from 表名;
        SHOW INDEX FROM test_index;       
    -- 添加索引 
        alter table 表名 add index 索引名(列名, ..)
        alter table classes add index my_name (name);       
    -- 删除索引 
        alter table 表名 drop index 索引名
        alter table classes drop index my_name;
    -- 联合索引: 最左原则;
-- 开启运行时间监测:
    set profiling=1;
-- 查找第1万条数据ha-99999
    select * from test_index where title='ha-99999';
-- 查看执行的时间:
    show profiles;
-- 给title字段创建索引:
    alter table test_index add index (title);
-- 再次执行查询语句
    select * from test_index where title='ha-99999';
-- 再次查看执行的时间
    show profiles;
+----------+------------+--------------------------------------------------+
| Query_ID | Duration   | Query                                            |
+----------+------------+--------------------------------------------------+
|        1 | 0.02104125 | select * from test_index where title = 'h_99999' |
|        2 | 0.09241275 | alter table test_index add index(title)          |
|        3 | 0.00020575 | select * from test_index where title = 'h_99999' |
+----------+------------+--------------------------------------------------+

十: 其他

-- 其他
    -- 保留小数 - 两位
        SELECT ROUND(avg(price),2)
            FROM goods;
    -- 行数 
        select count(*) from st;
-- 行列转换(纵横表):
    select * from scores;

    SELECT [姓名],
        SUM(CASE [课程]
        WHEN '语文' THEN [分数]
        ELSE 0
        END) AS '语文',
        SUM(CASE [课程]
        WHEN '数学' THEN [分数]  
        ELSE 0
        END) AS '数学',
        SUM(CASE [课程]
        WHEN '物理' THEN [分数]
        ELSE 0
        END) AS '物理'
        FROM scores
        GROUP BY [姓名]

 

十二: 思考

-- 组成: 行/列/表/库/系统
        单表操作: 增删改查
        多表操作: 增删改查
        
-- sql:
    表的修改: 在列和行。
    列行查询: 在表
    列操作: alter; 
        
-- show/select
    show: 查询所有库/表; 创表语句; 索引
    
-- delete/drop:
    delete: 清空表; 清空行;
    drop: 删除库; 删除表; 删除列; 删除索引;

十三: 问题

-- 数据库系统三部曲(战德臣); 《SQL基础教程》; 《SQL进阶教程》; 《MySQL基础教程》; 《SQL必知必会》; 老男孩DBA
原文地址:https://www.cnblogs.com/huafan/p/15704178.html