MySQL数据库

1.什么是数据库?DBMS

        DBMS:DataBaseManagementSystem,数据库管理系统 (数据库软件)

        常见的DBMS:Oracle、MySQL、DB2、SQLserver、sqlite、Mariadb等

        1.开源:开放源代码,产品免费,靠卖服务盈利,有大拿无偿维护升级
        2.闭源:不开放源代码,产品收费,靠卖产品和服务盈利,有大拿攻击找漏洞,但是人家公司会花钱杨一帮人维护升级

2.数据库分类

        2.1.关系型数据库:经过数学理论验证可以保存现实生活中的各种关系,以表为单位保存数据

        2.2.非关系型数据库:主要解决特定的场景文体,比如数据缓存,已键值对形式在内存中保存数据

3.常见关系性数据库介绍

       1.MySQL:Oracle公司产品,开源产品,08年被Sun公司收购,09年Sun被Oracle收购,传言要闭源,MySQL创始人们不爽。离职创办MariaDB,市场占有率第一
        2.Oracle:Oracle公司产品,闭源,性能和价格都是最高  市场占有率第二
        3.SQLserver:微软产品,闭源,主要应用在微软整体解决方案当中,市场占有率第三。
        4.DB2:IBM公司产品,闭源,主要应用在IBM整体解决方案当中
        5.SQLite:轻量级数据库,只具备最基础的增删改查操作,主要应用在嵌入式设备和移动设备中
        6.Mariabd:是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL

4.什么是SQL

        Structured Query language结构化查询语言,用于程序员和数据进行沟通

5.安装数据库

        详情见数据库安装

6.连接数据库

        6.1.Linux:桌面任意位置邮件打开终端,输入:

                mysql -uroot -p  直接回车 填写密码 再回车

        6.2.Window:1)win+R输入cmd 回车  弹出终端

                mysql -uroot -p  直接回车 填写密码 再回车

              2)开始菜单-所有程序-找到MySQL-MySQL Client-输入密码回车

        6.3退出命令:exit

        6.4导入数据库:

                Window:source 导入数据库文件的路径(如:D:/java/***.sql)

                Linux:source 导入数据库文件的路径(如:/home/soft01/桌面/***.sql;)

7.库相关SQL

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

        

        7.2创建数据库:create database 数据库名 character set utf8/gbk;

        

        7.3.查看数据库详情: show create database 数据库名;

       

         7.4.删除数据库:drop database 数据库名;
        

         7.5使用数据库: use 数据库名;

         

 8.表相关SQL

!!!!前提一定是使用了数据库!!!看7.5

如若不懂数据类型者详情可看:MySQL数据库类型详解总结大全-有哪些以及取值范围 - secsafe - 博客园

SQL数据类型
1.整数 int 和 bigint(等效long)
2.浮点数: double(m,d)m代表总长度  d代表小数长度
   52.342  m=5  d=3
    decimal(m,d):超高精度的浮点数,当涉及超高精度运算时使用
3.字符串: char(m) m代表字符长度 固定长度  最大长度255
    varchar(m) 可变长度  最大长度65535 但是超过255建议使用 text
    text(m) 可变长度 最大长度65535 
4.日期
    data:只能保存年月日
    time:只能保存时分秒
    datatime:保存年月日时分秒  默认值为null 最大值9999-12-31
    timestamp(时间戳):保存年月日时分秒  默认值为当前系统时间:2038-1-19

        8.1创建表:create table 表名(字段1名 字段1类型,字段2名 字段2类型,.....);

        

         8.2查询表详情:show create table 表名;、

        

        8.3表引擎:InnoDB和MyISAM

                innodb:默认,支持数据库的高级操作,如:外键、事务等
                myisam:只支持基础的增删改查操作
                两种类型最主要的差别是InnoDB支持事务处理与外键和行级锁。

        8.4创建表的时候指定引擎和字符集:

                 create table 表名(字段1名 字段1类型,字段2名 字段2类型,.....)engine=innodb/myisam charset=utf8/gbk;

        

                可以执行8.2查看有何不同。

        8.5查看表字段:desc 表名;

                

         8.6删除表: drop table 表名;

                 

         8.7查询所有表:show tables;

                 

         8.8修改表名:rename table 原名 to 新名;

                   

                可以执行8.7查看表名是否修改了。

        8.9修改引擎和字符器:alter table 表名 engine=myisam/innodb charset=utf8/gbk;

                别看了没有图。。。引擎很少修改,要记住修改字符集的语句!!charset

        8.10添加表字段:

                最后添加格式:alter table 表名 add 字段名 字段类型;
                最前添加: alter table 表名 add 字段名 字段类型 first;
                在xxx的后面:alter table 表名 add 字段名 字段类型 after xxx;

                

                 

 其余剩下感兴趣可以自行测试。

        8.11删除表字段:alter table 表名 drop 字段名;

                

        8.12修改字段名和类型: alter table 表名 change 原名 新名 新类型;

                

 9.数据库相关SQL

        9.1.新增数据(插入数据):注意插入的值要和表中字段一样,比如表中只有两个字段不可以插入三个值!!!!

               9.1.1全表插入格式: insert into 表名 values(值1,值2);
               9.1.2.指定字段插入格式:insert into 表名(字段1,字段2) values(值1,值2);
               9.1.3.批量插入:在values后面通过,将多组数据写到一起

                        insert into 表名 values(3.5,10),(4.6,11),(5.7,12);

                

         中文问题:如果执行报错执行:set names gbk;

         9.2查询数据 :select 字段名 from 表名;

                select agefrom student;//查询所有age
                select bonus,age from student;//查询所有bonus和age
                select * from student;//查询t1里所有信息
                select *from student where age<11;//查询age小于11的所有信息

                

         9.3修改数据:update 表名 set 字段名=值 where 条件;

                  update student set bonus=50.5 where age=12; //修改单个
                  update student set age=18;//所有数据都改成18

                 

        9.4删除数据:        delete from 表名 where 条件;

                         delete from student where bonus=5.700; //删除单个
                         delete from student where age=10; //删除单个
                         delete from student ;//删除 student 里所有的数据

                

10.主键约束  primary key

        什么是主键:表示数据唯一性的字段称为主键(如我们的身份证号码)

        什么是约束:创建表时给表字段添加的限制条件(如不能为空,不能重复)

        什么是主键约束:限制主键的值 唯一且非空

格式:create table t1(id int primary key,name varchar(10),age int);

                

失败的原因:主键为1的值已经存在

11.主键约束 + 自增  primary key auto_increment

        规则:从历史最大数的基础上+1  只增不减

         create table t3(id int primary key auto_increment,name varchar(10));

        

 12.是否为空 is null  \ is not null

        select * from emp where manager is null; //查询emp表中上级领导为空的人

        select * from emp where manager is not null; //查询emp表中上领导不为空的人         

 13.去重 distinct

        去除重复的字段只显示一次。

        select distinct job from emp;  //查询emp表中有什么部门

        

 14.多行结果显示一行 group_concat()

        select id,group_concat(job) from emp where manager =4;

        

        应用场景:一个学生对应多门科目成绩可以使用他来查询 

15.比较运算符  > < >= <= = != 和<>(不等于)

        select name,sal from emp where sal<2000; //查询工资小于2000的人的名字和工资

        select name,sal,job from emp where job='CEO'; //查询岗位是CEO的人的名字,工资,岗位

        select name,job,sal from emp where sal<=1600; //查询工资小于等于1600的人

        select name,job from emp where job!='销售';  //查询岗位不是销售的人
        select name,job from emp where job<>'销售'; //查询岗位不是销售的人

        
        注意:<> 是不等于的意思。

16.和\或  and 和 or

        如果查询数据需要满足多个条件使用and
        如果查询数据只需要满足某一个条件就可以使用 or

       select name,sal,deptId from emp where deptId=1 and sal<2000;//查询1号部门中工资低于2000的人

        select * from emp where deptId=3 or sal>3000; //查询部门为1 并且工资是3000以上的人

         

17.模糊查询 like

        % 代表0或多个未知字符
        _代表1个未知字符
        举例:
                1.查询第一个字符是x    x%
                2.查询最后一个字符y    %y
                3.查询倒数第二个是x    %x_
                4.以x开头以y结尾    x%y
                5.包含x    %x%
                6.第二个字符是x倒数第三个字符是y    _x%y__

        select name,sal from emp where name like '_八%'; //查询名字第二个字符是八的员工姓名和工资

        

18.包含  between x and y(包含x和y)、

         select name,sal from emp where sal between 2000 and 3000;//查询工资再2000和3000之内的员工

        

19.多个条件  in

        //查询工资为800,1250,1500的员工信息

        select * from emp where sal in(800,1250,1500);

      

20.排序 order by asc/desc

        order by 字段名;( asc 默认不写升序)/desc降序

        select name,sal from emp order by sal;  //查询每个员工的姓名和工资按照工资升序排序

        select name,comm from emp where deptId=3 order by comm desc; //查询3号部门每个员工的姓名和奖金按照奖金降序排序

        

21.分页查询  limit

        格式:limit n,m    n:请求页数,m:每一页显示几行数据

        select * from emp  limit 4,2; //查询员工表信息  第五页  每页两条数据

     

22.数值计算 + - * / %

        select name,sal,sal+1000 from emp; //查询员工表中每个员工涨薪1000块钱之后的姓名、涨薪前工资和涨薪后工资

        

 23.聚合函数  平均值,最大值,最小值,求和,计数

         对查询的多条数据进行统计查询:平均值,最大值,最小值,求和,计数

         平均值:avg(字段); 

                select avg(sal) from emp where deptId=3; //查询3号部门的平均工资

        

         最大值:max(字段);

              select max(sal) from emp where deptId=1; //查询1号部门工资最高值

                

         最小值:min(字段);

                select min(sal) from emp where deptId=2; //查询2号部门工资最低值

                

         求和:sum(字段);

                select sum(sal) from emp where deptId=3; //查询员工表中3号部门的工资总和

                

         计数:count(字段或*);

                 select count(*) from emp where deptId=2 and sal>2000; //查询2号部门工资大于2000的员工人数

                

 24.分组查询 group by

        格式:group by 字段

        select deptId,avg(sal) from emp group by deptId; // 查询每个部门的平均薪资

        

        select deptId,sum(sal) from emp group by deptId; //查询每个部门的工资总和

        

25.having

        from后只能写普通的字段提交建,如果条件是聚合函数的条件则需要使用having

        having一定要配合group by结合使用

        select deptId,avg(sal) from emp group by deptId having avg(sal)>2000;

        //查询每个部门的平均工资 要求查询平均工资大于2000的

        

         别名:

                select deptId 部门编号,avg(sal) a from emp group by deptId having a>2000;

                //这里deptId字段变成了部门编号,而我们avg(sal)后的a最后可以当做条件去判断

        

        sql语句执行顺序:

                select ... from 表名 where ... group by ... having ... order by ... limit ...;

26.子查询(嵌套查询)

        select * from emp where sal>(select avg(sal) from emp);

        //查询工资高于平均工资的员工信息

    

         select * from emp where sal=(select max(sal) from emp);

        //查询员工表中工资最高的员工信息

        

         select * from emp where sal>(select max(sal) from emp where deptId=2);

        //查询工资高于2号部门最高工资的员工

      

27.关联查询        

        同时查询多张表的查询方式称为关联查询
        关联查询必须写关联关系,如果不写会得到两张表数据的乘机 (2次方)这个乘机叫做笛卡尔积,这是一个错误的查询。

        关联关系:指创建表时两张表之间存在的业务关系(外键)

                外键:用于建立关系的字段称为外键,一个表中只有一个主键但可以有多个外键

        一对一:假如有A\B两张表,A表中一条数据对应B表中的一条数据,同时B表中一条数据对应A表中一条数据。(比如一个人对应一个身份证号,一个身份证号对应一个人)只需要再表中添加外键指向主表主键即可。(如emp表中字段deptId对应dept表中字段id)

        一对多:有AB两张表,A表中一条数据对应B表中多条数据,同时B表中一条数据对应A表中一条数据。
如何建立关系:在多的表中添加外键指向另外一张表的主键

        多对多:有AB两张表,A表中一条数据对应B表中多条数据,同时B表中一条数据也对应A表中多条数据
如何建立关系:创建一个单独关系表,表中两个外键字段指向其他两个表中的主键  

 

       27.1等值链接

         select d.name,e.name from emp e,dept d where e.deptId=d.id;

        //查询每个员工的姓名和对应部门表中的职位

        

        27.2内连接

           select * from emp e join dept d on e.deptId=d.id where e.job='销售';

            //查询job是销售的每个员工的信息和对应部门表中的信息

         注意:等值链接和内连接查询到的数据都是两张表的交际数据。

        27.3外链接(左left/右right)

                select e.nam,e.job,d.name d.loc from  emp e left/right join dept d on e.deptId=d.id where e. job='销售';

                //查询job是销售的每个员工的姓名,工作和对应部门表中的信息

注意:用作教学使用*号,在实际中要考虑运行效果,一些不必要的信息可以省略,我们要用具体的字段去代替*号。

28MySQL数据优化

        查询时,能不用* 就不用,尽量写全字段名。

        索引不是越多越好,每个表控制在6个索引以内。范围where条件的情况下,索引不起作用,比如where value<100。

        大部分情况连接效率远大于子查询,但是有例外。当你对连接查询的效率都感到不能接受的时候可以试试用子查询,虽然大部分情况下你会更失望,但总有碰到惊喜的时候不是么...

        有时候可以1条大的SQL可以分成几个小SQL顺序执行,分了吧,速度会快很多。

        连接时注意:小表 jion 大表的原则。

        尽量避免使用order by。

        因为where子句后面的条件是执行顺序是从右到左,所以尽量把能过滤掉大部分数据的条件放在最后。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值