• MySQL数据库day7.11


    一,SQL概述

    1.1 SQL语句语法

    MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写,
    以分号结尾。例如:
    SELECT * FROM user;
    使用 /**/ -- # 的方式完成注释
    1. /*
    2. 多行注释
    3. */
    4. -- 单行注释
    5. # 单行注释
    6. SELECT * FROM user;

    1.2 SQL中数据的常用数据类型

    固定长度 char(n) 例如 : char(20), 最大能存放 20 个字符 . ‘aaa’,
    还是占 20 个字符的空间
    可变长度 varchar(n) 例如 :varchar(20), 最大能存放 20 个字符 .
    ‘aaa’, 3 个字符的空间
    一般使用 varchar(n) 节省空间 ; 如果长度 ( 身份证 ) 是固定的话 可
    以使用 char(n) 性能高一点

    二·,DDL操作数据库

    2.1 创建数据库

      语法
    1. create database 数据库名 [character set 字符集][collate校对规则]    
    2. 注: []意思是可选的意思
      创建一个 day0708_1 的数据库(默认字符集 )
    create database day0708_1;
       创建一个day0708_2 的数据库 , 指定字符集为 gbk( 了解 )
    create database day0708_2 character set gbk;

    2.2 查看所有的数据库

      语法:查看所有的数据库
    show databases;
      语法:查看数据库的定义结构【了解】
    show create database 数据库名;
    1. -- 查看数据库
    2. -- 语法: show databases; 查询所有的数据库
    3. show databases
    4. -- 语法: show create database 数据库名; 查看数据库的定义
    5. 结构【了解】
    6. show create database day0708_1
    7. show create database day0708_2

    2.3 删除数据库

      语法
    drop database 数据库名;
    1. -- 需求: 删除day0708_2数据库
    2. drop database day0708_2;

    2.4 修改数据库【了解】

      语法
    alter database 数据库名 character set 字符集;
    1. -- 需求: 把day0708_2数据库的字符集修改为utf8
    2. alter database day0708_2 character set utf8

      2.5 其他操作

      切换数据库: 在创建表之前一定要指定数据库。 use 数据库名
    use 数据库名;
    1. -- 语法: use 数据库名; 选中数据库
    2. use day0708_1;
    3. -- 语法: select database(); 查看当前选中(正在使用)的数据库
    4. select database();

    三,DDL操作表

     3.1 创建表

    1. 创建表, 格式:
    2.    create table 表名 (
    3.       字段名 数据类型[长度] [约束],
    4.       字段名 数据类型[长度] [约束],
    5.       ...
    6.    ); 注:[]中的内容是可选项

      3.2 SQL约束

    约束:即规则 , 规矩 限制 ;
    作用:数据库中的约束 , 就是指 表中的数据内容 不能胡乱填写 , 必须
    按照要求填写 . 好保证数据的完整性与安全性。
    not null: 非空约束 ;
    例如 : username varchar(40) not null username 这个列不
    能有 null
    unique: 唯一约束 , 后面的数据不能和前面重复 ;
    例如 : cardNo char(18) unique; cardNo 列里面不可以有重
    复数据
    primary key ;主键约束 ( 非空 + 唯一 );
    一般用在表的 id 列上面 . 一张表基本上都有 id 列的 , id 列作为
    唯一标识的
    auto_increment: 自动增长 , 必须是设置了 primary key 之后 ,
    才可以使用 auto_increment
    id int primary key auto_increment; id 不需要我们自己维
    护了 , 插入数据的时候直接插入 null , 自动的增长进行填充进
    , 避免重复了
    需求:创建一张学生表 ( 含有 id 字段 , 姓名字段 , 性别字段 . id 为主键自
    动增长 )
    1. -- 需求: 创建一张学生表(含有id字段,姓名字段,性别字段. id为主
    2. 键自动增长)
    3. -- 创建表之前需要选中数据库
    4. use day0708_1;
    5. create table student(
    6. id int primary key auto_increment,
    7. name varchar(40),
    8. gender varchar(13) not null
    9. );

    3.3 查看所有的表

      语法
    show tables;

    四,DML操作表记录-增删改

    4.1 插入记录

    1. -- 创建一张商品表(商品id,商品名称,商品价格,商品数量)
    2. create table product(
    3. id int primary key auto_increment,
    4. pname varchar(100),
    5. price double,
    6. num int
    7. );
    方式一 : 插入指定列 , 如果没有把这个列进行列出来 , null 进行
    自动赋值。
    1. insert into 表(列,列..) values(值,值..);
    2. insert into product(pname,price)
    3. values('Mac',18888);
    4. insert into product(pname,price,num)
    5. values('Mac',18888,null);
    方式二:插入所有的列
    1. insert intovalues(值,值....);
    2. insert into product values(null,'小米电脑',5888,10);
    3. insert into product values(null,'华硕电脑',5888,null);
    4. insert into product values(null,'苹果电
    5. 脑',18000.0,10);
    6. insert into product values(null,'华为5G手 机',30000,20);
    7. insert into product values(null,'小米手机',1800,30);
    8. insert into product values(null,'iPhonex',8000,10);
    9. insert into product values(null,'苹果电脑',8000,100);
    10. insert into product values(null,'iPhone7',6000,200);
    11. insert into product
    12. values(null,'iPhone6s',4000,1000);
    13. insert into product values(null,'iPhone6',3500,100);
    14. insert into product
    15. values(null,'iPhone5s',3000,100);
    16. insert into product values(null,'方便面',4.5,1000);
    除了整数 \ 小数类型外 , 其他字段类型的值必须使用引号引起来
    ( 建议单引号 )
    如果要插入空值 , 可以不写字段 , 或者插入 null

    4.2 更新记录

    语法
    update 表名 set=值, 列 =值 [where 条件]
    1. -- 更新记录
    2. -- 语法: update 表名 set=值, 列 =值 [where 条件]
    3. -- 需求:修改商品所有的价格为5000
    4. update product set price = 5000;
    5. -- 需求: 修改id为2的商品数量和价格
    6. update product set price = 8000,num = 20 where id = 2;
    7. -- 将商品名是Mac的价格修改为18000
    8. update product set price = 18000 where pname = 'Mac'
    9. -- 将商品名是Mac的价格修改为17000,数量修改为5
    10. update product set price = 17000,num = 5 where pname
    11. = 'Mac'
    12. -- 将商品名是方便面的商品的价格在原有基础上增加2
    13. update product set price = price + 2 where pname = '方便面'

    4.3 删除记录

    delete 语法:
    delete from 表 [where 条件]  
    truncate 语法:
    truncate table 表;
    1. -- 删除记录
    2. -- 语法一: delete from 表名 [where 条件]  
    3. -- 删除表中名称为’Mac’的记录
    4. delete from product where pname = 'Mac'
    5. -- 删除价格小于5001的商品记录
    6. delete from product where price < 5001
    7. -- 删除表中的所有记录
    8. delete from product
    9. -- 语法二: truncate table 表名;
    10. truncate table product
    delete truncate 区别【面试题】
    DELETE 删除表中的数据,表结构还在 ; 删除后的数据可以找
    , 一条一条的删除 .
    TRUNCATE 删除是把表直接 DROP 掉,然后再创建一个同样
    的新表。删除的数据不能找回。执行速度比 DELETE 快。
    工作里面的删除
    物理删除 : 真正的删除了 , 数据不在 , 使用 delete 就属于物理删
    逻辑删除 : 没有真正的删除 , 数据还在 . 搞一个标记 , 其实逻辑
    删除是更新 例如 : state 1 启用 0 禁用

    五,基本查询语法

    select [*] [列名 ,列名] [列名 as 别名 ...] [distinct 字段] from 表名 [where 条件]

    六.简单查询

    查询所有的列的记录
    查询某张表特定列的记录
    去重查询 :去重针对某列 , distinct 前面不能先出现列
    别名查询
    运算查询 (+,-,*,/ ) :运算查询 列名与列名之间是可以 运算的
    1. -- 查询所有的列语法:select * from 表名
    2. -- 需求:查询product表中的所有数据
    3. select * from product;
    4. -- 查询某张表特定列:select 列名,列名,... from 表 名
    5. -- 需求:查询product表中的pname,price字段的值
    6. select pname,price from product;
    7. -- 去重查询:select distinct 列名 from 表名
    8. -- 需求:查询price字段,[去重]单个字段去重
    9. select distinct price from product;
    10. -- 需求:查询pname,price字段,[同时去重]多个字段去重
    11. select distinct pname,price from product;
    12. -- 注意:distinct前面不能有字段名
    13. select id,distinct price from product;-- 报 错
    14. -- 别名查询
    15. -- 对字段取别名:select 字段 as 别名,字段 as 别 名,... from 表名。注意: as可以省略,一般都会省略
    16. select pname as 商品名称,num as 商品数量 from product;
    17. select pname 商品名称,num 商品数量 from product;
    18. -- 对表取别名:select1别名.字段名,... from1 as1别名。注意: as可以省略 一般都会省略
    19. select p.pname,p.price from product as p;
    20. select p.pname,p.price from product p;
    21. -- 运算查询(+,-,*,/等),null和其他数据进行运算得到 是null
    22. -- 需求:计算每个商品的总价(单价*数量)
    23. select price,num from product;
    24. select price*num from product;
    25. select price * num 总价 from product;
    26. select price * ifnull(num,0) 总价 from product;

    七.条件查询

    语法:
    select ... fromwhere 条件; //取出表中的每条数据,满足条件的记录就返回,不满足条 件的记录不返回

    between...and... 区间查询
    where price between 1000 and 3000 相当于 1000<=price<=3000
    in( 值,值 ..)
    1. -- 查询id为1,3,5,7
    2. select * from t_product where id = 1
    3. select * from t_product where id = 3
    4. select * from t_product where id = 5
    5. select * from t_product where id = 7
    6. select * from t_product where id in(1,3,5,7)
    like 模糊查询 。一般和 _ 或者 % 一起使用
    _ 占一位
    % 0 或者 n
    name like '张%' --查询姓张的用户, 名字的字数没有 限制name like '张_' --查询姓张的用户 并且名字是两个 字的
    and 多条件同时满足
    where 条件1 and 条件2 and 条件3
    or 任意条件满足
    where 条件1 or 条件2 or 条件3
    需求:
    查询商品价格 >3000 的商品
    查询 id=1 的商品
    查询 id<>1 的商品
    查询价格在 3000 6000 之间的商品
    查询 id 1 5 7 15 范围内的商品
    查询商品名以 iPho 开头的商品 (iPhone 系列 ) 查询商品价格大于 3000 并且数量大于 20 的商品 ( 条件
    and 条件 and...)
    查询 id=1 或者价格小于 3000 的商品
    1. -- 查询商品价格>3000的商品
    2. select * from product where price > 3000;
    3. -- 查询id=1的商品
    4. select * from product where pid = 1;
    5. -- 查询id<>1的商品
    6. select * from product where pid <> 1;
    7. select * from product where pid != 1;
    8. -- 查询价格在30006000之间的商品
    9. select * from product where price between 3000 and 6000;
    10. select * from product where price >= 3000 and price <= 6000;
    11. -- 查询id在15715范围内的商品
    12. select * from product where pid in(1,5,7,15);
    13. -- 查询商品名以iPho开头的商品(iPhone系列)
    14. select * from product where pname like 'iPho%';
    15. -- 查询商品价格大于3000并且数量大于20的商品 (条 件 and 条件 and...)
    16. select * from product where price > 3000 and num > 20;
    17. -- 查询id=1或者价格小于3000的商品
    18. select * from product where pid = 1 or price < 3000;

    八.排序查询

    有时候我们需要对查询出来的结果排序显示,那么就可
    以通过 ORDER BY 子句将查询出的结果进行排序。排序可
    以根据一个字段排,也可以根据多个字段排序,排序只
    是对查询的结果集排序,并不会影响表中数据的顺序。
    环境的准备
    1. -- 创建学生表(有sid,学生姓名,学生性别,学生年龄,分 数列,其中sid为主键自动增长)
    2. CREATE TABLE student(
    3. sid INT PRIMARY KEY auto_increment,
    4. sname VARCHAR(40), sex VARCHAR(10),
    5. age INT, score DOUBLE
    6. );
    7. INSERT INTO student VALUES(null,'zs','男',18,98.5);
    8. INSERT INTO student VALUES(null,'ls','女',18,96.5);
    9. INSERT INTO student VALUES(null,'ww','男',15,50.5);
    10. INSERT INTO student VALUES(null,'zl','女',20,98.5);
    11. INSERT INTO student VALUES(null,'tq','男',18,60.5);
    12. INSERT INTO student VALUES(null,'wb','男',38,98.5);
    13. INSERT INTO student VALUES(null,'小 丽','男',18,100);
    14. INSERT INTO student VALUES(null,'小 红','女',28,28);
    15. INSERT INTO student VALUES(null,'小 强','男',21,95);
    单列排序: 只按某一个字段进行排序,单列排序
    SELECT 字段名 FROM 表名 [WHERE 条件] ORDER BY 字段名 [ASC|DESC]; //ASC: 升序,默认值; DESC: 降序
    需求 : 以分数降序查询所有的学生
    select * from student order by score desc;
    组合排序: 同时对多个字段进行排序,如果第 1 个字段
    相等,则按第 2 个字段排序,依次类推
    SELECT 字段名 FROM 表名 WHERE 字段=ORDER BY 字段名1 [ASC|DESC], 字段名2 [ASC|DESC];
    需求:以分数降序查询所有的学生 , 如果分数一致 ,
    age 降序
    select * from student order by score desc ,age desc;

    九,聚合函数

    之前我们做的查询都是横向查询,它们都是根据条件一
    行一行的进行判断,而使用聚合函数查询是 纵向查询
    它是对一列的值进行计算,然后返回 一个结果值 。聚合
    函数会忽略空值 NULL

    需求:
    求出学生表里面的最高分数
    求出学生表里面的最低分数
    求出学生表里面的分数的总和 ( 忽略 null )
    求出学生表里面的平均分
    统计学生的总人数 ( 忽略 null)
    1. -- 求出学生表里面的最高分数
    2. SELECT MAX(score) FROM student;
    3. -- 求出学生表里面的最低分数
    4. SELECT MIN(score) FROM student;
    5. -- 求出学生表里面的分数的总和(忽略null值)
    6. SELECT SUM(score) FROM student;
    7. -- 求出学生表里面的平均分
    8. SELECT AVG(score) FROM student;
    9. -- 统计学生的总人数 (忽略null)
    10. SELECT COUNT(sid) FROM student;
    11. SELECT COUNT(*) FROM student;
    我们发现对于 NULL 的记录不会统计,建议如果统计个数
    则不要使用有可能为 null 的列,但如果需要把 NULL 也统
    计进呢?我们可以通过 IFNULL( 列名,默认值 ) 函数来解
    决这个问题 . 如果列不为空,返回这列的值。如果为
    NULL ,则返回默认值。
    -- 注意: 聚合函数会忽略null -- 准备添加2条数据
    1. INSERT INTO student VALUES(null,'小 明','男',21,null);
    2. INSERT INTO student VALUES(null,'小 黑','男',22,98);
    3. -- 需求: 统计所有学生的总分数
    4. select sum(score) from student; -- 结果: 824 忽略null
    5. -- 需求:统计学生的总人数 (忽略null)
    6. select count(score) from student; -- 结果: 10个 忽略null
    7. -- 求出学生表里面的平均分
    8. select avg(score) from student; -- 结果: 82.4
    9. 忽略null 问题:实际开发不能忽略null
    10. select avg(ifnull(score,0)) from student; - - 结果: 74.9090909090909
    11. -- 扩展:
    12. -- 假设: 统计所有同学的age+score
    13. select sum(age+score) from student; - - 结果:
    14. 1040 select sum(age) + sum(score) from student; - - 结果: 1061

    十.分组查询

    分组查询是指使用 GROUP BY 语句对查询信息进行分
    组。
    GROUP BY 怎么分组的? 将分组字段结果中相同内容作
    为一组,如按性别将学生分成两组。
    GROUP BY 将分组字段结果中相同内容作为一组,并且
    返回每组的第一条数据,所以单独分组没什么用处。分
    组的目的就是为了统计,一般分组会跟聚合函数一起使
    用。
    分组:语法
    SELECT 字段1,字段2... FROM 表名 [where 条件] GROUP BY 列 [HAVING 条件];
    需求:根据性别分组 , 统计每一组学生的总人数
    1. -- 根据性别分组, 统计每一组学生的总人数
    2. SELECT sex, count(*) FROM student GROUP BY sex;
    分组后筛选 having
    1. -- 练习根据性别分组, 统计每一组学生的总人数> 5的(分 组后筛选)
    2. SELECT sex, count(*) FROM student GROUP BY sex HAVING count(*) > 5
    3. -- 练习复杂: 统计sid为8之前的的, 根据性别分组, 每 一组学生的总人数 > 2的(分组后筛选)
    4. select sex,count(*) from student where sid < 8 group by sex having count(*) > 2
    注意事项
    根据某一列进行分组 , 将分组字段结果中相同内容
    作为一组 ; 有几组 返回的记录就有几条
    单独分组 没有意义 , 返回每一组的第一条记录
    分组的目的一般为了做统计使用 , 所以经常和聚合
    函数一起使用
    在分组里面 , 如果 select 后面的列没有出现在 group
    by 后面 展示这个组的这个列的第一个数据
    where having 的区别【面试】

    十一.分页查询

    LIMIT 是限制的意思,所以 LIMIT 的作用就是限制查询记
    录的条数 . 经常用来做分页查询
    语法
    1. select * from 表名 limit m,n;
    2. m是指从哪开始查;记录开始的index,从0开始,表示第一 条记录 n是指查多少条。
    需求:分页查询学生 , 每一页查询 4
    1. -- 需求: 分页查询学生, 每一页查询4
    2. select * from student limit 0,4; -- 第1
    3. select * from student limit 4,4; -- 第2
    4. select * from student limit 8,4; -- 第3
    5. m=(当前页码-1)*n,n

  • 相关阅读:
    git submodule使用
    《剑指 Offer 》—50. 第一个只出现一次的字符
    数据分片的艺术:Sharding Key为多节点数据库带来的巨大优势
    web前端期末大作业:基于html化妆品购物商城项目的设计与实现——化妆品官方网站设计与实现(HTML+CSS+JS)
    如何在保证身份安全的同时提升员工体验
    【JavaScript】完善注册表单校验&案例2:表格隔行换色
    Android Studio代码无法自动补全
    [HDLBits] Count clock
    Windows11下清理Docker Desktop与wsl的C盘空间占用
    参加了生活中的每天都买菜 做饭
  • 原文地址:https://blog.csdn.net/2201_75555400/article/details/140355113