Mysql基础

来源:互联网 发布:golang package 编辑:程序博客网 时间:2024/06/07 10:22
Mysql
一、数据库基础知识
A、数据的发展史
1、没有数据库阶段,使用磁盘文件存储数据
2、层次结构模型数据库
3、网状结构模型数据库
4、关系型结构数据库(使用二维表来存储数据)
5、关系-对象模型数据库  
B、市面上的数据库
1、Oracle      甲骨文
2、DB2         IBM
3、SQL Server  微软
4、Sybase      赛尔斯
5、MySql       开源-->SUN-->Oracle
6、MongoDB
7、Redis
C、主要学习的数据库(以MySQL来学习)
DBA职位
RDBMS(关系型数据库管理系统)Rational Database Management System
一个数据看管理系统,包括一个管理角色的和多个数据仓库,一个仓库中包含多个数据表,
一个数据表中包括两个部分(表结构、表记录),表结构指的是数据表的列名称和列类型,
表记录(即表数据)指的是表中的数据
注意:
管理员与数据库的关系
数据库与数据表、视图、索引、存储过程的关系
数据表与表结构、表记录的关系
D、MySQL的目录结构
1、bin
2、my.ini文件是MySQL的总配置文件,后面需要使用
二、SQL语言
A、ISO国际标准化
国际标准化组织ISO统一SQL语言
C89  C99  --- C语言的ISO标准
1、ISO发布的版本
  SQL-92
  SQL:1992
  SQL:2003
B、SQL语言分类
1、DDL(Data Definition Language)  
   数据定义语言,用来定义数据库对象:库、表、列等
2、DML(Data Manipulation Language)   
    数据操作语言,用来定义数据库记录(数据)
3、DCL(Data Control Language)   
    数据控制语言,用来定义访问权限和安全级别
4、DQL(Data Query Language)   
    数据查询语言,用来查询记录(数据)   
C、SQL语法
1、SQL可以使用空格和缩进进行格式化
2、每一条sql语句使用分号结尾
3、SQL对于大小写要求不严格,但是建议SQL的关键字使用大写
 
 ========================这里以前是分页符==============================
 1、远程连接mysql
mysql -h host -u username -p password
2、mysql的提示符
mysql> 准备好接受新命令。
->        等待多行命令的下一行。
'>        等待下一行,等待以单引号(“'”)开始的字符串的结束。
">        等待下一行,等待以双引号(“"”)开始的字符串的结束。
`>        等待下一行,等待以反斜点(‘`’)开始的识别符的结束。
/*>        等待下一行,等待以/*开始的注释的结束。
 
###DDL 数据定义语言(DDL的操作存在两部分的操作:对数据库的操作、对表结构的操作)  
   A、对数据库的操作
    1、查看所有的数据库
       show databases;
    2、切换数据库
       use  数据库名称;
    3、创建数据库
       create database [if not exists] 数据库名 [charset=utf8];
    4、删除数据库
       drop database [if exists] 数据库名;
    5、修改数据库编码
       alter database 数据库名 character set utf8;
    6、显示数据库的编码格式
       show create database 数据库名;
   B、对表结构的操作
    1、首先介绍一下SQL语言中的数据类型
       a、int  整型
       b、double  使用格式double(5,2)表示最多包含五位数字,其中有两位小数,即:表示的最大值为999.99
       c、decimal  浮点型 主要使用在金融行业(例如手机支付等)使用格式decimal(5,2)这是一种二进制运算无差错
                       的数据类型
       d、char   固定长度字符串类型,使用格式char(x)x的最大取值是255,这里的255等数字表示的是字节数目
       e、varchar  可变长度字符串类型  使用格式varchar(x),x的最大取值是65535,对于可变长字符串类型,需要使用
                       一部分空间来记录本类型的长度,存在浪费
            举例: 2014-12-12 22:10:12  假如存储这个字符串的时候,这个字符串长度为19,那么使用char(20)就足够
                    但是假如使用varchar(20)的话,可能由于要使用一部分空间来存储数据,导致不能将整个字符串存储下来
       f、text   字符串类型,表示大字符串,细分为四种:tinytext text mediumtext longtext
       g、bolb   字节类型,表示大字节,同样分为四种
       h、date   日期类型,格式为:yyyy-MM-dd
       i、time   时间类型,格式为:hh:mm:ss
       j、timestamp    时间戳类型  格式为:年月日+时分秒+毫秒    
    2、查看表结构
       desc 表名称;
    3、创建表
       create table 表名称(列名称 列类型,列名称 列类型,列名称 列类型,。。。。。)在最后一个列的后面没有逗号
    4、查看数据库中所有的表名称
       show tables;
    5、删除表
       drop table 表名称;
    6、修改表
       a、添加列  alter table 表名称 add(列名 列类型,列名 列类型,列名 列类型,。。。。。);
       b、修改列类型   alter table 表名称 modify 列名 新列名;
       c、修改列名和列类型   alter table 表名称 change 老列名 新列名 列类型;(列类型可以是新的类型也可以是老的类型,若为老类型则表示只更改了列名称)
       d、删除列   alter table 表名称 drop 列名称;  
       e、修改表名称   alter table 表名 rename to 新表名称;                                                                          
 
###DML数据操作语言
   注释:主要针对表记录(表数据)的更新操作    
   A、插入记录
      insert into 表名称 (列名称,列名称,列名称。。。) values(列值,列值,列值。。。。);
      当想要插入整条数据的时候,前面部分的列名称列表可以不写,只在后面给值即可
      insert into 表名称 values(列值,列值,。。。,列值); 这个时候值得顺序要和数据表中定义的列的顺序一致
      注意事项:1、日期型数据和字符型数据必须使用单引号括起来
                2、插入空值有两种方式:a、不指定值  b、设置values为null
                3、未插入的列的值使用null补充
                4、进行insert操作的时候前后两个部分的顺序要一致,包括数据类型和数据顺序             
   B、修改表记录
      普通修改
      update 表名称 set 列名称=列值,列名称=列值,列名称=列值。。。。;  
          注释:在没有添加条件的时候,会默认修改对应列名称下面的所有记录为上面的列值,这是不合理的
      有条件修改,用于局部的修改,根据条件进行修改
      update 表名称 set 列名称=列值,列名称=列值。。。[where 条件];    [注释]:条件一般是结果为boolean类型数据
   C、删除表记录
      delete from 表名称 [where 条件];
   D、一个特殊的删除方式
      truncate table 表名称;  truncate 方法不是DML的操作,它是DDL的操作,它做的是对表结构的更改
      上面的语句包含两个部分:1、drop table 表名称; 删除了表2、create table 表名称; 创建了名称为之前的名字的新表
   E、对上面的c、d两个区别的比较
      使用delete操作可以回滚,即:数据可以恢复
      使用truncate操作数据不可回滚,即:数据不可恢复
      演示:start transaction;
            delete * from student;
            rollback; 回滚操作         
   F、对于MYSQL语言的运算符
      1、between...and
         update tbl_student set s_gender='M' where s_age >= 10 and s_age <= 20;
         update tbl_student set s_gender='F' where s_age between 10 and 20;
      2、in(.....)
         update tbl_student set s_name='xxx' where s_name='zhangsan' or s_name='lisi';
         update tbl_student set s_name='xxx' where s_name in ('zhangsan','lisi');
      3、not     
      4、is null
         update tbl_student set s_name='yyy' where s_age=null;这样操作是错误的-----为什么?=null不会报错,=‘null’也不会报错,但是结果不会被修改。  
         update tbl_student set s_name='yyy' where s_age is null;   
         当书写sql语句的时候,当出现了null的时候,不能使用等号,必须使用is null
 
###DCL数据控制语言
   注释:DCL是root这个超级管理员所使用的操作,主要用啦对其他数据库的操作用户进行设置
   A、创建用户
      create user 用户名@IP地址 identified by 密码;
      例:create user zhagsan@localhost identified by ‘1234’;
          当想要使用这个账户登录系统的时候
          mysql -uzhangsan -p1234
   b、给用户授权
      grant 权限1,权限2,权限3... on 数据库名称.* to 用户名@'IP地址';
      数据库名称.* :表示数据库的所有文件包括记录表、其他文件等等
      权限:CREATE  ALTER  DROP  INSERT  UPDATE  DELETE  SELECT
   C、撤销授权
      revoke 权限1,权限2,权限3... on 数据库名称.* to 用户名@'IP地址';
   D、查看权限
      show grants for 用户名@'IP地址';
   E、删除用户
      drop user 用户名@'IP地址';          
###DQL数据查询语言          
   注释:查询操作的主要分类:1、基本查询(列控制查询、条件查询)2、排序查询 3、聚合函数查询 4、分组查询5、MySql特有方式limit
   1、基本查询    
      a、普通查询
         select * from 表名称; 查询该表中的所有数据
      b、列控制查询,即:查询指定列
         select 列名称,列名称。。。 from 表名称;
      c、去重复查询,关键字 distinct
         select distinct 列名称 from 表名称;
      d、使用运算符进行查询
         注意:任何数据和null进行操作的时候,都会称为null,应该使用if null (列名称,期望值)
         假设情况:当进行工资计算的时候,当需要计算工资和奖金的总和的时候,有的人不存在奖金表单中职位null
                   这个时候进行计算工资总和的时候,就要使用到if null (列名称,期望值)
         select ename,sal + if null(comm,0) from emp;
         select ename,sal + if null(comm,0) [as] salary from emp;
      e、给结果集起别名
         上面的sal + if null(comm,0)得到的结果是一个结果集,可以对这个结果集进行命名使用关键字as--------------------ifnull    no " "!!!
         select ename,sal + if null(comm,0) as salary from emp; 其中as可省略
      f、字符拼接
         当想要在输出的内容中,显示更好的输出样式,可以加上文字描述
         select ‘我的名字是:’+name from student; 这种方式是错误的,因为在MYSQL中不能使用”+“作为字符串连接符
         应该使用的是concat
         select concat('我是一名员工,我叫:',ename)[as aaa] from emp; 在这句话中concat实现了字符连接的操作
      g、基本条件查询
         select * from emp where='文员';
         select * from emp where sal betwwen 2000 and 3000 anddeptno=30;
      h、模糊查询
         select * from emp where name like '张_';
         select * from emp where name like '张_ _';
         select * from emp where name like '_ _亮';
         select * from emp where name like '_ _ _ _';
         select * from emp where name like '张%';
         select * from emp where name like '%张%';
         select * from emp where name like '%';
   2、排序查询        注释:关键字:order by
      a、单列排序
         select * from 表名称 order by 列名称 [asc\desc];  方括号中表示可选择内容,不写的时候默认为asc,表示升序、desc表示降序
      b、多列排序
         select * from 表名称 order by 第一列 [asc\desc],第二列 [asc\desc];
         当经过第一列的排序之后,存在某几个具有相同的值得时候,采用第二列的条件再排序
   3、聚合函数查询
      注释:聚合函数的运算时纵向的运算
      a、count()   
count(*):*表示所有列,计算有效行的数目,假如一行中所有列都为null,那么这行为无效记录,当括号中放入数字的时候,效果与*相同,表示所有列;count(xx):xx表示列名称,计算指定列的有效行数目,若在这一列中,某一行存在null,那这一行为无效行                                                                                        
      b、sum(列名称)  求某一列的和
      c、max(列名称)  求某一列中的最大值
      d、min(列名称)  求某一列中的最小值
      e、avg(列名称)  求某一列的平均值
   4、分组查询
      注释:使用哪个条件进行分组,这个条件必须是组信息,当使用非组信息查询的时候,虽然语法上是正确的,但是不符合要求
            分组一般和聚合函数一起使用
            select      要查询并显示的内容,  可以放 *, 列名称,聚合函数
            from        想要查询的表          具体的表
            where       分组前条件            不可放聚合函数
            group by    分组信息              列名称
            having      分组后条件            可以放聚合函数
            order by    对最终结果的操作      可以放聚合函数
   5、MySql的特有:limit
      注释:对于limit只在MySql中才有,其他数据库中不存在,而且Oracle数据库中也不存在
      a、limit语法结构:select * from 表名称 limit m,n;
         查询5行记录,从0行开始
         select * from 表名称 limit 0,3;
         查询10行记录,从3行开始
         select * from 表名称 limit 3,10;
         注解:对于上面的语法limit后面跟着两个数字,第一个数字m:表示起始行,第二个数字n:表示要查询并显示的行数
      b、拓展
         问:查询工资最高的员工的信息,在emp表中
         SELECT * FROM emp ORDER BY sal DESC  LIMIT 0,1;
         还可以使用子查询来操作
         SELECT * FROM (SELECT * FROM emp ORDER BY sal DESC) e LIMIT 0,1;
      c、分页显示
         1、关于页数的计算
            总页数=总记录条数%每页记录条数==0?总记录条数/每页记录条数:总记录条数/每页记录数+1;
         2、假如查询某一页数据并显示
            select * from 表名称 limit (要查询的页码-1)*每页记录数,每页记录条数;