A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 g207776411 于 2018-5-9 17:09 编辑

Day_08数据库概述

Day_08Mysql数据库(结构化查询语言)/数据库概述
面试重点
DDL:create ,later, drop,truncate
DML:insert, update , delete
DCL : if
DQL: selec
关系型数据库的概念:
  • 关系型数据库,保存的就是实体之间的关系
  • Mysql是一个关系型数据库
  • 数据库保存的是实体之间的关系   俗称ER模型

对数据库中数据的操作简称为crud
  • 数据库---数据库中的表----表的数据

常见的关系型数据库
  • MySQL
  • Oracle
  • SQLServer
  • DB2
  • SyBase

SQL的分类(不区分大小写,它被叫做结构化查询语言)
  • DDL: 数据定义语言

    • create(添加),drop(删除),alter(修改)..

  • DCL: 数据控制语言,编程的时候使用

    • grant(授权)  if

  • DML:数据操控语言

    • insert(插入),update(更新),delete(删除)

  • DQL: 数据查询语言

    • select(选择)


SQL创建表
  • 语法:

    • create table 表名称(字段名称 字段类型(长度) 约束,字段匿名成 字段类型(长度) 约束)
    • create database 表名称  character set  字符集(utf8)  collate 校对规则(utf8_bin);

  • 字段类型

    • 一个实体对应一个表,一个实体属性对应表的一个字段


  • Java中的类型                                        MySQL中的类型
    byte/short/int/long        tinyint(tiny<微小的>)/smallint/int/bigint
    float                                                        floatdouble                                                         double boolean                                        bit(一般用1和0来表示true和false)
    char/String                         char 和varchar类型Date                                date/time/datetime/timestampfile                         BLOB(mp3文件)/TEXT(代表的是文件路径组成的字符串)                                       
    MySQL中类型的区别:char和varchar的区别:
    char:当录入的字符长度不够的时候会用空格自动补充(固定长度)varchar:当录入的字符长度是多少,就录入多少,不会补充(可变长度)datetime和timestamp的区别:两者都包括日期和事件.不同的是 datetime,如果没有向这个字段传入具体的值,那么它默认返回的是nulltimestamp如果没有向这个字段传入具体的值,那么返回的是当前系统的时间,通常用来记录文件创建的事件        
  • 约束作用:主要是为了数据的完整性

    • 主键约束:primary key  主键约束默认就是唯一非空的    auto_increment(自动增加)   
    • 唯一约束: unique
    • 非空约束: not null


SQL表的修改
  • 添加列

    • alter  table 表单名 add   字段名  数据类型(长度) 约束

  • 修改列类型

    • alter table  表单名  modify(修改)  列名  数据类型(长度) 约束

  • 删除列

    • alter table 表单名 drop 列名;

  • 修改列名称

    • alter table 表单名 change  旧列名   新列名 类型(长度)  约束

  • 修表名

    • rename  table 表单名 to 新的表名

  • 修改表的字符集

    • alter table 表名  character set 字符集


数据库的操控:
  • 创建

    • create  database 数据库名称;

  • 查询

    • show databases;  (查询所有数据库)
    • show  create database  数据库名称;  查询数据详细信息

  • 删除

    • drop database 数据库名称;

  • 修改

    • select database 数据库名称;
    • alter database  数据库名称 character set utf8;   修该数据库字符集格式

  • 切换

    • use 数据库名称;
    • select database();   查看当前操作的数据库


Day_08 MySQL的语法
表数据的添加
  • 指定字段添加

    • insert into  表名称 (字段名) values( 对应的字段的值)  

  • 给所有字段添加值

    • insert into 表名称 values(按照字段的顺序,一次录入对应的字段的值)
    • 直接向数据库中插入中文记录会出现错误!!!
      解决方法:
      ​         show   variables   like    '%character%';  --**查看数据库中与字符集相关参数:
      ​         需要将MySQL**数据库服务器中的客户端部分的字符集改为gbk
      ​         找到MySQL**的安装路径:my.ini文件,修改文件中[client]下的字符集


表数据的查看
  *  selsect *  from 表名称
查询字符集
  • show variables like '%charact%'

修改表中的记录
  • update  tab1 set  字段名='值' ; (修改所有的字段名的值)  
  • 指定字段修改值

    • update  表名称  set 字段名='值'   where id =2;

    file:///C:/Users/Administrator/AppData/Roaming/feiq/RichOle/1497512211.bmp?lastModify=1525855033
  • 一次性修改多个字段的值,我们可以直接用逗号隔开

    • update   表名称   set  字段名 ='值'   ,字段名='值',字段名='值'   where 字段=字段等于什么的 ;


删除表中的记录   
  • delete  from 表名  where  字段名=值;
  • delete  from 表名(删除以后可以使用rollback;恢复数据)事务可以作用在 DML上;删除之前 先开启事务 start  transaction;
  • start transaction ;(删除以后,不可以恢复)事务不能作用在DDL上

查看表中的记录(重点)
  • 基本查询

    • 语法: select [distinct]   列名  from  表 [条件];

      • 如果要去重查询的,必须加上distinct

    • 环境
        create table exam(
            id int primary key auto_increment,
            name varchar(20),
            english int,
            chinese int,
            math    int
        );
        ​
        insert into exam values (null,'张三',85,74,91);
        insert into exam values (null,'李四',95,90,83);
        insert into exam values (null,'王五',85,84,59);
        insert into exam values (null,'赵六',75,79,76);
        insert into exam values (null,'田七',69,63,98);
        insert into exam values (null,'李老八',89,90,83);
      • 查询所有学生考试成绩信息
        select * from exam;
      • 查询所有学生的姓名和英语成绩
        select  name,english  from exam;
      • 查看学生姓名和学生的总成绩
        select  name,english+chinese+math from exam;
      • 别名查询
        select  name,english+chinese+math (as 就是给你计算出的名字重新命名)  sum from exam;


  • 条件查询

    • 使用where 字句
    • <>数据库中不等于和Java中不一样,代表不等于
    • > ,<,>=,<=,<>,=
    • like; 模糊查询
    • in: 范围查询
    • 条件关联 : and 先当&&,  or相当于||   , not  不能为

  • 查询李四学生的成绩

    • select  * from exam where name ='李四';

  • 查询名称叫李四学生并且英文大于90分

    • select * from exam where name='李四' and english>90;

  • 查询姓李的学生的信息

    • like 可以进行模糊查询  ,%在like中代表占位符. '_'只能代表一个字符,%可以代表多个字符

      • '李_'     名字中必须是两个字,而且是姓李的.
      • %李     名字以李结尾的
      • %李%    名字中包含李的
      • 李%       以李字  开头的

    • select * from exam where name  like '李%';

  • 查询英语成绩是69,75,89学生的信息,查询的是英语成绩69到89 分之间的所有学生

    • select * from exam where english in(69,75,89);   

  • 排序查询

    • 使用order by  字段名称 asc(升序)/desc(倒序);
    • 查询学生信息, 并且按照语文成绩进行排序;

      • select * from exam order by chinese;

    • 查询学生信息,并且按照语文成绩倒叙排序:

      • select * from exam order by chinese desc;

    • 查询学生信息,先按照语文成绩进行倒叙排列,如果成绩相同的在按照英语成绩升序进行排列

      • select * from exam order by chinese desc,english asc;

    • 查询姓李的学生的信息,按照英语成绩降序排序

      • select * from exam  where name like '李%' order by english desc;


  • 分组统计查询

分组统计查询
  • 聚合函数的使用

    • 求总和 sum,求英语成绩总和  (按照字段求和,按列计算)

      • select  sum(english)  from exam;

    • 查询英语成绩总和和数学成绩总和(横向求和,按行计算)

      • select sum(english+math) from exam;

    • 查询姓李的学生的英语和数学成绩的总和

      • select sum(english),sum(math) from exam where name like '李%';

    • 查询所有学生各科的总成绩:

      • 第一种方法:
      • select sum(english)+sum(chinese)+sum(math) from exam;
      • 第二种方法:
      • select sum(english+chinese+math) from exam;
      • 加入english 中有一个人成绩么有录入成绩,那么我们需要这样求和通过ifnull做一下判断
      • select sum(ifnull(english,0)+chinese+math) from exam;

    • 获取所有学生的总数

      • count();
      • select count(*) from exam;

    • 获取某一个姓氏的学生的个数

      • select count(*) from exam where name like '李%';

    • 常用的用来求最大值,最小值,平均数的语句

      • 最大值 : select max(english) from exam;
      • 最小值: select min(english) from exam;
      • 平均数: select avq(english) from exam;


  • 分组查询

    • 语法: 使用group by 字段名称;
    • 环境准备
        
        create table orderitem(
            id int primary key auto_increment,
            product varchar(20),
            price double
        );
        insert into orderitem values (null,'电视机',2999);
        insert into orderitem values (null,'电视机',2999);
        insert into orderitem values (null,'洗衣机',1000);
        insert into orderitem values (null,'洗衣机',1000);
        insert into orderitem values (null,'洗衣机',1000);
        insert into orderitem values (null,'冰箱',3999);
        insert into orderitem values (null,'冰箱',3999);
        insert into orderitem values (null,'空调',1999);
        ​
    • 按商品名称统计 ,每类商品所购的个数

      • select product,count(*) from orderitem group by product; (group by 后面跟什么就是以什么分组)

    • 按商品名称统计,每类商品锁花费的总金额:

      • select product,sum(price) from orderitem group by product;

    • 按商品名称统计 ,统计每类商品花费的总金额在5000元以上的商品

      • select product,sum(price) from orderitem   group by product having  sum(price);

    • 总结:使用规则

      • S(select)...F(from)..W(where)..G(group by).. H(having)..O(order by);
      • 即select from 表明 where  条件 group by 分组的依据  having 聚合函数  order by 排序






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马