01、Mysql单表查询

122 阅读11分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

01、Mysql单表查询

一.什么是数据库:(数据库软件)

1).什么是数据库:数据库(DataBase)是一个软件,专门用于存储大量数据的。对于大量数据可以进行非常安全、快捷的管理。

2).什么是数据库管理系统:数据库管理系统(DataBase Management System,DBMS): 指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。

二.常见的数据库软件:

  • 1).MySQL : 中型数据库软件。早期都是免费的。后期被Oracle收购,从6.x版本开始收费。

  • 2).Oracle : Oracle公司出品,全球最大的、最出名的数据库软件。收费的。

  • 3).SQLServer : 微软公司的。中型数据库软件。收费的。

  • 4).DB2:IBM公司的数据库产品,收费的。常应用在银行系统中.

  • 5).SQLite: 嵌入式的小型数据库,应用在手机端

    跟Java相关的数据库:MySQL,Oracle

三.数据库软件的内部结构:


​    数据库软件:
​        |--逻辑数据库(对应一个项目)
​            |--表
​                |--列(字段)
​                |--行(数据)
​            |--表
​            ...
​        |--逻辑数据库(对应一个项目)
​        .....

四.数据库软件和Java的对应关系:

java            数据库
项目            逻辑数据库
类(JavaBean)        表
类中的属性        表中的字段
类中属性的数据类型    表中字段的数据类型
对象            表中一行记录

五.SQL语言的分类:

1).什么是SQL :

结构化查询语言(Structured Query Language)简称SQL,是关系型数据库管理系统都需要遵循的规范。不同的数据库生产厂商都支持SQL语句,但都有特有内容。

  • 普通话:各数据库厂商都遵循的ISO标准。
  • 方言:数据库特有的关键字。

2).SQL语言的分类:

  • 1).DDL:数据定义语言。用来定义数据库对象:逻辑数据库,表,列等。关键字:create(创建),alter(修改),drop(删除)等
  • 2).DCL:数据控制语言。用来定义数据库的访问权限和安全级别,及创建用户。
  • 3).DML【重点掌握】:数据操作语言。用来对数据库中表的记录进行更新。关键字:insert(添加),delete(删除),update(修改)等
  • 4).DQL【重中之重】:数据查询语言。用来查询数据库中表的记录。关键字:select,from,where等

六.数据库操作相关的语句【了解】:DDL

1).创建数据库:
​        A).create database 数据库名;
​            例如:创建数据库:hei70_day19db
​            create database hei70_day19db;
​        B).create database 数据库名 character set 字符集;
​    2).查看数据库MySQL服务器中的所有的数据库:
​        show databases;.
​    3).删除数据库:
​        drop database 数据库名; 
​    4).查看正在使用的数据库:
​        select database();
​    5).切换数据库:
​        use 数据库名;

06_2:SQLYog的使用:

    1).在Query选项卡中编写SQL语句:
        1).注释:
            A).#注释:单行注释
            B).-- 注释:单行注释
            C)./* 注释 */ : 多行注释
        2).在一个Query界面中可以编写多条SQL语句,选中某一条,可以单条运行。
        3).这个一个界面中的数据,可以保存起来。ctrl + s ,会存储为:xxx.sql的纯文本文件,使用记事本就可以打开。

七.表操作相关的SQL语句【了解】:

1).创建表:
​        create table 表名(
​            字段名 数据类型(长度) [约束],
​            字段名 数据类型(长度) [约束],
​            .....
​            字段名 数据类型(长度) [约束]
​        )
​       例如:创建一个学员信息表:
​        create table student(
​            stuNo int ,
​            name    varchar(100),          //  varchar   char  必须指定长度
​            age    int,
​            sex    char(5)
​        )
​       组成:
​       1).字段名:由程序员自行定义,一般跟我们"类"中的属性名相同。
​       2).数据类型:是MySQL中的数据类型,有很多,下面详细说。
​       3).长度:
​        1).对于"字符串类型":表示"字符"数。
​        2).对于"数值"类型:表示"数字的宽度"。
​       4).约束:明天讲。

07_2.关于MySQL中的数据类型:
    Java        MySQL
     -----------------------------------------------------
​    整数:
​    int        int
​    long        int
    浮点:
    float        float
    double        double
            decimal(M,N):M:表示一共有M位。N:小数部分是N位
    
    日期:
    String
    Date        date(日期)        YYYY-MM-DD
            datetime(日期和时间)     YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59
    
    字符:
    char        char(1):长度是1的char


    布尔:
    boolean        int(0/1)
    
    字符串:
    String        char/varchar
            注意:Java中的char表示1个字符。MySQL中的char表示一个"字符串"
    
    注意:char和varchar的区别:
    1).charMySQL中表示:定长的字符串。例如:设定字段类型为char(5)--->存储"abc"时--->硬盘上 --> "abc  "
                                                                       存储"a"时  --->硬盘上 --> "a    "
    2).varcharMySQL中表示:不定长的字符串。例如:设置字段类型为varchar(5) -->存储"abc"-->硬盘上 --"abc"
                                                                               存储"a"  -->硬盘上 -->"a"
    怎么选择:char的查询速度要快于varchar
    1).使用char : 对于字段的所有的值的长度如果全部相同,或者平均长度接近,变化不大时。
            例如:性别、手机号、身份证号、银行卡号、QQ....
    2).使用varchar : 对于字段的值的长度如果变化很大。
            例如:地址、简介、备注......
    
    大文本:
    String        XXXText
    
    文本二进制:
    byte[]        binary


    二进制文件(视频,图片)
    byte[]        XXXBlob

07_3. 关于数据类型长度:
    char/varchar (5) : 字符的数量。表示最多5个字符,多余的会被截断;
    int(11) : 字符的宽度:int在MYSQL中其实占用的是4个字节。所以这里的字符宽度表示在zerofill状态下,可见的总的数据位数,如果
              不足这个位数,前面填充0.
          例如:建表:
            CREATE TABLE test2(
                id INT(4) ZEROFILL
            )
          向字段写入数据:
            1
            12345
          然后保存,然后刷新,会看到如下结果:
            0001
            12345
    decimal(10,2):表示此数字总位数为10位,小数部分2位。

07_4.表操作相关语句_其它:
    1).查看数据库中的所有表:
        show tables;
    2).查看表结构:
        desc 表名;
    3).删除表:
        drop table 表名;
    4).修改表:
        1).alter table 表名 add 列名 类型(长度) [约束];   
        作用:修改表添加列.
        例如:
        #1,为分类表添加一个新的字段为分类描述 varchar(20)
        ALTER TABLE category ADD `desc` VARCHAR(20);

 2).alter table 表名 modify 列名 类型(长度) 约束;
    作用:修改表修改列的类型长度及约束.
    例如:
    2, 为分类表的描述字段进行修改,类型varchar(50) 添加约束 not null
    ALTER TABLE category MODIFY `desc` VARCHAR(50) NOT NULL;
3).alter table 表名 change 旧列名 新列名 类型(长度) 约束;
    作用:修改表修改列名.
    例如:
    #3, 为分类表的分类名称字段进行更换更换为 snamesname varchar(30)
    ALTER TABLE category CHANGE `desc`description VARCHAR(30);
    4).alter table 表名 drop 列名;   
    作用:修改表删除列.
    例如:
    #4, 删除分类表中snamename这列
    ALTER TABLE category DROP description;
    5).rename table 表名 to 新表名;
    作用:修改表名
    例如:
    #5, 为分类表category改名成 category2
    RENAME TABLE category TO category2;
    6).alter table 表名 character set 字符集;
    作用:修改表的字符集
    例如:
    #6, 为分类表 category 的编码表进行修改,修改成 gbk
    ALTER TABLE category CHARACTER SET gbk;

八.记录操作相关的SQL语句【重点掌握】

    1).添加:insert into
​        1).有两个格式:
​            A).insert into 表名 values(值1,值2,....,值n):
​                例如:添加学员信息:
​                    create table student(
​                        stuNo int ,
​                        name    varchar(100),
​                        age    int,
​                        sex    char(5)
​                    )
​                insert into student values(1,'张三',20,'男')
​                     注意:
​                 1).值列表中的顺序,数量必须跟表中字段的顺序和数量相同。
​                    如果年龄和性别不填:
​                    insert into student values(1,'张三',null,null);
​
​            B).insert into 表名(字段1,字段2,....,字段n) values(值1,值2,....,值n)
​                例如:添加学员信息,但年龄和性别不填:
​                 insert into student(stuNo,name) values(3,'章子怡');
​                 注意:
​                 1).字段列表:可以是表中的所有字段,也可以是部分字段;可以不跟定义顺序相同。
​                 2).值列表:数量和顺序必须和前面字段列表的数量和顺序相同。没有出现的字段,本次添加
​                            操作自动添加为NULL.

        2).两种的区别:
            A).第一种适合:向一个表的所有字段,或者大部分字段添加数据时。
            B).第二种适合:向一个表的少部分字段添加数据时。
            总之:要SQL语句要易读,后期要易于维护(更改SQL语句)
    
    2).修改:update 表名 set 字段1 = 值,字段2 = 值, .... , 字段n = 值 where 条件;
        例如:修改"张三"的年龄为25
            update student set age = 25 where name = '张三';
        修改多个列:修改张三的年龄为20岁,性别:女
            update student set age = 20, sex = '女' where name = '张三';
    3).删除:delete from 表名 where 条件;
        例如:删除"张三"
            delete from student where name = '张三';
       关于清空表:
        1).delete from 表名:逐条删除,效率比较低。对于"自动增长"列,不改变基数。
        2).truncate 表名:先摧毁表,然后再根据原结构重新创建表。效率比较高。对于"自动增长"列,会重建基数。
    4).查询:select 字段列表   from 表名  where 条件             
        1).简单查询
            1).查询所有商品:
                select * from product;
            2).查询部分字段:
                select pname,price from product;
            3).使用别名:               //   as  可以省略
                SELECT pname as '商品名称' ,price as '价格'  FROM product;
            4).去掉重复值:                                             //  去除查询结果中  所有显示界面字段 显示字段   所有字段都相同的值
                SELECT DISTINCT price FROM product
            5).对结果字段进行运算:
                select pname,price + 100 from product
        2).条件运算符:
            1)"<":小于 :主要用于:数值类型、日期类型
                例如:查询商品价格小于2000元的商品
                    select * from product where price < 2000;
                      查询生产日期小于2017-02-01
                    select * from product where proDate < '2017-02-01';
            2)">":大于:主要用于:数值类型、日期类型
                例如:查询商品价格大于2000元的商品
                    select * from product where price > 2000;
                      查询生产日期大于2017-02-01
                        select * from product where proDate > '2017-02-01';
            3)">=":大于等于:主要用于:数值类型、日期类型
                例如:查询商品价格大于等于2000元的商品
                    select * from product where price >= 2000;
                      查询生产日期大于等于2017-02-01
                        select * from product where proDate >= '2017-02-01';
            4)"<=":小于等于:主要用于:数值类型、日期类型
                例如:查询商品价格小于等于2000元的商品
                    select * from product where price <= 2000;
                      查询生产日期小于等于2017-02-01
                        select * from product where proDate <= '2017-02-01';
            5)"=":等于:主要用于:数值类型、日期类型、字符串
                例如:查询商品价格等于2000元的商品
                    select * from product where price = 2000;
                      查询生产日期等于2017-02-01的商品
                    select * from product where proDate = '2017-02-01';
                      查询所有的服装类商品
                    select * from product where category_id = '服装';
            6)"!=":    不等于:主要用于:数值类型、日期类型、字符串
                例如:查询商品价格不等于2000元的商品
                    select * from product where price != 2000;
                      查询生产日期不等于2017-02-01的商品
                    select * from product where proDate <> '2017-02-01';
                      查询所有的非服装类商品
                    select * from product where category_id <> '服装';
              或者
              "<>":
        3).逻辑运算符:
            1).and : 与,语义:并且,相当于Java的&&
                例如:查询所有商品价格在2000(包含)到3000(包含)元之内的商品信息
                    select * from product where price >= 2000 and price <= 3000;
                      查询20172月份生产的所有商品:
                    select * from product where proDate >= '2017-02-01' and proDate <= '2017-02-28';
                      查询所有价格高于2000元的服装类商品
                        select * from product where price > 2000 and category_id = '服装';
            2).or  : 或,语义:或者,相当于Java的||
                例如:查询商品价格不在2000元到3000元之间的商品:
                    select * from product where price < 2000 or price > 3000;
    
            3).not : 非,语义:不是..,相当于Java的!
                例如:查询商品价格不等于2000元的商品
                    select * from product where price != 2000;
                    或者
                    select * from product where not price = 2000;
        4).范围查询:between ...(包含) and ....(包含) ---可以用于:数值类型、日期类型
            例如:查询所有20172月份生产的商品
                select * from product where proDate between '2017-02-01' and '2017-02-28';
                   查询所有价格在300010000元的商品
                    select * from product where price between 3000 and 10000;
            注意:必须between是小值
                      and    是大值
    
        5).多个值的or判断:in(值列表):---可以用于:数值类型、日期类型、字符串类型
            例如:查询ID1,23,5,8的商品
                select * from product where pid = 1 or pid = 2 or pid = 3 or pid = 5 or pid = 8;
                或者
                select * from product where pid in(1,2,3,5,8);
        6).模糊查询:like  通配符:1).%:统配任意长度的任何字符;2)._:通配1个长度的任意字符;
            例如:查询商品名称中带有"花"字的商品
                select * from product where pname like '%花%';
                  查询商品名称中以"花"开头的商品:
                select * from product where pname like '花%';
                  查询商品名称是4个字,并且以"花"开头:
                select * from product where pname like '花___';
        7).查询空:
            例如:添加时:
                insert into product values(13,'山东大枣',50,null,null);
                  查询:
                    select * from product where category_id is null;                    非空  is not null ;
            例如:添加:
                insert into product values(13,'山东大枣',50,'','');【以后不建议使用】   这不是null   是空字符串;
                  查询:
                select * from product where category_id = '';