zoukankan      html  css  js  c++  java
  • Mysql(笔记)

    1、初识MySQL

    JavaEE:企业级Java开发 Web

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

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

    数据库(存数据,txt,Excel,word)

    只会写代码,学好数据库,基本混饭吃;

    操作系统,数据结构与算法!当一个不错的程序猿!

    离散数学,数字电路,编译原理。+实战经验

    1.1、为什么学习数据库

    1、岗位需求

    2、现在的世界,大数据时代~得数据者得天下。

    3、被迫需求:存数据

    4、数据库是所有软件体系中最核心的存在 DBA

    1.2、什么是数据库

    数据库(DB,DataBase)

    概念:数据仓库,软件,安装在操作系统(window,linux,mac。。。之上

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

    1.3、数据库分类

    关系型数据库:Excel(SQL)

    • MySQL,Oracle、Sql Server,DB2,SQLite
    • 通过表与表之间,行和列之间的关系进行数据的存储

    非关系型数据库:{key:value}(NoSQL)Not Only

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

    DBMS(数据库管理系统)

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

    1.4、MySQL简介

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

    1.5、基础操作

    1.连接数据库

    mysql -u账户名 -p密码
    

    填写你的账户名和密码

    2.查看所有数据库

    show databases; --注意分号结尾
    

    3.切换数据库

    use 数据库名   --切换数据库
    

    4.查看所有表

    show tables;   --查看数据库中所有表
    

    5.显示库中表的所有信息

    describe 表名; --记得分号喔
    desc 表名;    --效果相同
    

    6.创建数据库

    create database 数据库名;
    

    7.退出连接

    exit;
    

    8.单行注释

    --	单行注释(SQL的本来的注释)
    /*
    sql多行注释
    */
    #	sqlyog的注释
    

    数据库xxx语言

    DDL 定义

    DML 操作

    DQL 查询

    DCL 控制

    2、操作数据库

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

    mysql 关键字区分大小写

    2.1、操作数据库(了解)

    1、创建数据

    CREATE DATABASE [IF NOT EXISTS] learnmysql
    

    2、删除数据库

    DROP DATABASE [IF EXISTS] learnmysql
    

    3、使用数据库

    --tab 键上面,如果你的表名或者字段名试一个特殊字符,就需要带``
    USE `school`
    

    学习思路:

    • 对照sqlyog可视化历史记录查看sql
    • 固定的语法或关键字必须要强行记住!

    2.2、数据库的列类型

    数值

    • tinyint 十分小的数据 1个字节
    • smallint 较小的字节 2个字节
    • mediumint 中等大小的数据 3个字节
    • int 标准的整数 4个字节(常用)
    • bigint 较大的数据 8个字节
    • float 单精度浮点数 4个字节
    • double 双精度浮点数 8个字节(精度问题!)
    • decimal 字符串形式浮点数 (金融计算时一般用这个)

    字符串

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

    时间日期

    java.util.Date

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

    null

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

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

    Unsigned:

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

    zerofill:

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

    自增:

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

    非空:NULL not NULL

    • 假设设置为not null,如果不给它赋值,就会报错
    • NULL,如果不填写值,默认就是null

    默认:

    • 设置默认的值!
    • sex,默认值:男,如果不指定该列的值,则会有默认的值!

    拓展:

    /*
    每一个表都必须要有以下五个字段,未来做项目用的,表示一个巨鹿存在的意义
    id	主键
    `version`	乐观锁
    is_delete	伪删除
    gmt_create	创建时间
    gmt_update	修改时间
    */
    

    2.4、创建数据库表

    --注意:使用英文的(),
    --表的名称和字段尽量使用``括起来
    --字符串用'单引号'括起来
    --所有语句后面加,(英文的),最后一个不用加
    --PRIMARY KEY 主键,一般一个表一个
    CREATE TABLE IF NOT EXISTS `student`(
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
    `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
    `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
    `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (`id`)
    )ENGINE=INNODB DEFAULT CHARSET = utf8
    

    格式

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

    常用命令

    SHOW CREATE DATABASE school	--查看创建数据库的语句
    SHOW CREATE TABLE student	--查看student数据表的定义语句
    DESC student	--显示表的结构
    

    2.5、数据库表的类型

    --关于数据库引擎
    /*
    INNODE 默认使用~
    MYISAM 早些年使用的
    */
    
    MYISAM INNODE
    事务支持(同成功同失败) 不支持 支持
    数据行锁定(锁定一行) 不支持 表锁 支持
    外键约束 不支持 支持
    全文索引 支持 不支持
    表空间大小 较小 较大,约为2倍

    常规使用操作:

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

    在物理空间存在的位置

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

    本质还是文件存储

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

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

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

    CHARSET=utf8
    

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

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

    修改:

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

    character-set-server=utf8
    

    2.6、修改删除表

    修改

    --修改表 ALTER TABLE 旧表名 RENAME AS 新表明
    ALTER TABLE teacher RENAME AS teacher1
    
    --增加表的字段 ALTER TABLE 表名 ADD 字段名 列属性
    ALTER TABLE teacher1 ADD age INT(11)
    
    --修改表的字段(重命名,修改约束!)
    --ALTER TABLE表名 MODIFY 字段名 列属性[]
    ALTER TABLE teacher1 MODIFY age VARCHAR(11)      --修改约束
    --ALTER TABLE表名 CHANGE 旧名字 新名字 列属性[]
    ALTER TABLE teacher1 CHANGE age age1 INT(1)      --字段重命名
    
    --删除表的字段:ALTER TABLE 表名 DROP 字段名
    ALTER TABLE teacher1 DROP age1
    

    删除

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

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

    注意点:

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

    3、MySQL数据管理

    3.1、外键(了解即可)

    方式一、在创建表的时候,增加约束(麻烦)

    -- 定义外键key
    -- 给这个外键添加约束(执行引用) references 引用
    CREATE TABLE `student` (
      `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
      `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
      `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
      `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
      `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
      `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
      `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
      `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
      PRIMARY KEY (`id`),
      KEY `FK_gradeid` (`gradeid`),
      CONSTRAINT `FK_gradeid` FOREIGN KEY (`gradeid`) REFERENCES `grade` (`gradeid`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    

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

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

    CREATE TABLE `student` (
      `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
      `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
      `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
      `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
      `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
      `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
      `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
      `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
      PRIMARY KEY (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8
    
    -- 创建表的时候没有外键关系
    ALTER TABLE `student` 
    ADD CONSTRAINT `FK_ gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`);
    
    -- ALTER TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN KEY(作为外键的列) REFERENCES 哪个表(哪个字段)
    

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

    最佳实践

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

    3.2、DML语言(全部记住)

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

    DML语言:数据操作语言

    • Insert
    • update
    • delete

    3.3、添加

    insert

    CREATE TABLE IF NOT EXISTS `student`(
    `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
    `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT  '姓名',
    `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
    `sex` VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '性别',
    `birthday` DATETIME DEFAULT NULL COMMENT '出生年月',
    `gradeid` INT(10) NOT NULL COMMENT '学生的年级',
    `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
    `email`VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY(`id`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    
    
    -- 插入语句(添加)
    -- insert into 表名([字段1,字段2,..])values ('值1'),('值2'),...
    INSERT INTO `grade`(`gradename`) VALUES ('大四')
    
    -- 由于主键自增我们可以省略(如果不写表的字段,他就会一一匹配)
    INSERT INTO `grade` VALUES ('大三')
    
    -- 一般写插入语句,我们一定要数据和字段一一对应!
    
    -- 插入多个字段
    INSERT INTO `grade`(`gradename`) VALUES ('大一'),('大二')
    
    INSERT INTO `student`(`name`) VALUES ('张三')
    
    INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('李梅','aaaa','女')
    
    INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('李梅','aaaa','女'),('肖战','aaada','女')
    

    (遇到问题,在图形界面里改吧。)

    语法:insert into 表名([字段1,字段2,..])values ('值1'),('值2'),...

    注意事项:

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

    3.4、修改

    update 修改谁 (条件) set 原来的值 = 新值

    -- 修改学员名字,带了简介
    UPDATE `student` SET `name` = '大壮' WHERE id = 3;
    
    -- 不指定条件的情况下,会改变所有的表
    UPDATE `student` SET `name`= '哦吼'
    
    -- 语法:
    -- UPDATE 表名 set clonum_name = value,[clonum_name = value] where [条件]
    

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

    操作符会返回布尔值

    操作符 含义 范围 结果
    = 等于 1=2 false
    <> 或 != 不等于 1<>2 true
    > 大于 1>2 false
    < 小于 1<2 true
    >= 大于等于
    <= 小于等于
    BETWEEN ...and 在某个范围内 [2,5]
    AND 和 && 5>1 and 1>2 false
    OR 或 || 5>1 or 2>1 true
    -- 通过多个条件定位数据,无上限! && || or
    UPDATE `student` SET `name`='条件定位' WHERE `pwd` = 'aaaa' AND sex = '女'
    

    语法:UPDATE 表名 set clonum_name = value,[clonum_name = value] where [条件]

    注意:

    • colnum_name 是数据库的列,尽量带上``
    • 条件, 筛选的条件,如果没有指定,则会修改所有的列
    • value ,是一个具体的值,也可以是一个变量
    UPDATE `student` SET `birthday`= CURRENT_TIME WHERE `pwd` = 'aaaa' AND sex = '女'
    

    3.5、删除

    delete 命令

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

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

    TRUNCATE 命令

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

    -- 清空表
    TRUNCATE `student`
    

    delete 和 TRUNCATE 的区别

    • 相同点:都能删除数据,都不会删除表结构
    • 不同:
      • TRUNCATE 重新设置 自增列,计数器会归零
      • TRUNCATE 不会影响事务

    TRUNCATE 自增会归零

    了解:DELETE 删除问题,重启数据库,现象

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

    4、DQL查询数据(最重点)

    4.1、DQL

    (Data Query LANGUAGE:数据查询语言)

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

    4.2、指定查询字段

    -- 查询全部学生   SELECT 字段 FROM 表
    SELECT * FROM student
    
    SELECT * FROM result
    
    -- 查询指定字段
    SELECT `studentno`,`studentname` FROM student
    
    -- 别名,给结果起一个名字 AS 可以给字段其别名,也可以给表起别名
    SELECT `studentno` AS 学号,`studentname` AS 学生姓名 FROM student
    
    -- 函数,Concat(a,b) 拼接字符串
         SELECT CONCAT('姓名:',studentname) AS 新名字 FROM student
    

    语法:SELECT 字段,... FROM 表

    有的时候,列名字不是那么清楚,我们可以起别名 AS 字段名 as 别名 表名 as 别名

    去重 distinct

    作用:去除SELECT查询出来的结果中重复的数据,重复数据只显示一条

    -- 查询一下有哪些同学参加了考试,成绩
    SELECT * FROM result -- 查询全部的考试成绩
    -- 查询有哪些同学参加了考试
    SELECT `studentno` FROM result
    -- 发现重复数据,去重
    SELECT DISTINCT `studentno` FROM result  -- 去重复数据
    

    数据库列的表达式:

    SELECT VERSION()  -- 查询系统的版本号(函数)
    SELECT 100*3-1+2 AS 计算结果  -- 用来计算(表达式)
    SELECT @@auto_increment_increment -- 查询自增的步长(变量)
    
    -- 学员考试成绩 +1 分 查看
    SELECT `studentno`,`studentresult`+1 AS '提分后' FROM result 
    

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

    select 表达式 from 表

    4.3、where条件子句

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

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

    逻辑运算符

    运算符 语法 描述
    and && a&&b a and b 逻辑与,两个都为真
    or || a||b a or b 逻辑或,其中一个真,都真
    Not ! not a !a 逻辑非,真为假,假为真

    尽量使用英文字母

    SELECT studentno,`studentresult` FROM result
    
    -- 查询考试成绩在 95-100 分之间的
    SELECT studentno,`studentresult` FROM result WHERE studentresult>=95 AND studentresult<=100
    
    
    -- and  &&
    SELECT studentno,`studentresult` FROM result WHERE studentresult>=95 && studentresult<=100
    
    -- 模糊查询(区间)
    SELECT studentno,`studentresult` FROM result
    WHERE studentresult BETWEEN 95 AND 100
    
    -- 除了1000号学生之外的学生成绩
    SELECT studentno,`studentresult` FROM result
    WHERE studentno != 1000;
    
    > 模糊查询:比较运算符
    
    | 运算符      | 语法                | 描述                                 |
    | ----------- | ------------------- | ------------------------------------ |
    | IS NULL     | A is null           | 如果操作符为null,则结果为真         |
    | IS NOT NULL | a is not null       | 如果操作符不为not null,结果为真     |
    | BETWEEN     | a between b and c   | 若a 在 b 和 c 之间,则结果为真       |
    | **Like**    | a like b            | SQL匹配,如果a匹配b,则结果为真      |
    | **In**      | a in (a1,a2,a3....) | 假设a在a1,或者a2...其中的某一个值中 |
    
    ```sql
    -- ==========================  where  ===============================
    SELECT studentno,`studentresult` FROM result
    
    -- 查询考试成绩在 95-100 分之间的
    SELECT studentno,`studentresult` FROM result WHERE studentresult>=95 AND studentresult<=100
    
    
    -- and  &&
    SELECT studentno,`studentresult` FROM result WHERE studentresult>=95 && studentresult<=100
    
    -- 模糊查询(区间)
    SELECT studentno,`studentresult` FROM result
    WHERE studentresult BETWEEN 95 AND 100
    
    -- 除了1000号学生之外的学生成绩
    SELECT studentno,`studentresult` FROM result
    WHERE studentno != 1000;
    
    INSERT INTO `result` (studentno,subjectno,examdate,studentresult) 
    VALUES(1001,1,'2021-1-1 13:00:00',50),(1001,2,'2021-1-1 16:00:00',85),(1001,3,'2021-1-1 5:00:00',65),(1001,4,'2021-1-1 17:00:00',77),(1001,5,'2021-1-1 16:01:00',35)
    
    INSERT INTO `result` (studentno,subjectno,examdate,studentresult) 
    VALUES(1002,1,'2021-1-1 13:00:00',77),(1002,2,'2021-1-1 16:00:00',93),(1002,3,'2021-1-1 5:00:00',98),(1002,4,'2021-1-1 17:00:00',100),(1002,5,'2021-1-1 16:01:00',60)
    
    `studentno`
    
    SELECT studentno,`studentresult` FROM result WHERE studentresult>=50 AND studentresult<100
    SELECT subjectno,`studentresult` FROM result WHERE studentresult>=50 AND studentresult<100
    SELECT studentno,`studentresult` FROM result WHERE studentno = 1002
    SELECT studentno,`studentresult` FROM result WHERE NOT studentresult = 98
    
    
    -- ==========================  模糊查询  ===============================
    
    -- 查询姓张的同学
    -- like 结合 %(代表0到任意个字符)    _(一个字符)
    SELECT studentno,`studentname` FROM student
    WHERE studentname LIKE '张%'
    
    -- 查询姓张的同学,名字后面只有一个字的
    SELECT `studentno`,`studentname` FROM `student`
    WHERE studentname LIKE '张_'
    
    -- 查询姓张的同学,名字后面只有两个字的
    SELECT `studentno`,`studentname` FROM `student`
    WHERE studentname LIKE '张__'
    
    -- 查询名字中间有大字的同学 %大%
    SELECT `studentno`,`studentname` FROM `student`
    WHERE studentname LIKE '%大%'
    
    -- ==============   in(具体的一个或者多个值)   ===============
    -- 查询  1001.1002,1003号学员的信息
    SELECT `studentno`,`studentname` FROM `student`
    WHERE studentno IN (1001,1002,1003)
    
    -- 查询在广东的学生
    SELECT `studentno`,`studentname` FROM `student`
    WHERE `address` IN ('云南','北京朝阳')
    

    4.4、联表查询

    JOIN 对比

    image-20210222204802931

    img

    -- ==============   联表查询 join   ===============
    
    -- 查询参加了考试的同学(学号,姓名,科目编号,分数) 
    SELECT * FROM student
    SELECT * FROM result
    
    /*思路
    1.分析需求,分析查询的字段来自哪些表,(连接查询)
    2.确定使用哪种连接查询?7种
    确定交叉点(这两个表中哪个数据是相同的)
    判断的条件:学生表中的studentno = 成绩表中的studentno
    */
    
    -- join (连接的表) on(判断的条件) 连接查询
    -- where 等值查询
    
    SELECT s.studentno,studentname,subjectno,studentresult
    FROM student AS s
    INNER JOIN result AS r
    WHERE s.studentno = r.studentno
    
    -- Right Join
    SELECT s.studentno,studentname,subjectno,studentresult
    FROM student s
    RIGHT JOIN result AS r
    ON s.studentno = r.studentno
    
    -- Left Join
    SELECT s.studentno,studentname,subjectno,studentresult
    FROM student s
    LEFT JOIN result AS r
    ON s.studentno = r.studentno
    
    操作 描述
    Inner join 如果表中至少有一个匹配,就返回结果
    left join 会从左表中返回所有的值,即使右表中没有匹配
    right join 会从右表中返回所有的值,即使左表中没有匹配
    -- 查询缺考的同学
    SELECT s.studentno,studentname,subjectno,studentresult
    FROM student s
    LEFT JOIN result AS r
    ON s.studentno = r.studentno
    WHERE studentresult IS NULL
    
    -- 思考题(查询了参加考试的同学信息:学号,学生姓名,科目名称,分数)
    /*思路
    1.分析需求,分析查询的字段来自哪些表,(连接查询)
    2.确定使用哪种连接查询?7种
    确定交叉点(这两个表中哪个数据是相同的)
    判断的条件:学生表中的studentno = 成绩表中的studentno
    */
    
    SELECT s.studentno,studentname,subjectname,studentresult
    FROM student s
    RIGHT JOIN result r
    ON r.studentno = s.studentno
    INNER JOIN `subject` sub
    ON r.subjectno = sub.subjectno
    
    
    -- 我要查询哪些表,select...
    -- 从哪几个表中查 from 表 xxx join 连接的表 on 交叉条件
    -- 假设存在一种多张表的查询,慢慢来,先查询两张表,然后再慢慢增加。
    
    -- from a left join b
    -- from a right join b
    

    自连接

    自己的表和自己的表连接,核心:一张表拆为两张一样的表即可

    父类

    categoryid categoryName
    2 信息技术
    3 软件开发
    5 美术设计

    子类

    pid categoryid categoryName
    3 4 数据库
    2 8 办公信息
    3 6 web开发
    5 7 ps技术

    操作:查询父类对应的子类关系

    父类 子类
    信息技术 办公信息
    软件开发 数据库、web开发
    美术设计 ps技术
    -- 查询父子信息:把一张表拆成两个单独的表
    SELECT a.`categoryname` AS '父栏目',b.`categoryname` AS '子栏目'
    FROM `category` AS a,`category` AS b
    WHERE a.`categoryid` = b.`pid`
    
    -- 查询学生所属的年级(学号,学生姓名,年级名称)
    SELECT studentno,studentname,gradename
    FROM student s
    INNER JOIN grade g
    ON s.gradeid = g.gradeid
    
    -- 查询科目所属的年级(科目id,科目名称,年级名称)
    SELECT subjectno,subjectname,gradename
    FROM `subject` s
    INNER JOIN grade g
    ON s.gradeid = g.gradeid
    
    -- 查询参加考试的学生信息:学号,学生姓名,科目名,分数
    SELECT stu.studentno AS '学号',studentname AS '学生姓名',subjectname AS '科目名',studentresult AS '分数'
    FROM `student` stu
    INNER JOIN result r
    ON stu.studentno = r.studentno
    INNER JOIN `subject` sub
    ON r.subjectno = sub.subjectno
    

    4.5、分页和排序

    排序

    -- 排序:升序ASC,降序DESC
    -- ORDER BY 通过哪个字段排序,怎么排
    -- 查询结果根据成绩 降序 排序
    SELECT stu.studentno AS '学号',studentname AS '学生姓名',subjectname AS '科目名',studentresult AS '分数'
    FROM `student` stu
    INNER JOIN result r
    ON stu.studentno = r.studentno
    INNER JOIN `subject` sub
    ON r.subjectno = sub.subjectno
    WHERE subjectname = '高等数学-1'
    ORDER BY studentresult DESC
    

    分页

    -- 100w条数据
    -- 为什么要分页?
    -- 缓解数据库压力,给人的体验更好, 瀑布流
    
    -- 分页,每页只显示五条数据
    -- 语法:limit 起始值,页面的大小
    -- 网页应用:当前,总的页数,页面的大小
    -- LIMIT 0,2 1~2
    SELECT stu.studentno AS '学号',studentname AS '学生姓名',subjectname AS '科目名',studentresult AS '分数'
    FROM `student` stu
    INNER JOIN result r
    ON stu.studentno = r.studentno
    INNER JOIN `subject` sub
    ON r.subjectno = sub.subjectno
    WHERE subjectname = '高等数学-1'
    ORDER BY studentresult DESC
    LIMIT 0,2
    
    
    -- 第一页 limit 0,5
    -- 第二页 limit 5,5
    -- 第三页 limit 10,5
    -- 第四页 limit 15,5
    -- 。。。
    -- 第N页 limit 5*(N-1),5      (n-1)*pageSize,pageSize
    -- 【pagesize:页面大小】
    -- 【(n-1)*pagesize:起始值】
    -- 【n:当前页】
    -- 【数据总数/页面大小 = 总页数】
    

    语法:limit(查询起始 下表,pagesize)

    4.6、子查询

    where(值是固定的,这个值是计算出来的)

    本质:在where语句中嵌套一个子查询语句

    where(select * from)

    -- 1. 查询C语言-1的所有考试结果(学号,科目编号,成绩),降序
    -- 方式一:使用连接查询
    SELECT s.`studentno`,r.`subjectno`,`studentresult` 
    FROM student s
    INNER JOIN result r
    ON s.studentno = r.studentno
    INNER JOIN `subject` sub
    ON r.subjectno = sub.subjectno
    WHERE subjectname = 'c语言-1'
    ORDER BY studentresult DESC
    
    
    -- 方式二:使用子查询(有里及外)
    SELECT DISTINCT `studentno`,`subjectno`,`studentresult`
    FROM `result`
    WHERE `subjectno` = (
    	SELECT subjectno FROM `subject`
    	WHERE `subjectname` = 'c语言-1'
    )
    ORDER BY studentresult DESC
    
    
    -- 在改造(由里及外)
    SELECT `studentno`,`studentname` FROM student WHERE studentno IN(
    	SELECT studentno FROM result WHERE subjectno = (
    		SELECT subjectno FROM `subject` WHERE subjectname = 'c语言-1'
    	)
    )
    

    4.7、分组过滤

    -- 查询不同课程的平均分,最高分,最低分
    -- 核心: 根据不同的课程分组
    SELECT any_value(`subjectname`),AVG(`studentresult`) AS '平均分',MAX(`studentresult`) AS 最高分,MIN(`studentresult`) AS 最低分
    FROM result r
    INNER JOIN `subject` sub
    ON r.subjectno = sub.subjectno
    GROUP BY r.subjectno  -- 通过什么字段来分组
    HAVING 平均分>80
    

    4.8、select 小结

    顺序很重要

    select 去重 要查询的字段 from 表

    xxx join 要连接的表 on 等值判断

    where(具体的值,子查询语句)

    group by (通过哪个字段分组)

    having (过滤后分组的信息,条件和where是一样的,位置不同)

    order by (通过哪个字段排序)

    limit startindex ,pagesize

    5、MySQL函数

    5.1、常用函数

    -- ======================== 常用函数 ============================
    
    -- 数学运算
    SELECT ABS(-2)   -- 绝对值
    SELECT CEILING(9.7)   -- 向上取整
    SELECT FLOOR(9.7)    -- 向下取整
    SELECT RAND()     -- 返回一个0~1之间的一个随机数
    SELECT SIGN(-10)    -- 判断一个数的符号   0-0   负数返回-1,整数返回1
    
    -- 字符串函数
    SELECT CHAR_LENGTH('得道者多助,失道者寡助')   -- 字符串长度
    SELECT CONCAT('I',' Love',' You')    -- 拼接字符串
    SELECT INSERT('你今天睡醒了没有',1,1,'小詹') -- 查询,从某个位置开始替换某个长度
    SELECT UPPER('Zjw') -- 转大写
    SELECT LOWER('Zjw') -- 转小写
    SELECT INSTR('xiaozhan','z')    -- 返回第一次出现的子串的索引
    SELECT REPLACE('坚持就是胜利','坚持','努力') -- 替换出现的指定字符串
    SELECT SUBSTR('坚持就是胜利',5,2)	-- 返回指定的子字符串(源字符串,截取的位置,截取的长度)
    SELECT REVERSE('坚持就是胜利')	-- 反转
    
    -- 查询姓 小的同学,改成大
    SELECT REPLACE(studentname,'小','大') FROM student
    WHERE studentname LIKE '小%'
    
    
    -- 时间和日期函数(记住)
    SELECT CURRENT_DATE() -- 获取当前日期
    SELECT CURDATE()	-- 获取当前日期
    SELECT NOW()	-- 获取当前时间
    SELECT LOCALTIME()	-- 本地时间
    SELECT SYSDATE()	-- 系统时间
    
    SELECT YEAR(NOW())
    SELECT MONTH(NOW())
    SELECT DAY(NOW())
    SELECT HOUR(NOW())
    SELECT MINUTE(NOW())
    SELECT SECOND(NOW())
    
    -- 系统
    SELECT SYSTEM_USER()
    SELECT USER()
    SELECT VERSION()
    

    5.2、聚合函数(常用)

    函数名称 描述
    COUNT() 计数
    SUM() 求和
    AVG() 平均值
    MAX() 最大值
    MIN() 最小值
    ... ...
    -- ========================= 聚合函数 ========================
    -- 都能够统计 表中的数据(想查询一个表中有多少条记录,就用count)
    SELECT COUNT(studentname) FROM student;-- count(指定列),会忽略所有的null值
    
    SELECT COUNT(*) FROM student; -- count(*),不会忽略null值,本质:计算行数
    SELECT COUNT(1) FROM result;  -- count(1),不会忽略null值,本质:计算行数
    
    
    SELECT SUM(`studentresult`) AS '总和' FROM result
    SELECT AVG(`studentresult`) AS '平均分' FROM result
    SELECT MAX(`studentresult`) AS '最高分' FROM result
    SELECT MIN(`studentresult`) AS '最低分' FROM result
    

    5.3、数据库机别的MD5加密(扩展)

    什么是MD5?

    主要增强算法复杂度和不可逆。

    MD5不可逆,具体的值md5是一样的

    MD5破解网站的原理,就是找。

    -- ==================== 测试MD5 加密======================
    CREATE TABLE `testmd5`(
    	`id` INT(4) NOT NULL,
    	`name` VARCHAR(20) NOT NULL,
    	`pwd` VARCHAR(50) NOT NULL,
    	PRIMARY KEY(`id`)
    )ENGINE= INNODB DEFAULT CHARSET=utf8
    
    -- 明文密码
    INSERT INTO testmd5 VALUES(1,'zhangsan','123456'),(2,'lsi','123456'),(3,'wangwu','123456')
    
    -- 加密
    UPDATE testmd5 SET pwd = MD5(pwd) WHERE id!=1
    
    -- 插入时就要加密
    INSERT INTO testmd5 VALUES(4,'xiaoming',MD5('123456'))
    
    -- 如何校验:将用户传递进来的密码,进行md5加密,然后比对加密后的值
    SELECT * FROM testmd5 WHERE `name` = 'xiaoming' AND pwd = MD5('123456')
    
  • 相关阅读:
    最小乘积(基本型)
    删除数组零元素
    大小写转换
    矩阵乘法
    字串统计
    出现次数最多的整数
    Anagrams问题
    前缀表达式
    2的次幂表示
    POJ
  • 原文地址:https://www.cnblogs.com/jev-0987/p/14351879.html
Copyright © 2011-2022 走看看