• 08、JavaEEMysql基础


    Mysql

    MySQL基础

    目前常用的数据库如下:

    SQL Server
    Oracle
    Sum
    Mysql
    HSQL
    PostgreSQL
    SQLite
    IBM db2

    安装完成Mysql后在dos窗口下使用 mysql -u 账号 -p 密码 来连接数据库。MySQL的资料和手册:

    http://www.mysql.cn/

    基础语法

    关系型数据库需要操作它,需要发送特定格式的命令,那么sql语言几乎是所有关系型数据库通用的。

    名称 说明
    SQL(结构化查询语言) SQL是用来存取关系型数据库的语言,具有查询、操纵、定义和控制关系型数据库的四方面功能。
    DDL(数据定义问题) 数据定义语音 - Data Definition Language,用来定义数据库对象,如数据包、视图、索引等。
    DML(数据操纵问题) 数据处理语言 - Data Manipulation Language,在数据库表中更新、增加和删除记录,如:update、insert、delete等。
    DCL(数据控制问题) 数据控制语言 - Data Control Language,指用于设置用户权限和控制事务语句,如:grant、revoke、if...else、while、begin transation
    DQL(数据查询问题) 数据查询语言 - Data Query Language,如:slect 可以去查询相关的文件Mysql5.1_zh.chm,SQL语句不区分大小写的。

    对库操作

    默认存在数据库有四个,不要随意更改,否则导致数据库出错。

    其中对库的操作语法如下:

    语句 描述
    create database db_name 创建数据库
    show databases 显示数据库语句
    show create database db_name 显示数据库创建语句。
    select database() 查看当前数据库。
    use db_name 切换数据库:。
    drop database db_name 删除数据库。
    alter database db_name character set 字符集 collate 校对规则 修改数据库。

    创建一个使用utf8字符集,并带校对规则的mydb3数据库:

    create database mydb character set utf8 collate utf8_unicode_ci;
    

    对xx表操作

    表是二维表,分为行和列,每行对应着一个实体类的实例对象,没列对应每个实体类的具体的字段名和类型。

    创建表

    创建表的语法如下所示:

    create table table_name(
        field1  datatype,
        field2  datatype,
        field3  datatype
    )
    

    其中datatype表示数据类型:

    类型 描述
    String、varchar、char 字符串类型。
    blob、text、mediumblob、mediumtext、longblob、longtext 大数据类型。
    tinyint、smallint、int、bigint、float、double 数值型。
    bit、0、1 逻辑型。
    date(日期)、time(时间)datatime(日期时间)、timestamp(时间戳) 日期型

    注意:mysql语句中的注释是 --

    创建一张表用于测试用:

    create table student(
      id int(32) primary key auto_increment,
      name varchar(32),
      age int(32),
      gender varchar(16)
    );
    

    如下图所示:

    查看表

    语句 描述
    show tables 查看所有表。
    show create table 表名 查看表的创建语句。
    desc 表名 查看表的详细结构。

    注:创建表的时候通常会添加额外的约束,这些约束都是为了保证表中的数据的有效性和完整性。

    特性 描述
    primarey key 主键约束:声明为主键的字段必须非空,并且不能重复。
    auto_increment 主键必须是数值类型,表示主键自动增长。
    unique 唯一约束,字段必须唯一,但是可以是空。
    not null 非空约束:不能为空。

    修改表

    语句 描述
    rename table db_name to new_name 修改表的名称。
    change [column] old_col_name column_definition 修改列的名称。
    alter table db_name character set utf8 修改表的字符编码。

    删除表

    语句 描述
    drop table db_name 删除表

    添加一列

    alter table 表名 add 字段名 类型(长度) [约束]
    

    给student表中的学生添加地址列:

    alter table student add address varchar(32);
    

    如下图所示:

    修改列类型

    alter table 表名 modify 要修改的字段名 类型(长度) [约束]
    

    修改student表中的name字段长度为16,且不能为空:

    alter table student modify name varchar(16) not null;
    

    如下图所示:

    修改列的名称

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

    修改student表中的address字段为addr字段:

    alter table student change address addr varchar(32);
    

    如下图所示:

    删除表的列

    alter table 表名 drop 列名
    

    删除student表中的gender字段:

     alter table student drop gender;
    

    如下图所示:

    修改表名

    rename table 表名 to 新表名
    

    修改表的编码

    alter table 表名 character set 编码
    

    除了可以修改表的字符集之外,还可以查看当前表的编码:

    操作表记录

    插入记录

    insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)
    insert into 表名 values(值1,值2,值3……)
    

    向表中插入多条数据:

     insert into student values(1, 'legend', 22, 'shenzhen');
     insert into student values(2, 'vinvent', 25, 'hunan');
     insert into student values(3, 'uding', 20, 'yunnan');
    

    如下图所示:

    修改记录

    修改记录有带条件和不带条件等两种方式:

    update 表名 set 字段名=值, 字段名=值, 字段名=值……
    update 表名 set字段名=值, 字段名=值, 字段名=值…… where 条件
    

    其中不带条件的会将表中列下所有记录都更改。

    update student set age=28 where name='uding';
    

    如下图所示:

    删除记录

    delete from 表名;
    

    delete删除的时候是一条一条的删除记录,它配合事务,可以将删除的数据找回。id不会重置。

    truncate删除,它是将整个表摧毁,然后再创建一张一模一样的表。它删除的数据无法找回。id会重置。

    查询记录

    select [distinct] *| 列名,列名 from 表名 [where条件]
    

    1>查看年龄为25岁的学生:

    2>单独查询某些列:

    3> 使用表别名查询所有记录:

    注意:其中as可以被省略。

    4>查询所有的学生,按年龄进行排序(升序、降序)

    其中升序是asc,降序是desc。

    多条件查询

    1> 查询学生表中年龄大于20 并且地址在深圳的记录

    2> 查询学生表中地址在深圳或者湖南的记录

    聚合函数

    1> 获得所有学生的年龄总和

    2> 获得学生的平均年龄

    3> 获得学生的总数

    分组操作

    1> 首先为学生表添加分类

    alter table student add cid varchar(32);
    

    2> 初始化数据,配置不同的cid

    3> 根据cid分组,分组统计每组学生的数量

    4> 根据cid分组,分组统计每组学生的平均年龄,且年龄大于20岁以上

    注意:查询条件如果是聚合函数,则使用having。

    多表设计

    外键约束

    表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明

    表和表之前的依赖关系,命令数据库来帮我们维护这种关系,向这种约束就叫做外键约束。

    一对一关系

    一对一的关系在实际开发中应用并不多,因为一对一的关系完全可以创建成一张表。

    两种建表原则如下:

    1)外键唯一:主表的主键和从表的外键唯一,形成主外键关系。
    2) 外键是主键:主表的主键和从表的主键,形成主外键关系。

    一对多关系

    一对多的建表原则是:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。

    我们创建两张表,分别是分类表和商品表,其中一个分类对应多个商品。

    --分类表:
    create table category(
        cid varchar(32) primary key,
        cname varchar(100)
    );
    --商品表:
    create table product(
        pid varchar(32) primary key,
        pname varchar(40),
        price double,
        category_id varchar(32)
    );
    

    然后分别向分类表和商品表中添加数据:

    --分类表
    insert into category(cid,cname) values('c001','家电');
    insert into category(cid,cname) values('c002','服饰');
    insert into category(cid,cname) values('c003','化妆品');
    --商品表
    insert into product(pid,pname,price,category_id) values('p001','联想','5000','c001');
    insert into product(pid,pname,price,category_id) values('p002','海尔','5000','c001');
    insert into product(pid,pname,price,category_id) values('p003','雷神','5000','c001');
    insert into product(pid,pname,price,category_id) values('p004','JACK JONES','800','c002');
    insert into product(pid,pname,price,category_id) values('p005','真维斯','200','c002');
    insert into product(pid,pname,price,category_id) values('p006','花花公子','440','c002');
    insert into product(pid,pname,price,category_id) values('p007','劲霸','2000','c002');
    insert into product(pid,pname,price,category_id) values('p008','香奈儿','800','c003');
    insert into product(pid,pname,price,category_id) values('p009','相宜本草','200','c003');
    

    注意:插入数据如果出现编码问题,只需要通过set names gbk即可设置编码。

    此时,product和category表是没有任何关系的,需要设置外键来确定两张表的关系,将从表categoryid作为外键字段来映射主表product的cid字段。

    alter table product add foreign key(category_id) references category(cid);
    

    添加外键来确定表之间关系的语法如下:

    语法:alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的外键);
    [外键名称]:用于删除外键约束的,一般建议_fk结尾。 
    

    我们在删除的时候就可以通过如下语句来删除外键约束:

    alter table 从表 drop foreign key 外键名称;
    

    多表操作需要注意如下地方:

    从表不能够添加(更新)主表中不存在的数据。
    主表不能够删除(更新)从表中已经使用的数据。
    

    多对多关系

    多对多关系需要创建第三张表作为中间表,中间表中至少有两个字段分别作为外键指向各一方的主键。其中两张表都是主表,中间表为从表。

    我们创建三张表,分别是订单表、商品表、订单项表,其中订单和商品为多对多关系,订单项则是中间表指向各方的主键。

    --商品表
    create table product(
        pid varchar(32) primary key,
        pname varchar(40),
        price double,
        category_id varchar(32)
    );
    --订单表
    create table orders(
        oid varchar(32) primary key,
        totalprice double
    );
    --订单项表
    create table orderitem(
        oid varchar(50),
        pid varchar(50)
    );
    

    然后我们建立订单表和商品表的关系,设定联合主键(可省略)

    alter table orderitem add primary key(oid,pid);
    
    1. 订单表和订单项表的主外键关系:
    alter table orderitem add constraint orderitem_orders_fk foreign key(oid) references orders(oid);
    
    1. 商品表和订单项表的主外键关系
    alter table orderitem add constraint orderitem_product_fk foreign key(pid) references product(pid);
    

    多表查询

    交叉连接查询

    交叉连接查询得到的是两个表的乘积,通常称之为笛卡尔积。

    语法:select * from 表一, 表二;
    

    如下图所示:

    内连接查询

    内连接查询分为隐式内连接和显示内连接,是取得两个表中存在连接匹配关系的记录(交集)。

    1> 隐式内连接

    语法:select * from A, B where 条件;
    

    2> 显式内连接

    语法:select * from A inner join B on 条件 
    

    注意:隐式内连接和显示内连接查询到的结果是一样的,其中显示内连接中inner关键字可以省略。

    外连接查询

    外连接查询分为左外连接和右外连接。其中outer关键字可以省略。

    1. 左外连接

    左外连接查询到的是左表的全部数据和两张表之间的交集。

    语法:select * from A left outer join B on 条件;
    

    1. 右外连接

    右外连接查询到的是右表的全部数据和两张表之间的交集。

    语法:select * from A right outer join B on 条件;
    

    子查询

    一条select语句结果作为另一条select语法的一部分。

    1> 通过查询语句查询到化妆品分类的cid。

    2> 将上方查询语句作为另外一条查询语句语法的一部分:

  • 相关阅读:
    docker
    协程 gevent
    vue
    数据
    elk 配置
    iOS下架
    综合练习:词频统计
    组合数据类型综合练习
    Python基础综合练习
    熟悉常用的Linux操作
  • 原文地址:https://www.cnblogs.com/pengjingya/p/14904600.html
Copyright © 2020-2023  润新知