美文网首页
数据库的学习~MySQL 1

数据库的学习~MySQL 1

作者: 爱机车的异乡人 | 来源:发表于2021-06-11 19:46 被阅读0次

    数据库的基本概念

    1. 数据库的英文单词: DataBase 简称 DB
    2. 什么数据库?

    用于存储和管理数据的仓库

    3. 数据库的特点:

    1. 持久化存储数据,数据库就是一个文件系统
    2. 方便存储和管理数据
    3. 使用了统一的方式操作数据库 --- SQL

    4. 常见的数据库软件

    Oracle
    MySQL
    Microsoft SQL Server

    SQL

    SQL通用语法

    1. SQL 语句可以单行或多行书写,以分号结尾
    2. 可使用空格和锁紧来增强语句的句读性
    3. MySQL 数据库 的 SQL 语句不区分大小写,关键字建议使用大写
    4. 3 种注释

    单行注释: -- 注释内容 或 # 注释内容 (mysql 特有)
    多行注释:/注释内容/

    SQL 分类

    SQL 分类
    图形理解
    DDL : 操作数据库、表

    1. 操作数据库: CRUD

    C (Create):创建

    * 创建数据库:
       create database 数据库名称;
     * 创建数据库,判断不存在,再创建:
       create database if not exists 数据库名称;
     * 创建数据库,并制定字符集:
       create database 数据库名称 character set 字符集名称;
     * 练习:创建db4数据库,判断是否存在,并制定字符集为gbk
       create database if not exists db4 character set gbk;

    R (Retrieve):查询

    * 查询所有数据库的名称
       show databases;
     * 查询某个数据库的字符集:查询某个数据库的创建语句
       show create database 数据库名称;

    U (Update):修改

    * 修改数据库的字符集
       alter database 数据库名称 character set 字符集名称;

    D (Delete):删除

    * 删除数据库:
       drop database 数据库名称;
     * 判断数据库存在,再删除:
       drop database if exists 数据库名称;

    使用数据库

    * 查询当前正在使用的数据库名称:
       select database();
     * 使用数据库:
       use 数据库名称;

    2. 操作表

    C (Create):创建

    * 语法:
       create table 表名(
         列名1 数据类型1,
         列名2 数据类型2,
         ...
       );

         * 注意:最后一列,不需要加,
         * 数据库类型:
          1. int 整数类型
            age int,
          2. double 小数类型
            score double(5,2)
          3. date 日期 只包含年月日
          4. datetime 日期 包含年月日时分秒
          5. timestamp 时间戳类型 包含年月日时分秒 
            如果将来不给这个字段赋值,或赋值为null,则默认使用当前的系统时间来自动赋值      
          6. varchar 字符串
            name varchar(20):姓名最大20个字符
          * 创建表:

    >create table student(
              id int,
              name varchar(32),
              score double (4,1),
              birthday date,
              insert_time timestamp
    );
    

    * 复制表:
            create table 表名 like 被复制的表名;

    R (Retrieve):查询

    * 查询某个数据库中所有的表名称
       show tables;
     * 查询表结构
       desc 表名;

    U (Update):修改

    * 修改表名
       alter table 表名 rename to 新的表名;
     * 修改表的字符集
       alter table 表名 character set 字符集类型;
     * 添加一列
       alter table 表名 add 列名 数据类型;

    * 修改表某列的数据类型
       alter table 表名 modify 列名 新的数据类型;
     * 修改表的列名及数据类型
       alter table 表名 change 列名 新的列名 新的数据类型;
     * 删除列
       alter table 表名 drop 列名;

    D (Delete):删除

    * 删除表:
       drop table 表名;
     * 判断表存在,再删除:
       drop table if exists 表名;

    DML : 增删改表中数据

    1. 添加数据:
      * 语法:
        insert into 表名(列名1,列名2,...,列名n) values (值1,值1,...,值n)

    注意事项
      1. 列名和值要一一对应。
      2. 如果表名后,补丁已列名,则默认给所有列添加值
        insert into 表名 values (值1,值1,...,值n);
      3. 除了数字类型,其他类型需要使用引号(单双都可以)引起来

    2. 删除数据:
      * 语法:
        delete from 表名 where 条件;

    注意事项
      1. 如果不加条件,则删除表中所有记录。
      2. 如果要删除所有记录
        delete from 表名;-- 不推荐使用。有多少条记录就会执行多少次删除操作。
        truncate table 表名;-- 推荐使用,效率更高,先删除表,然后再创建一张一模一样的表。

    3. 修改数据:
      * 语法:
        update 表名 set 列名1 = 值1,...,列名n = 值n where 条件;
    注意事项
      1. 如果不加条件,则修改表中所有记录。

    DQL : 查询表中的记录

    select * from 表名;
       1. 语法:
          select 字段列表
          from 表名列表
          where 条件列表
          group by 分组列表
          order by 排序列表
          limit 分页列表
       2. 基础查询:
          1. 多个字段查询
             select 字段名1,...from 表名;
             (注意:如果查询所有字段,可以使用来替代字段列表)
          2. 去除重复
            distinct
          3. 计算列
            一般可以使用size运算计算一些列的值(一般只会进行数值型的计算)
            ifnull(表达式1,表达式2):null参与的运算,计算你结果都为null
             
    表达式1:哪个字段需要判断是否为null
             * 表达式2:如果该字段为null后的替换值
          4. 起别名:
            as:as也可以省略
       3. 条件查询:
         1. where 子句后跟条件
         2. 运算符
           * >、<、<=、 >=、 =、' <> == != '
           * BETWEEN...AND
           * IN(集合)
           * LIKE
               _ :单个任意字符
              % :多个任意字符
           * IS NULL
           * and 或 &&
           * or 或 ||
           * not 或 |
    1. 排序查询
      * 语法:
        order by 排序字段1 排序方式1,排序字段2 排序方式2,...
      * 排序方式:
        ASC:升序,默认的。
        DESC:降序。

    注意:
      * 如果有多个排序条件,则当前边的条件值一样时,才会判断第二条件。

    2. 聚合函数:将一列数据作为一个整体,进行纵向计算。
      * count:计算个数
        1. 一般选择非空的列:主键
        2. count( * ) 
      * max:计算最大值
      * min:计算最小值
      * sum:计算和
      * avg:计算平均值

    注意:
      * 聚合函数的计算排除null值
      * 选择不包含非空的列
      * IFNULL函数

    3. 分组查询:
      * 语法:group by 分组字段;

    注意:
      * 分组之后查询的字段,分组字段,聚合函数
      * where 和 having 的区别?
        ☆ where 在分组之前进行限定,如果不满足条件,则不参与分组。
        ☆ having 在分组之后进行限定,如果不满足结果,则不会被查询出来。
        ★ where 后不可以跟聚合函数
        ★ having 可以进行聚合函数的判断
    3. 分页查询:
      * 语法:limit 开始的索引,每页查询的条数
      * 公式:-- 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
      * limit 是一个MySQL“方言”

    USE db1;
    SELECT DATABASE();
    DROP TABLE IF EXISTS student;
    CREATE TABLE student(
        id INT,
        NAME VARCHAR(32),
        age INT,
        sex VARCHAR(32),
        address VARCHAR(32),
        math DOUBLE ,
        english DOUBLE
        );
    ALTER TABLE student MODIFY math INT;
    ALTER TABLE student MODIFY english INT;
    
    INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES(1,"马云",55,'男','杭州',66,78);
    INSERT INTO student VALUES(2,'马化腾',45,'女','深圳',98,87);
    INSERT INTO student VALUES(3,'马景涛',55,'男','香港',56,77);
    INSERT INTO student VALUES(4,'柳岩',20,'女','湖南',76,65);
    INSERT INTO student VALUES(5,'柳青',20,'男','湖南',86,NULL);
    INSERT INTO student VALUES(6,'刘德华',57,'男','香港',99,99);
    INSERT INTO student VALUES(7,'马德',22,'女','香港',99,99);
    INSERT INTO student VALUES(8,'德玛西亚',18,'男','南京',56,65);
    
    -- 查询 姓名 和 年龄
    SELECT  NAME , age FROM student;
    
    -- 去除重复的结果集
    SELECT DISTINCT address FROM student;
    SELECT DISTINCT NAME,address FROM student;
    
    -- 计算math 和 english 分数之和
    SELECT NAME,math,english,math + english FROM student;
    -- 如果有null参与的运算,计算结果都为null
    SELECT NAME,math,english,math + IFNULL(english,0) FROM student;
    SELECT NAME,math,english,math + IFNULL(english,0) AS 总分 FROM student;
    SELECT NAME,math 数学,english 英语,math + IFNULL(english,0) 总分 FROM student;
    
    -- 查询年龄不等于20岁
    SELECT * FROM student WHERE age != 20;
    SELECT * FROM student WHERE age <> 20;
    -- 查询年龄大于等于20,小于等于30
    SELECT * FROM student WHERE age >= 20 && age <= 30;
    SELECT * FROM student WHERE age >= 20 AND age <= 30;
    SELECT * FROM student WHERE age BETWEEN 20 AND 30;
    -- 查询年龄22岁,18岁,25岁信息
    SELECT * FROM student WHERE age = 20 OR age = 18 OR age = 25;
    SELECT * FROM student WHERE age IN(20,18,25);
    -- 查询英语成绩为null
    SELECT * FROM student WHERE english = NULL;  -- null值不能使用= != 判断
    SELECT * FROM student WHERE english IS NULL; 
    -- 查询英语成绩不为null
    SELECT * FROM student WHERE english IS NOT NULL; 
    
    -- 查询姓马的有哪些?  like
    SELECT * FROM student WHERE NAME LIKE '马%';
    
    -- 查询第二个字是化的有哪些?  like
    SELECT * FROM student WHERE NAME LIKE '_化%';
    -- 查询姓名有三个字的人  like
    SELECT * FROM student WHERE NAME LIKE '___';
    -- 查询姓名中包含德的人
    SELECT * FROM student WHERE NAME LIKE '%德%';
    
    SELECT * FROM student;
    SELECT * FROM student ORDER BY math;
    SELECT * FROM student ORDER BY math ASC ,english DESC;
    SELECT * FROM student ORDER BY math DESC;
    
    SELECT COUNT(IFNULL (english,0)) FROM student;
    SELECT MAX(math)FROM student;
    SELECT MIN(math)FROM student;
    SELECT SUM(math)FROM student;
    SELECT AVG(IFNULL(english,0))FROM student;
    
    SELECT * FROM student;
    
    -- 按照性别分组,分别查询男、女同学的平均分
    SELECT sex , AVG(math)FROM student GROUP BY sex;
    
    -- 按照性别分组,分别查询男、女同学的平均分,人数
    SELECT sex , AVG(math),COUNT(id) FROM student GROUP BY sex;
    
    -- 按照性别分组,分别查询男、女同学的平均分,人数,要求,分数低于70分的人,不参与分组。
    SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex;
    
    -- 按照性别分组,分别查询男、女同学的平均分,人数,要求,分数低于70分的人,不参与分组,分组之后,人数要大于两个人。
    SELECT sex , AVG(math),COUNT(id) FROM student WHERE math > 70 GROUP BY sex HAVING COUNT(id) > 2;
    SELECT sex , AVG(math),COUNT(id) 人数 FROM student WHERE math > 70 GROUP BY sex HAVING 人数 > 2;
    
    -- 第一页
    SELECT * FROM student LIMIT 0,3;
    -- 第二页
    SELECT * FROM student LIMIT 3,3;
    -- 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
    
    

    相关文章

      网友评论

          本文标题:数据库的学习~MySQL 1

          本文链接:https://www.haomeiwen.com/subject/xqymeltx.html