Mysql Mysql语句入门 燕十八老师练习笔记

Mysql 笔记

数据库的入门语句

  1. 登录mysql

    mysql -uroot -p;
    
  2. 查看数据库

     show databases;
    
  3. 选数据库

    show tables;
    
  4. 显示数据表

    show tables;
    
  5. 创建数据库

    crete database test charset utf8;
    
  6. 删除数据库

    drop database test;
    
  7. 创建表

     create table student(
         id int,
         name varchar(10)
        );
    
  8. 查看数据表

     show tables;
    
  9. 查看表结构

    desc tablesName;
    
  10. 删除表

    drop tables  student;
    
  11. 修改数据表名

    rename table student to students;
    
  12. 插入数据

    insert into students values
       (1,'xiaoYi');
    
  13. 清空表数据 相当于把旧表删除,在创建相同结构的表

    truncata  students;  
    
  14. 清空表数据 从行的结构删除数据

    delete   students;
    
  15. drop 和delete 的区别

    //方式的不同
    
  16. 选择编码

    set names gbk;
    
  17. 建表:

    create table class(
    	id int primary key auto_increment,
     	sname varchar(10) not null default'',
    	 gender char(5) not null default'',
    	 company varchar(20) not null default'',
    	 salary smallint not null default 0
     );
    
  18. 向表里添加整行数据

    insert into class
        (id,sname,gender,company,salary)
        values
        (1,'曹操','男','字节跳动',888.45);
    
  19. 向表里添加部分列数据

    insert into class
        (sname,gender,salary)
        values
        ('关羽','男','888.23');
    
  20. 插入所有列

    insert into class
       values
       (3, '刘备','男','百度','2547.12');
    
  21. 整加多行

    insert into class
        (sname,company,salary)
        values
        ('诸葛亮','麦当劳','2456.12'),
        ('李逵','黑水保安','998.35');
    
  22. 增加列

    alter table class add age tinyint not null default 0;
    alter table class add  fanbu int unsigned null default 0;  #unsigned 表示无符号
    
  23. 修改数据 如果不加条件 where 的话,所有行和列都修改

    update class
       set gender = '男'
       where id =  4;
        
     update class
        set salary = 9922
        where gender = '男' and salary =999;
        
    
  24. 删除数据

    delete from class
        where id = 2;
    
  25. 查找数据

    select sname,company
        from class
        where gender = '男';
        
    select sname,company
        from class
    

mysql 的基础知识

mysql 的基础类型

  1. 数值型 1字节 = 8位

    • unsigned 表示无符号位
    • 整型型

      • Tinyint

        占据空间:1 字节 储存范围[-127 ,+127] unsigned [0,255]

      • SmallInt

        占据空间:2 字节 储存范围[-32768 ,+32767]

      • MediumInt

        占据空间:3 字节 储存范围[-8388608 ,+8388607]

      • Int :

      ​ 占据空间:4 字节 储存范围[-2147483648 ,+2147483647]

      • BigInt:

      ​ 占据空间:8 字节 储存范围[]

    • 小数型

      • Float(M,D)

        eg: float(6,2) 4444.44 3333.33

      • decimal(M,D) 定点型 整数部分和小数部分,分开存储

    • 字符型

      • char (M = 0-255) 定长字符串 存储空间一定,若不够位,则用空格补位 ,但是如果数据尾部本身有空格,是输出不了的,速度与varchar 相比更快。M

        M 表示字符,不是字节。

        不管是UTF8 还是其他字符

      • varchar(M = 0-65535) 变长字符串 不用空格补齐,在字符前有1-2个字节标志该列内容的长度

        M 表示字符,不是字节。

        不管是UTF8 还是其他字符

      • Text 文本类型

        可以存比较大单位文本段

        搜索速度较慢

        声明text 列时,不必给默认值

      • blonb类型

        是二进制类型,用来存储图像等信息

        Blob 在于防止字符集的问题,导致信息丢失

    • 日期时间类型

      • Date 日期

        YYYY -MM-DD

      • Time 时间

        HH:MM:SS

      • Datetime

        YYYY-MM-DD HH:MM:SS

      • Year 年类型

        YYYY

修改alter

  1. 新建一个 member 表,用来练习

    列名称列类型默认值是否主键
    idInt unsignedPRI
    UsernameVarchar(20)
    gendercahar(1)
    weightfloat(5)
    BirthData
    SalaryDecimal(8,2)
    lastLogind
    intro #简介Varchar()
    create table menber(
    	id int unsigned auto_increment primary key,
        username char(20) not null default '',
        gender char(1) not null default '',
        weight tinyint unsigned not null default 0,
        birth date not null default '0000-00-00',
        salary decimal(8,2) not null default 0.00,
        lastLogin int unsigned not null default 0
    )
    
  2. 修改 menber 表 alter

  • 增加列 intro 列
  • 在gender 后增加 height 列
  • 在最前面 增加一列 work
  • 删除 worK 列
  • 修改列 gender, 把类型 char(1) 改为 char (5)
  • 修改列名和列类型 id ==> uid int(10) unsigned ==> int
   #增加列 intro 列
   alter table menber add intro char(150) not null default '';
   #在gender 后增加 height 列
   alter table menber add height decimal(3,2) not null default 0 after gender;
   #在最前面 增加一列  work
   alter table menber add work char(25) not null default '' first;
   #删除 worK 列
   alter table menber drop pid;
   #修改列 gender, 把类型 char(1)  改为 char (5)
   alter table menber modify gender char(5) not null default '';
   #修改列名和列型    id ==> uid   int(10) unsigned ==> int 
   alter table menber change id uid int;
   

查询

  1. 查询

    • where 添加查询

    • group by 分组

    • having 筛选

    • order by 排序

    • limit 限制结果条数

  2. 比较运算符

    运算符说明运算符说明
    <小于!=不等于
    <=小于或等于>=大于或等于
    =等于>大于
    in在集合内between…and …在某范围内
  3. 逻辑运算符

    运算符说明运算符说明
    NOT 或 !逻辑非OR 或 ||逻辑或
    AND 或 &&逻辑与like模糊查询
  4. students表结构

    idnameagegradeenglish
    intvarchar(10)int(2)int(3)int(3)
    #创建表
    create table students(
    id int unsigned auto_increment primary key,
    name varchar(10) not null default "",
    age int(2) default 0,
    grade int(3) default 0,
    english int(3) default 0
    );
    #插入数据
    insert into students
    values
    (1,"xiaoYi",19,100,90),
    (2,"xiaoLin",23,90,95),
    (3,"小红",10,60,90),
    (4,"小桃子",25,99,98);
    
  5. 实例

    # 查找id=1的数据
    select * from students where id=1;
    
    #查找id不等1的数据
    select * from students where id!=1;
    
    #查找 age大于10的数据
    select * from students where age>10;
    
    #查找 age 小于age 小于或等于19
    select * from students where age <=19;
    
    #取出 age 为23或age 为19 的数据
    select * from students where age in(19,23);
    
    #取出 10 <= age <= 23 的数据
    select * from students where 10 <= age <= 23;
    select * from students where age between 10 and 23;
    select * from students where age>=10 and age<=23;
    
    #取出 age 不等10 且age不等19 的数据
    select * from students where age!=10 and age !=19;
    select * from students where age not in (10,19);
    
    #取出 age 大于10且小于18 或者大于18且小于30 的数据
    select * from students where age>10 and age <18 or age >18 and age<30;
    
    #取出name 以小开头的数据
    select * from students where name like "小%";  
    

广义投影

  1. 表里本来没有"grade-60" 的,列L

  2. 这一列其实是一个运算结果,术语叫“广义投影”

  3. 列的运算结果,可以当成一个列看,也可以给这个列起一个别名

  4. #不及格的小朋友
    select name,grade,(grade-60) as fail from students;
    
    #超过及格线 30分的小朋友友
    select  name,grade,(grade-60) as fail
    from students
    where (grade-60)>30;
    

like

  1. 模糊查询

    #Like用来匹配一部分的,% 任何字符出现任何位置区分大小写。
    
    SELECT * FROM TABLE WHERE col Like '%a';//检索以a结尾的内容
    
    SELECT * FROM TABLE WHERE col Like '%a%';//检索包含a的内容
    
    SELECT * FROM TABLE WHERE col Like 'a%';//检索以a开头的内容
    
    SELECT * FROM TABLE WHERE col Like 'a%b';//检索以a开头以b结尾的内容
    
    SELECT * FROM TABLE WHERE col Like 'ab_';//检索以ab开头,后接一个字符的内容
    

group

  1. 常用函数

    • max 最大
    • min 最小
    • sum 总和
    • avg 平均
    • count 总行数
  2. count函数

    • select count(*) from 表名

      查询的就是绝对的行,哪怕某一行所有字段全为null ,也计算在内

    • select count(列名) from 表名

      查询的是该列不为null 的所有的行数

  3. 函数实例

    #求grade 最大的值
    select max(grade) from students;
    
    #求grade 最小的值
    select min(grade) from students;
    
    #求全班的grede的(总分)
    select sum(grade) from students;
    
    #求全班的平均分
    select avg(grade) from students;
    
    #求全班有多少人
    select count(*) from students;  // * 包含null 
    select count(id) from students;  // 不包含 id=null的行
    
    #全班及格的人数
    select count(*) from students
    where grade >-60;
    
  4. 分组查询

    • group by
  5. 问题

    • 计算每一位同学的平均分 select id,name,avg(grade) from students group by id;
  6. group by

    # 计算每一位同学的总分 
    select id,name,sum(grade+english) from students group by id;
    
    #?? 计算每一位同学的平均分
    select id,name,avg(grade,english) from students group by id;
    ??????/
    
    

having

  1. 查询的发生过程

  2. having 是针对结果的操作

    #查询总成绩大于150的同学
    #使用 having 方法
    select id,name,sum(grade+english) as zong from students
    group by id
    having zong>150;
    where (grade+english) >150
     
    #使用 普通方法
    select id,name,sum(grade+english) as zong from students
    group by id
    where (grade+english) >150;
     
    #查询平均分小于95同学
    
    
  3. having 练习

  4. 表结构

    namesubjectscore
    varchar(20)varchar(20)tinyint
  5. 表数据

    namesubjectscore
    张三数学90
    张三语文50
    张三地理40
    李四语文55
    李四政治45
    王五政治30
  6. 创建表

    create table result(
    	name varchar(20),
        subject varchar(20),
        score tinyint
    )engine myisam charset utf8;
    
  7. 插入数据

    insert into result
    values
    ("张三","数学",90),
    ("张三","语文",50),
    ("张三","地理",40),
    ("李四","语文",55),
    ("李四","政治",45),
    ("王五","政治",30);
    
    insert into result 
    values
    ("赵六","数学",100),
    ("赵六","地理",98),
    ("赵六","政治",95);
    
  8. 查出挂科2门及2门以上的学员的平均分

    思路一:先求平均分,在就挂科数大于等于2的

    # 1、查询所以的平均分
    select name,avg(score) from result group by name;
    #2、计算出每一个人挂科的情况
    select name,subjuect,score,score<60 as g from result;
    #3、综合以上,得到所有的平均分,和挂科数 
    select name,avg(score),sum(score<60) as gks
    from result
    group by name;
    #4、在上的基础上,筛选出挂科数大于等于2 的
    select name,avg(score),sum(score<60) as gks
    from result
    group by name
    having gks>=2;
    

    思路二:先求挂科数大于等于2的学员,再求这些学院的平均分

    #1、挂科数大于等于2 的学员
    select name,count(1) as gks from result
    where score<60
    group by name
    having gks>=2;
    #2、求挂科数大于等于2的学员 子查询和嵌套
    	
    select name,avg(score)
    from result
    where name in
        (select name from
            (select name,count(1) as gks from result
                where score<60
                group by name
                having gks>=2)
            as tem)
    group by name;
    

order by 与 limit

  1. order by 可以对最终结果集进行排序

  2. order by 要放在where /group by /having 后面

  3. order by 升序 降序

     升序 order by id asc 
     降序 order by id  desc
    
  4. 多字段排序

    #有优先级,第一次排序后,有相同的,然后再用第二种排序
    order by id asc ,
    order by name  desc
    
  5. limit

    #前三条数据
    limit 3
    #第3 到 第5 条数据
    limit 2,3
    

where子查询

  1. where 型 子查询

    把内层查询结果作为外层查询的比较条件
    
  2. 内层的返回结果只能是单列,可以是多行

  3. 查询结果集在结构上可以当作表看

  4. 查出 grade 成绩最高的学生

    select * from students where
         grade = (select max(grade) from students);
    

exists 子查询

  1. exists 型自查询

奇怪的null

  1. 为什么建表是时,加not null default’’/ default 0(不填默认也是不为 null)

    不想让表中出现null值
        
    
  2. 为什么不想要null

    null 是一种类型,比较时,只能用专门的 is null 和 is not null 来比较
    碰到运算符,一律放回null
    效率不高影响提高索引效果
    因此在建表时加not null default''/ default 0
    

两表全连接

  1. 集合的性质

    1、无序性
    2、唯一性(集合的元素都是唯一的)
    3、集合的运算:
    	求并集
        求交集
        笛卡尔积
    
  2. 笛卡尔集运算

    集合A:2,3,5
    集合B:6,8
    A * B:{  // * 不是相相乘,是笛卡尔积
        (2,6),(2,8),
        (3,6),(3,8),
        (5,6),(8,8)
    }
    
  3. 集合A有 M 个元素 集合B有 N 个元素 若:C = A*B 则 C 有 M * N 个元素

  4. 表和集合的关系

    一张表就是一个集合
    每一行就是一个元素
    
    集合的元素不能重复
    在Mysql 中,就算有两行相同的数据,
    他们也不相同,因为他们内部还有一个rowid 
    
  5. 建立两张表

    create table test1(
    	id int,
        sname varchar(20)
    )engine myisam charset utf8;
    
    
    create table test2(
    	cat_id int,
        cname varchar(20)
    )engine myisam charset utf8;
    
  6. 分别给两个表插入数据

    
    
  7. 实现两个表全相乘

    
    
  8. select 4*4

  求交集
   笛卡尔积

1. 笛卡尔集运算

```javascript
集合A:2,3,5
集合B:6,8
A * B:{  // * 不是相相乘,是笛卡尔积
    (2,6),(2,8),
    (3,6),(3,8),
    (5,6),(8,8)
}
  1. 集合A有 M 个元素 集合B有 N 个元素 若:C = A*B 则 C 有 M * N 个元素

  2. 表和集合的关系

    一张表就是一个集合
    每一行就是一个元素
    
    集合的元素不能重复
    在Mysql 中,就算有两行相同的数据,
    他们也不相同,因为他们内部还有一个rowid 
    
  3. 建立两张表

    create table test1(
    	id int,
        sname varchar(20)
    )engine myisam charset utf8;
    
    
    create table test2(
    	cat_id int,
        cname varchar(20)
    )engine myisam charset utf8;
    
  4. 分别给两个表插入数据

    
    
  5. 实现两个表全相乘

    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值