zoukankan      html  css  js  c++  java
  • Mysql

    数据库概述

    数据库:文件系统,通过命令SQL去操作这个文件系统

    数据库的作用:储存数据,数据的仓库,带有访问权限,限制不同的人可以有不同的操作

    mysql:开源免费,适用于中小型企业的免费数据库,SUN收购mysql,oracle收购SUN,java

    mariadb: 由mysql创始人做出的mysql开源版本的分支

    oracle: 甲骨文公司,商业收费软件,适用于大型电商网站。

    db2: IBM公司,thinkpad  解决方案:软件和硬件,服务器架构,银行系统大多采用db2

    sqlserver: windows里面,图形化工具比较好

    sybase: 被淘汰的数据库

    NOSQL非关系型数据库key:value

    mongodb

    redis

    关系型数据库:

    主要用来描述实体与实体之间的关系

    实在的实物:员工与部门

    E-R关系图:实体-联系图

      实体:方框

      属性:椭圆

      关系:菱形

    Mysql:数据库服务器

    服务器:一台电脑,安装相关的服务器软件,这些软件会监听不同的端口,根据用户访问的不同端口,提供不同的服务

    Mysql的安装与卸载:

    卸载:控制面板,删除mysql安装目录下的所有文件,mysql数据存放文件,Program Data(隐藏文件)中的mysql

    安装:服务器配置:Include bin directory to windows path  端口号:3306  密码:root

    SQL:structure Query Language: 结构化查询语言

    Mysql的SQL语句

    DDL:数据定义语言:定义数据库,数据表的结构  create(创建);drop(删除);alter(修改)

    DML:数据操纵语言,主要是用来操作数据  insert(插入);update(更新);delete(删除)

    DCL:数据可控制语言,定义访问权限,定义访问权限,安全设置  grant

    DQL:数据查询语言,select(查询);from(字句);where(字句)

    数据库的CRUD的操作

    登陆数据库服务器:mysql -uroot -proot  -p后面接密码  -u后面接用户名

    创建数据库:

      create database 数据库的名字;

      创建数据库时指定字符集和较对规则:

        create database 数据库名字 character set 字符集(utf8,gbk);

        create database 数据库名字 character set 字符集  collate 校对规则;

      例:create database datatest character set utf8 collate uft8_bin;

    查看数据库

      查看数据库定义的语句:

      show create database 数据库的名字

      查看所有的数据库:show databases;

      information_schema

      mysql

      performance_shcema

    修改数据库的操作

      修改数据的字符集;

      alter database 数据库的名字 character set 字符集;

    删除数据库

      drop database 数据库名字;

    其他数据库操作的命令

      切换数据库

      use 数据库名字;

      查看当前正在使用的数据库

      select database();

    表的CRUD的操作

    创建表

      create database 数据库的名字

      create table 表名(

        列名 列的类型 约束

        列名 列的类型 约束);

      列的类型

      java  

        int      

        char/String            

        double  

        float  

        boolean        

        date                

      sql   

        int  

        char/varchar(char:固定长度,varchar:可变长度,char(3),varchar(3):3个字符)     

        double  

        float  

        boolean    

        date:YYYY-MM-DD time:hh-mm-ss       

        text:存放文本  

        存放二进制                              

        blob:datetime:YYYY-MM-DD hh-mm-ss(默认为空) timestamp:YYYY-MM-DD hh-mm-ss(默认使用当前时间)

                                                

      列的约束

        主键约束:primary key

        唯一约束:unique

        非空约束:not null

    create table student(
        $id int primary key,
        $name varchar(31),
        sex int,
        age int  
    );

    查看表

       查看所有的表格

        show tables;

      查看表的创建过程

        show create table 表名;

      查看表的结构

        desc 表名; 

    修改表

      添加列(add)  alter table 表名 add 列名 列的类型 列的约束  

              例:alter table student add grade int not null

      修改列(modify)  alter table 表名 modify 列名 列的类型

              例:alter table student modify sex varchar(2);

      修改列名(change)  alter table 表名 change 原列名 现列名 列的类型

              例:alter table student change sex gender varchar(2);

      删除列(drop)  alter table 表名 drop 列名

              例:alter table student drop gender;

      修改表名(rename)  rename table 原表名 to 现表名

      修改表的字符集(alter)  alter table 表名 character set 字符集

    删除表

      drop table 表名;

    SQL完成对表中数据的CRUD的操作

    插入数据

      insert into 表名(列名,列名,列名) values(值,值,值)

      例: insert into student($id,$name,sex,age) values(12,'skdjf',234,34);

        简单写法:insert into student values(2,'wangwang',87,87);(必须是插入全部列,插入部分列不能省略)

      批量插入:insert into 表名 values(值,值,值,...),(值,值,值,...),(值,值,值,...)...;

        insert into 表名(列名,列名,列名) values(值,值,值,...),(值,值,值,...),(值,值,值,...)...;  

        例: insert into student values(7, 'ksdjf', 8, 9),(8, 'sdjf', 9, 10),(9, 'jdk',34, 234),(10, 'fjdk', 478, 89);

        查看表中的数据:select * from student;

    命令行输入中文乱码的问题

      暂停mysql的服务

      在mysql安装路径中找到my.ini配置文件

      在57行的编码方式改为gbk

      保存文件并退出

      启动mysql服务

    删除记录

      delete from 表名 [where 条件]

      delete from student:没有指定条件,删除表中全部的数据

      例:delete 删除数据和truncate输出数据有什么差别

      delete:DML 一条一条删除表中的数据

      truncate:DDL 先删除表再重建表

      执行效率:数据少delete高效,数据多truncate高效

    更新表记录

      update 表名 set 列名=列的值,列名=列的值 [where 条件]

      例:update student set $name='xiaojingzi' where $id=5;

      update 表名 set 列名=列的值   表中所有的数据全部被更新

    查询记录

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

      distinct:去除重复的数据

    案例分析:

    商品分类:1. 分类的ID,2. 分类的名称,3. 分类的描述 

    create table category(
       cid int primary key auto_increment,
       cname varchar(10),
       cdesc varchar(10)
    );
    
    insert into category values(null, '手机数码','质量可靠');
    insert into category values(null, '鞋靴箱包','一个字,贵');
    insert into category values(null, '酸奶饼干','好吃又好喝');
    insert into category values(null, '馋嘴零食','瓜子,花生,饼干');
    
    select * from category;
    select canme,cdesc from category;

    所有商品:1. 商品的ID,2. 商品的名称,3. 商品的价格,4.生产日期,5. 商品分类的ID

    create table product(
       pid int primary key auto_increment,
       pname varchar(10),
       price double,
       pdate timestamp,
       cno int
    );
    
    insert into product values(null, '小米mix4', 998, null, 1);
    insert into product values(null, '锤子', 2998, null, 1);
    insert into product values(null, '阿迪王', 298, null, 2);
    insert into product values(null, '老村长', 28, null, 2);
    insert into product values(null, '金酒', 88, null, 3);
    insert into product values(null, '小熊饼干', 8, null, 3);
    insert into product values(null, '卫龙', 0.1, null, 4);
    insert into product values(null, '旺旺', 0.3, null, 4);
    
    --简单查询:select * from product;
    --查询商品名称和价格: select pname,price from product;
    --别名查询    as 可以省略
        --表别名:select p.pname,p.price from product as p;(用在多表查询)
            select p.pname,p.price from product as p; 
        --列别名:  select pname as 商品名称.price as 商品价格 from product
            select pname as 商品名称,price as 商品价格 from product;(不需要引号)
    --查询商品所有的价格
        select price from product;
        --去重:select distinct price from product;
    --select 运算查询:只是再查询结果上做运算
        select *,price*1.5 as 打折价 from product; 
    --条件查询[where关键字]
        --指定条件,确定要操作的记录
        --查询商品价格大于60元的所有商品信息:
            select * from product where pirce > 60
    --where 后的条件写法
        --关键运算符: > >=, <, <=, =, !=, <>
        -- <>:不等于:标准的sql语法
        -- !-:不等于:非标准sql语法
    --逻辑运算:and, or, not;
        --查询商品的价格在100-10000之间的商品
            select * from product where price > 10 and price < 10000;
            select * from product where price between 10 and 10000;
    --like:模糊查询
        -- _:代表一个字符
        -- %:代表多个字符
        --查询名字中带有小字的所有商品
            select * from product where pname like '%小%';
        --查询第二个名字是米的所有商品
            select * from product where pname like '_米%';
    --in:在某个范围内获取值
        --查询商品的分类ID在1,3里面的商品
            select * from product where cno in (1, 3);
    --排序查询:order by 关键字
        --asc:ascend 升序
        --desc:descend 降序
        --查询所有商品,按照价格进行排序
            select * from product order by price desc;
        --查询带有小字的商品按照价格排序
            select * from product where pname like '%小%' order by price asc;
    --聚合函数
        -- sum():求和
        -- avg():求均值
        -- count():统计数量
        -- max():最大值
        -- min():最小值
        -- 获得所有商品价格的总和
            select sum(price) as 价格的总和 from product;
        --获得所有商品的均值
            select avg(price) as 价格的均值 from product;
        --获得所有商品的个数
            select count(*) as 商品的个数 from product;
        -- 注意:where后面不能接聚合函数    select * product where price>ave(price);
        --查询商品价格大于平均价格的商品
            select * from product where price > (select avg(price) from product);
     --分组:group by
        --根据cno字段分组,分组后统计商品的个数
        select cno,count(*) from product group by cno;
        --根据cno字段分组,分组统计每组商品的平均价格,并且商品平均价格大于60
        select cno,avg(price) from product group by cno having avg(price) > 60;
            --having 关键字,可以接聚合函数,出现在分组之后,分组后过滤
            --where 关键字,不能接聚合函数,出现在分组之前
        -- 填写顺序:s...f...w...g...h...o
        select ... from ... where ... group by ... having ... order by ...
        -- 执行顺序: f...w...g...h...s...o
        from...where...group by...having...select...order by    

     

    SQL创建多表以及多表之间的关系

    外键约束:foreign key

      例:alter table product add foreign key(cno) references category(cid);

      delete from category where cid = 4;// 删除失败

      首先得去product 删除cno为5的商品

    建数据库的原则:通常情况下,一个项目或者应用建立一个数据库

    多表之间的建表原则

      一对多:商品和分类

        建表原则:在多的一方添加一个外键,指向一的主键

      多对多:老师和学生,学生和课程

        建表原则:多建一张中间表,中间表至少要有两个外键,这两个外键分别指向原来的两张表

      一对一:班级和班长,公民的身份证,国家和国旗

        建表原则:方案一:将一对一的情况,当作是一对多的情况进行粗粒

               方案二:直接将两个表合并成一张表

               方案三:将两张表的主键建立连接,让两张表的主键相等

               实际用途:用的不多(拆表操作)

    网上商城案例分析:

    1. 用户表(用户ID,密码,手机号)   

    create table user(
        uid int primary key auto_increment,
        username varchar(31),
        password varchar(31),
        phone varchar(31)
    );
    insert into user values(1, 'zhangsan', '123', '13547855478');

    2. 订单表(订单编号,总价,订单时间,地址,外键用户ID)

    create table orders(
        oid int primary key auto_increment,
        sum int,
        otime timestamp,
        address varchar(100), 
        uno int,
        foreign key(uno) references user(uid)
    );
    insert into orders values(1, 200, null, 'sichuanUniversity',  1);
    insert into orders values(2, 200, null, 'hahaUniversity',  1);

    3. 商品表(商品ID,商品名称, 商品价格, 外键cno)

    create table product(
        pid int primary key auto_increment,
        pname varchar(10),
        price double,
        cno int,
        foreign key(cno) references category(cid)
    );
    insert into product values(null, '小米mix4', 998, 1);
    insert into product values(null, '锤子', 2998, 1);
    insert into product values(null, '阿迪王', 298, 2);
    insert into product values(null, '老村长', 28, 2);
    insert into product values(null, '金酒', 88, 3);
    insert into product values(null, '小熊饼干', 8, 3);
    insert into product values(null, '卫龙', 0.1, 4);
    insert into product values(null, '旺旺', 0.3, 4);

    4. 订单项:中间表(订单ID,商品ID,商品数量,订单项总价)

    create table oderitem(
        ono int,
        pno int,
        foreign key(ono) references orders(oid),
        foreign key(pno) references product(pid),
        ocount int,
        subsum double
    );
    --给一号订单添加商品
    insert into oderitem values(1, 9, 100, 99800);
    insert into oderitem values(1, 10, 100, 299800);
    --给二号订单添加商品
    insert into oderitem values(2, 11, 3, 900);
    insert into oderitem values(2, 12, 3, 90);

    5. 商品分类表(分类ID,分类名称,分类描述)

    create table category(
        cid int primary key auto_increment,
        cname varchar(15),
        cdesc varchar(100)
    );
    insert into category values(null, '手机数码','质量可靠');
    insert into category values(null, '鞋靴箱包','一个字,贵');
    insert into category values(null, '酸奶饼干','好吃又好喝');
    insert into category values(null, '馋嘴零食','瓜子,花生,饼干');

     多表之间的查询

    -- 交叉连接查询    笛卡儿积
    select * from product 
    select * from category;
        -- 笛卡尔积
            select * from product,category;    -- 查询的结果没有意义
        -- 过滤出有意义的数据
            select * from product as p,category as c where p.cno = c.cid;
    --内连接查询
        --隐式内连接查询:先查询后过滤
            select * from product p, category c where p.cno = c.cid;
        --显式内连接查询:带着条件去查询,效率更高
            select * from product p inner join category c on p.cno = c.cid;
        两种方法的查询结果一致
    --外连接
        --左外连接:将左表中的所有数据都查询出来,如果右表中没有对应数据,就用Null代替
        select * from product p left outer join category c on p.cno = c.cid;
        --右外连接:将右表中的所有数据都查询出来,如果左表中没有对应数据,就用Null代替
        select * from product p right outer join category c on p.cno = c.cid;
    --分页查询
        --每页数据为10,起始索引为0,第一页0,第二页5,从0开始,只会显示5条数据
        select * from product limit 0, 5;
    --子查询:
        --查询出分类名称为手机数码的所有商品
            select * from product where cno = (select cid from category where cname = '手机数码');
        --查询出(商品名称,商品分类名称)信息
            --左连接
            select p.pname,c.cname from product as p left outer join category c on p.cno = c.cid;
            --子查询
            select pname , (select cname from category where cno = cid) as 商品分类名称 from product;
  • 相关阅读:
    Documentation | AnsibleWorks
    Salt Stack 官方文档翻译
    OSNIT_百度百科
    内心觉得自己会是一个还比较厉害的产品经理,对于新产品的整合上
    知方可补不足~UPDLOCK更新锁的使用
    MongoDB学习笔记~环境搭建
    压力测试~一套完整的压力测试项目文档
    压力测试~测试工具的使用
    不说技术~关于创业一点想法
    HTML5 Canvas 填充与描边(Fill And Stroke)
  • 原文地址:https://www.cnblogs.com/feng-ying/p/9706056.html
Copyright © 2011-2022 走看看