• 狂神的MySQL(1)


    01、什么是数据库,为什么要学习数据库

    javaEE:企业级java开发 Web

    前端(页面:展示,数据!)

    后台(连接点:连接数据库JDBC,连接前端(控制,控制视图跳转,和给前端传递数据))

    数据库(存数据)

    1.为什么学习数据库

    1. 岗位需求
    2. 现在的世界,大数据时代,得数据者得天下
    3. 被迫需求:存数据
    4. 数据库是所有软件体系中最核心的存在

    2.什么是数据库

    数据库(DB,database)

    概念:数据仓库,软件,安装在操作系统(window,linux,mac…)之上。SQL,可以存储大量的数据,500w!

    作用:存储数据,管理数据

    02、初始MySQL,关系型和非关系型数据库区别

    1.数据库分类

    关系型数据库:(SQL)

    • MySQL、oracle、SqlServer、DB2、SQLLITE
    • 通过表和表之间,行和列之间的关系进行数据的存储。

    非关系型数据库:(NoSQL) not only

    • Redis、mongdb
    • 非关系型数据库,对象存储,通过对象的自身的属性来决定。

    DBMS(数据库管理系统 DataBase Management System)

    • 数据库的管理软件,科学有效的管理我们的数据,维护和获取数据
    • MySQL,数据库管理系统

    2.MySQL简介

    MySQL是一个**关系型数据库管理系统**

    前世:瑞典MySQL AB 公司开发

    今生:属于 Oracle 旗下产品

    MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

    开源的数据库软件

    体积小、速度快、总体拥有成本低,招人成本比较低,所以人必须会用~

    中小型网站,或者大型网站,集群!

    官网:MySQL

    安装建议:

    1. 尽量不要使用exe,注册表
    2. 尽可能使用压缩包安装~

    03、安装MySQL详细说明

    1.安装步骤

    1. 解压 mysql-5.7.34-winx64.zip

    2. 把这个包放到自己的电脑环境目录下

      image-20210610221856286

    3. 配置环境变量

      修改系统变量Path即可

      image-20210610221806497

    4. 新建mysql配置文件ini

      image-20210610221955841

      [mysqld]
      # 设置mysql的安装目录
      basedir=D:\\environment\\mysql-5.7.34-winx64
      # 设置mysql数据库的数据的存放目录
      datadir=D:\\environment\\mysql-5.7.34-winx64\\data
      # 设置3306端口
      port=3306
      # 跳过验证
      skip-grant-tables
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
    5. 启动管理员模式下的cmd,切换到mysql安装目录的bin目录

      image-20210610222126769

    6. 安装mysql服务

      mysqld -install

      image-20210610222200449

    7. 初始化数据库文件

      mysqld --initialize-insecure --user=mysql

      image-20210610222359492

      这个时候安装目录就会多一个data目录

      image-20210610222538940

    8. 启动mysqlnet start mysql,然后用命令mysql -u root -p进入mysql管理界面(-p后面不要加空格)

      image-20210610222826936

      image-20210610222953356

    9. 进入界面后,修改密码(sql语句后面一定要加分号)

      update mysql.user set authentication_string=password('123456') where user='root' and host='localhost';
      
      • 1

      image-20210610223232491

    10. 输入flush privileges;刷新权限

      image-20210610223414305

    11. 注释掉ini中的跳过密码skip-grant-tables

      image-20210610223507705

    12. 退出mysql命令行exit,停止mysql net stop mysql

    image-20210610223920444

    1. 然后启动服务,再次成功登陆,就ok了

      image-20210610224629970

    2.安装遇到的问题

    1. 执行mysqld -install报错如下的话

    image-20210610221326629

    可以先安装下面这个即可

    Download Visual C++ Redistributable Packages for Visual Studio 2013 from Official Microsoft Download Center

    sc delete mysql 清空服务

    04、sqlyog软件安装和使用

    1. 无脑安装
    2. 注册
    3. 打开连接数据库

    image-20210614090411318

    界面

    image-20210614090317586

    这里与之前data文件夹对应

    image-20210614090352253

    1. 新建一个数据库 school

      image-20210614090908854

      查看历史记录可以查到对应如下语句:

      image-20210614091135625

      CREATE DATABASE `school`CHARACTER SET utf8 COLLATE utf8_general_ci; 
      
      • 1

      每一个sqlyog的执行操作,本质就是对应了一个sql,可以在软件的历史记录中查看

    2. 新建一张表student(id,姓名,年龄)

      image-20210614091827019

    3. 查看表

      image-20210614092224514

    4. 自己尝试添加多条记录

      image-20210614092313191

    05、基本的命令行操作

    mysql -uroot -p123456 -- 连接数据库
    
    update mysql.user set authentication_string=password('123456') where user='root' and host='localhost'; -- 修改用户密码
    
    flush privileges; -- 刷新权限
    ----------------------------
    -- 所有的语句都使用;结尾
    
    show databases; -- 查看所有的数据库
    
    mysql> use school; -- 切换数据库  use 数据库名
    Database changed
    
    mysql> show tables; -- 显示数据库中所有表的信息
    
    mysql> describe student; -- 显示表的详细信息
    
    create database zyy;  -- 创建一个数据库(这里过于简洁,后面详细介绍)
    
    exit -- 退出连接
    
    -- 单行注释
    /**
    多行注释
    */
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    DDL 数据库定义语言

    DML 数据库操作语言

    DQL 数据库查询语言

    DCL 数据库控制语言

    06、操作数据库语句

    操作数据库 》 操作数据库中表 》操作数据库中表的数据

    mysql关键字不区分大小写

    1.操作数据库(了解)

    1. 创建数据库

      CREATE DATABASE [IF NOT EXISTS] student;
      
      • 1
    2. 删除数据库

      DROP DATABASE [IF EXISTS] zyy;
      
      • 1
    3. 使用数据库

      -- 如果你的表名或者字段名是一个特殊字符,就需要带上``
      USER `student`;
      
      • 1
      • 2
    4. 查看数据库

      SHOW DATABASES; -- 查看所有的数据库
      
      • 1

    学习思路

    1. 对比sqlyog的可视化操作
    2. 固定的语法或者关键字必须强行记住!

    07、列的数据类型讲解

    数值

    • tinyint 十分小的数据 1个字节
    • smallint 较小的数据 2个字节
    • mediumint 中等大小的数据 3个字节
    • int 标准的整数 4个字节
    • bigint 较大的数据 8个字节
    • float 浮点数 4个字节
    • double 浮点数 8个字节
    • decimal 字符串形式的浮点数 (金融计算的时候,一般是使用decimal)

    字符串

    • char 字符串固定大小的 0~255
    • varchar 可变字符串 0~65535 (常量的变量 String)
    • tinytext 微型文本 2^8 -1
    • text 文件串 2^16 -1 (保存大文本)

    时间日期

    • date YYYY-MM-DD 日期格式
    • time HH:mm:ss 时间格式
    • datetime YYYY-MM-DD HH:mm:ss 最常用的时间格式
    • timestamp 时间戳,1970.1.1到现在的毫秒数!较为常用!
    • year 年份表示

    null

    • 没有值,未知
    • 注意:不要使用NULL进行运算,结果为NULL

    08、数据库的字段属性(重点)

    Unsigned:

    • 无符号的整数
    • 声明了该列不能声明为负数

    Zerofill:

    • 0填充的
    • 不足的位数,使用0来填充 int(3) 5 — 005

    自增:

    • 通用理解为自增,自动在上一条记录的基础上+1(默认)
    • 通常用来设计唯一的主键,index,必须是整数类型
    • 可以自定义设计主键自增的起始值和步长

    非空 null/not null:

    • not null,如果不给他赋值,就会报错
    • null,如果不给他赋值,默认就是null

    默认:

    • 设置默认的值
    • 如果不赋值,就会存默认值

    拓展:

    /*
    每个表,都必须存在以下五个字段  未来做项目用的,表示一个记录存在的意义
    
    id          主键
    version     乐观锁
    is_delete   伪删除
    gmt_create  创建时间
    gmt_update  修改时间
    
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    09、创建数据库表

    -- 目标:创建一个school数据库
    -- 创建student学生表,使用sql创建
    -- 学号 姓名 性别 出生日期 家庭地址  email
    
    -- 注意点:使用英文()  表的名称和字段尽量使用``括起来
    -- AUTO_INCREMENT 自增
    -- 字符串使用单引号括起来
    -- 所有的语句后面加上英文逗号,最后一个不加
    -- PRIMARY KEY主键,一个表一般只有一个唯一的主键
    CREATE TABLE IF NOT EXISTS `student` (
      `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
      `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
      `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
      `birthday` DATETIME NOT NULL COMMENT '出生日期',
      `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭地址',
      `email` VARCHAR(30) DEFAULT NULL COMMENT '邮箱',
      PRIMARY KEY(`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    格式

    CREATE TABLE [IF NOT EXISTS] `表名` (
        `字段名` 列类型[属性]  [索引]  [注释],
        `字段名` 列类型[属性]  [索引]  [注释],
        `字段名` 列类型[属性]  [索引]  [注释],
        ...
    )[表类型][字符集设置][注释]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    常用命令:

    SHOW CREATE DATABASE `school` ; -- 查看创建数据库的语句
    SHOW CREATE TABLE `student`; -- 查看student数据表的定义语句
    
    DESC `student`; -- 查看表的结构
    
    • 1
    • 2
    • 3
    • 4

    10、MyIASM和InnoDB区别

    /*
    关于数据库引擎
    INNODB 默认使用
    MYISAM 早些年使用的
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    MYISAMINNODB
    事务支持不支持支持
    数据行锁定不支持支持
    外键约束不支持支持
    全文索引支持不支持
    表空间的大小较小较大,约为MYISAM的2倍

    常规使用操作:

    • MYISAM 节约空间,速度较快
    • INNODB 安全性高,事务的处理,多表多用户操作

    在物理空间存在的位置

    所有的数据库文件都存在data目录下,一个文件夹就对应一个数据库

    本质还是文件的存储!

    mysql引擎在物理文件上的区别

    • INNODB 在数据库表中只有一个*.frm文件,以及上级目录下的ibdata1文件
    • MYISAM 对应的文件
      • *.frm 表结构的定义文件
      • *.MYD 数据文件(data)
      • *.MYI 索引文件 (index)

    设置数据库表的字符集编码

    CHARSET=utf8
    
    • 1

    不设置的话,会是mysql默认的字符集编码(不支持中文)

    mysql的默认编码是Latin1,不支持中文

    在my.ini中配置默认的编码

    character-set-server=utf8
    
    • 1

    11、修改和删除数据表字段

    修改

    -- 修改表名 ALTER TABLE `原表名` RENAME AS `新表名`;
    ALTER TABLE `teacher` RENAME AS `teacher1`;
    
    -- 新增表的字段  ALTER TABLE `表名` ADD 字段名 列属性
    ALTER TABLE `teacher1` ADD age INT(3);
    
    -- 修改表的字段(重命名,修改约束!)
    -- ALTER TABLE `表名` MODIFY 字段名 列属性; 
    -- ALTER TABLE `表名` CHANGE 原字段名 现字段名 列属性;
    ALTER TABLE `teacher1` MODIFY age VARCHAR(3); -- 修改约束
    
    ALTER TABLE `teacher1` CHANGE age age1 INT(3);-- 字段重命名
    
    -- 删除表的字段
    ALTER TABLE `teacher1` DROP age1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    删除

    -- 删除表(如果存在再删除)
    DROP TABLE IF EXISTS teacher1;
    
    • 1
    • 2

    所有的创建和删除操作尽量加上判断,以免报错~

    注意点:

    • ``字段,使用这个包裹
    • 注释 – /**/
    • sql关键字大小写不敏感,建议大写写小写
    • 所有的符号全部用英文

    12、数据库级别的外键(了解)

    方式一:创建表的时候,增加约束(麻烦,比较复杂)

    -- 年级表
    CREATE TABLE `grade` (
      `id` INT(30) NOT NULL AUTO_INCREMENT COMMENT '年级id',
      `name` VARCHAR(50) NOT NULL COMMENT '年级名称',
      PRIMARY KEY (`id`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    -- 先删除之前的学生表
    DROP TABLE `student`;
    
    -- 学生表 id_grade 字段 需要引用年级表的 id字段
    -- 定义外键key
    -- 给这个外键添加约束(执行引用) references 引用
    CREATE TABLE IF NOT EXISTS `student` (
      `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
      `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
      `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
      `birthday` DATETIME NOT NULL COMMENT '出生日期',
      `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭地址',
      `email` VARCHAR(30) DEFAULT NULL COMMENT '邮箱',
      `id_grade` INT(30) NOT NULL COMMENT '年级id',
      PRIMARY KEY(`id`),
      KEY `fk_id_grade`(`id_grade`),
      CONSTRAINT `fk_id_grade` FOREIGN KEY (`id_grade`) REFERENCES `grade` (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    image-20210620095301587

    删除有外键关系的表的时候,必须要先删除引用别人的表(从表),再删除被引用的表(主表)

    方式二:创建表成功后,添加外键约束

    
    
    -- 年级表
    CREATE TABLE `grade` (
      `id` INT(30) NOT NULL AUTO_INCREMENT COMMENT '年级id',
      `name` VARCHAR(50) NOT NULL COMMENT '年级名称',
      PRIMARY KEY (`id`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    -- 学生表
    CREATE TABLE IF NOT EXISTS `student` (
      `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
      `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
      `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
      `birthday` DATETIME NOT NULL COMMENT '出生日期',
      `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭地址',
      `email` VARCHAR(30) DEFAULT NULL COMMENT '邮箱',
      `id_grade` INT(30) NOT NULL COMMENT '年级id',
      PRIMARY KEY(`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    -- DROP TABLE `grade`;
    -- DROP TABLE `student`;
    
    -- 创建表的时候没有外键关系
    ALTER TABLE `student` 
    ADD CONSTRAINT `fk_id_grade` FOREIGN KEY (`id_grade`) REFERENCES `grade` (`id`);
    
    -- ALTER TABLE 表 ADD CONSTRAINT 约束名 FOREIGN KEY (作为外键的列) REFERENCES 哪个表 (哪个字段)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    以上的操作都是物理外键,数据库级别的外键,我们不建议使用(避免数据库过多造成困扰!)

    最佳实践

    • 数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
    • 我们想使用多张表的数据,想使用外键**(程序去实现)**

    13、insert语句详解

    数据库意义:数据存储,数据管理

    DML语言:数据库操作语言

    insert

    -- 插入语言
    
    -- INSERT INTO `表名`(`字段1`,`字段2`,`字段3`...) VALUES('值1','值2','值3'...);
    INSERT INTO `grade`(`name`) VALUES('大四');
    INSERT INTO `student`(`name`,`birthday`,`id_grade`) VALUES('张三','1995-11-20','1');
    -- 一般写插入语句,我们一定要数据和字段一一对应。
    
    -- 插入多条
    -- INSERT INTO `表名`(`字段1`,`字段2`...) VALUES('值1','值2'...),('值1','值2'...)...;
    INSERT INTO `grade`(`name`) VALUES('大一'),('大二');
    
    INSERT INTO `student`(`name`,`birthday`,`id_grade`) VALUES('李四','1994-11-20','2'),('王五','1995-11-20','1');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    注意事项:

    • 字段和字段之间使用逗号隔开
    • 字段是可以省略,但是后面的值必须要一一对应,不能少
    • 可以同时插入多条数据,VALUES后面的值,需要使用逗号分开VALUES(),()...

    14、update语句详解

    update

    -- 修改学员名字
    UPDATE `student` SET NAME='zyy' WHERE id='1';
    -- 通过多个条件定位数据
    UPDATE `student` SET NAME='hehe' WHERE NAME='zyy' AND id_grade='2';
    -- 不指定条件的情况,会改动所有的表
    UPDATE `student` SET NAME='all';
    -- 语法
    -- UPDATE 表名 SET 列名=值[,列名=值,列名=值,列名=值...] [WHERE 条件]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    条件:where 字句 运算符 id等于某个值,大于某个值,在某个区间内修改

    操作符含义范围结果
    =等于5=6false
    <> 或者 !=不等于5!=6true
    >
    <
    >=
    <=
    BETWEEN … AND …某个范围内BETWEEN 1 AND 3[1,3]
    AND和 &&5>1 and 1>2false
    OR或 ||5>1 or 1>2true

    注意事项:

    • 列尽量带上``

    • 条件,筛选的条件,如果没有指定,则会修改所有的列

    • value,可以是一个具体的值,也可以是一个变量

      UPDATE `student` SET birthday=CURRENT_TIME WHERE NAME='hehe' AND id_grade='2';
      
      • 1
    • 多个设置的属性之间,使用英文逗号隔开(后面trim,可以干掉多余的逗号)

    15、delete和truncate详解

    delete

    语法: delete from 表名 [where 条件]

    -- 删除数据(避免这样写,会全部删除)
    DELETE FROM `student`;
    -- 删除指定数据
    DELETE FROM `student` WHERE id=1; 
    
    • 1
    • 2
    • 3
    • 4

    truncate

    作用:完全清空一个数据库表,标的结构和索引约束不会变!

    -- 清空表
    TRUNCATE `student`;
    
    • 1
    • 2

    delete 和 truncate 区别

    • 相同点:都能删除数据,都不会删除表结构
    • 不同:
      • truncate 重新设置自增列,计数器会归零
      • truncate 不会影响事务
    -- 测试 delete 和 truncate 区别
    CREATE TABLE `test`(
      `id` INT(4) NOT NULL AUTO_INCREMENT,
      `coll` VARCHAR(20) NOT NULL ,
      PRIMARY KEY (`id`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    -- 不会影响自增
    DELETE FROM `test`;
    
    -- 自增归零
    TRUNCATE TABLE `test`;
    
    INSERT INTO `test` (`coll`) VALUES ('1'),('2'),('3'),('4');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    了解即可delete 删除的问题,重启数据库,现象

    • innoDB 自增列会从1开始(存在内存当中的,断电即失)
    • MyISAM 继续上一个自增量开始(存在文件中,不会丢失)

    16、基本的select语句和别名使用(重点)

    DQL(data query language:数据查询语言)

    • 所有的查询操作都用它 select
    • 简单的查询,复杂的查询它都能做
    • 数据库中最核心的语言,最重要的语句
    • 使用频率最高的语句

    select 语法

    SELECT [ALL | DISTINCT]
    {* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
    FROM table_name [as table_alias]
        [left | right | inner join table_name2]  -- 联合查询
        [WHERE ...]  -- 指定结果需满足的条件
        [GROUP BY ...]  -- 指定结果按照哪几个字段来分组
        [HAVING]  -- 过滤分组的记录必须满足的次要条件
        [ORDER BY ...]  -- 指定查询记录按一个或多个条件排序
        [LIMIT {[offset,]row_count | row_countOFFSET offset}];
        --  指定查询的记录从哪条至哪条
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    注意:[]括号代表可选的,{}括号代表必选的

    指定查询字段

    DROP DATABASE IF EXISTS `school`;
    -- 创建一个school数据库
    CREATE DATABASE IF NOT EXISTS `school`;
    -- 使用school数据库
    USE `school`;
    -- 创建学生表
    DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student`(
        `student_no` INT(4) NOT NULL COMMENT '学号',
        `login_pwd` VARCHAR(20) DEFAULT NULL,
        `student_name` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',
        `sex` TINYINT(1) DEFAULT NULL COMMENT '性别,0或1',
        `grade_id` INT(11) DEFAULT NULL COMMENT '年级编号',
        `phone` VARCHAR(50) NOT NULL COMMENT '联系电话',
        `address` VARCHAR(255) NOT NULL COMMENT '地址',
        `born_date` DATETIME DEFAULT NULL COMMENT '出生时间',
        `email` VARCHAR (50) NOT NULL COMMENT '邮箱账号',
        `identity_card` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
        PRIMARY KEY (`student_no`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    -- 创建年级表
    DROP TABLE IF EXISTS `grade`;
    CREATE TABLE `grade`(
      `grade_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
      `grade_name` VARCHAR(50) NOT NULL COMMENT '年级名称',
       PRIMARY KEY (`grade_id`)
    ) ENGINE=INNODB DEFAULT CHARSET = utf8;
    
    -- 创建科目表
    DROP TABLE IF EXISTS `subject`;
    CREATE TABLE `subject`(
      `subject_no`INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
      `subject_name` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',
      `class_hour` INT(4) DEFAULT NULL COMMENT '学时',
      `grade_id` INT(4) DEFAULT NULL COMMENT '年级编号',
       PRIMARY KEY (`subject_no`)
    )ENGINE = INNODB  DEFAULT CHARSET = utf8;
    
    -- 创建成绩表
    DROP TABLE IF EXISTS `result`;
    CREATE TABLE `result`(
      `student_no` INT(4) NOT NULL COMMENT '学号',
      `subject_no` INT(4) NOT NULL COMMENT '课程编号',
      `exam_date` DATETIME NOT NULL COMMENT '考试日期',
      `student_result` INT (4) NOT NULL COMMENT '考试成绩'
      )ENGINE = INNODB DEFAULT CHARSET = utf8;
      
    -- 插入学生数据 其余自行添加 这里只添加了2行
    INSERT INTO `student` (`student_no`,`login_pwd`,`student_name`,`sex`,`grade_id`,`phone`,`address`,`born_date`,`email`,`identity_card`)
    VALUES
    (1000,'123456','张伟',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456198001011234'),
    (1001,'123456','赵强',1,3,'13800002222','广东深圳','1990-1-1','text111@qq.com','123456199001011233');
    
    -- 插入年级数据
    INSERT INTO `grade` (`grade_id`,`grade_name`) VALUES(1,'大一'),(2,'大二'),(3,'大三'),(4,'大四'),(5,'预科班');
    
    -- 插入科目数据
    INSERT INTO `subject`(`subject_no`,`subject_name`,`class_hour`,`grade_id`)VALUES
    (1,'高等数学-1',110,1),
    (2,'高等数学-2',110,2),
    (3,'高等数学-3',100,3),
    (4,'高等数学-4',130,4),
    (5,'C语言-1',110,1),
    (6,'C语言-2',110,2),
    (7,'C语言-3',100,3),
    (8,'C语言-4',130,4),
    (9,'Java程序设计-1',110,1),
    (10,'Java程序设计-2',110,2),
    (11,'Java程序设计-3',100,3),
    (12,'Java程序设计-4',130,4),
    (13,'数据库结构-1',110,1),
    (14,'数据库结构-2',110,2),
    (15,'数据库结构-3',100,3),
    (16,'数据库结构-4',130,4),
    (17,'C#基础',130,1);
    
    -- 插入成绩数据  这里仅插入了一组,其余自行添加
    INSERT INTO `result`(`student_no`,`subject_no`,`exam_date`,`student_result`)
    VALUES
    (1000,1,'2013-11-11 16:00:00',85),
    (1000,2,'2013-11-12 16:00:00',70),
    (1000,3,'2013-11-11 09:00:00',68),
    (1000,4,'2013-11-13 16:00:00',98),
    (1000,5,'2013-11-14 16:00:00',58);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
      -- 查询全部的学生   SELECT 字段 FROM 表名;
      SELECT * FROM student;
      
      -- 查询指定字段
      SELECT student_name, student_no FROM student;
      
      -- 别名,给结果起一个名字 AS  可以给字段起别名,也可以给表起别名
      
      SELECT student_name AS '学号', student_no AS '姓名' FROM student;
      
      -- 函数 concat(a,b)
      SELECT CONCAT('姓名:', student_no)  AS '新姓名' FROM student;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    有的时候,列表名不是那么见名知意,我们可以起别名

    17、去重及数据库的表达式

    去重 distinct

      -- 查询全部的考试成绩
      SELECT * FROM result;
      -- 查询有哪些同学参加了考试
      SELECT `student_no` FROM result;
      -- 发现重复数据,去重
      SELECT DISTINCT `student_no` FROM result;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    数据库的列(表达式)

     -- 查询系统版本(函数)
      SELECT VERSION();
      -- 用来计算(表达式)
      SELECT 100*3 -1 ;
      -- 查询自增的步长(变量)
      SELECT @@auto_increment_increment;
      
      -- 学员考试成绩 +1 查看
      SELECT `student_no`,`student_result` + 1 AS '提分后' FROM result;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    数据库中的表达式: 文本值,列,Null,函数,计算表达式,系统变量

    select 表达式 from 表名

    18、where子句之逻辑运算符

    作用:检索数据中符合条件的值

    搜索的条件由一个或者多个表达式组成,结果布尔值

    逻辑运算符

    运算符语法描述
    and &&a and b a&&b逻辑与
    or ||a orb a||b逻辑或
    not !not a !a逻辑非

    尽量适应英文字母

    -- 查询考试成绩在 95 ~ 100分之间
    
    SELECT student_no,student_result FROM result;
    
    -- and
    SELECT student_no,student_result FROM result
    WHERE student_result>95 AND student_result<=100;
    -- && 
    SELECT student_no,student_result FROM result
    WHERE student_result>95 && student_result<=100;
    
    -- 模糊查询(区间)
    SELECT student_no,student_result FROM result
    WHERE student_result BETWEEN 95 AND 100;
    
    -- 除了1000号学生之外的学生的成绩
    -- !=
    SELECT student_no,student_result FROM result
    WHERE student_no != 1000;
    -- not
    SELECT student_no,student_result FROM result
    WHERE NOT student_no = 1000;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    19、模糊查询操作符详解

    模糊查询:比较运算符

    运算符语法描述
    IS NULLa is null如果操作符为null,结果为真
    IS NOT NULLa is not null如果操作符不为null,结果为真
    BWTWEEN…AND…a between b and c若a在b和c之间,则结果为真
    LIKEa like bSQL匹配,如果a匹配b,则结果为真
    INa in (a1,a2,a3,…)假设a在a1或者a2或者a3,…其中的某一个,则结果为真
    
    -- 查询姓刘的同学
    
    -- like 结合 
    --   %(代表0到任意个字符)
    --   _(代表1)
    
    -- 查询姓刘的同学
    SELECT `student_no`,`student_name` FROM `student`
    WHERE student_name LIKE '刘%';
    
    -- 查询姓刘的同学,名字后面只有一个字的
    SELECT `student_no`,`student_name` FROM `student`
    WHERE student_name LIKE '刘_';
    
    -- 查询姓刘的同学,名字后面有两个字的
    SELECT `student_no`,`student_name` FROM `student`
    WHERE student_name LIKE '刘__';
    
    -- 查询名字中间有嘉字的同学
    SELECT `student_no`,`student_name` FROM `student`
    WHERE student_name LIKE '%%嘉%';
    
    
    -- in (具体的一个或者多个值)
    -- 查询学号1001,1002,1003号学号
    SELECT `student_no`,`student_name` FROM `student`
    WHERE student_no IN ('1001','1002','1003');
    -- 查询在北京的学生
    SELECT `student_no`,`student_name` FROM `student`
    WHERE address IN ('北京');
    
    
    -- null
    -- 查询地址为空的学生
    SELECT `student_no`,`student_name` FROM `student`
    WHERE address = '' OR address IS NULL;
    
    -- not null
    -- 查询有出生日期的同学 不为空
    SELECT `student_no`,`student_name` FROM `student`
    WHERE born_date IS NOT NULL;
    
    -- 查询没有出生日期的同学 为空
    SELECT `student_no`,`student_name` FROM `student`
    WHERE born_date IS NULL;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    mysql面试题12:讲一讲MySQL中什么是半同步复制?底层实现?
    Ubuntu18.04安装ROS系统+turtle测试
    OPTEE:TA镜像的签名和加载-下(六)
    Go开发基础环境搭建
    【Auth Proxy】为你的 Web 服务上把锁
    uCOSIII实时操作系统 六 内部任务(空闲函数)
    01_ARM架构内存映射简介
    java for循环内执行多线程
    【计算机基础】优雅的PPT就应该这样设计
    工控机设备安全-系统加固的意义
  • 原文地址:https://blog.csdn.net/ZN175623/article/details/128010080