04-05 mysql的学习笔记

来源:互联网 发布:centos命令 desktop 编辑:程序博客网 时间:2024/06/05 06:49
一、数据库概述
    1.数据库的基本概念
    数据库(DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。
    数据库管理系统(DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库统一管理和控制。
    
    数据库:存储、维护和管理数据的集合
    2.常见数据库管理系统
    Oracle:目前比较成功的关系型数据库管理系统。主要应用于大型的企业数据库领域。
    DB2:IBM的产品
    SQL Server:Microsoft的产品。软件界面友好、在操作性和交互性方面独树一帜
    PostgreSQL:加州大学以教学目的开发的数据库系统,支持关系和面向对象的数据库,属于自由数据库管理系统
    MySQL:免费的数据库系统,被广泛用于中小型应用系统。
二、数据库的安装与配置
    1.卸载MySQL
    (1)停止MySQL  net stop mysql
    (2)添加删除程序中卸载MySQL
    (3)到安装目录删除MySQL
    (4)删除:C:\Documents and Settings\All Users\Application Data\MySQL
        C:\ProgramData\MySQL
    (5)查看注册表:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services
    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services
    搜索mysql,找到一律干掉!
    ============================

不需要重启电脑(win xp),直接重新安装即可
    2.安装见详细链接(http://download.csdn.net/download/mind_programmonkey/9973991)
    3.修改密码
    运行cmd
        * 安装成功了打开cmd  --> mysql -uroot -p你的密码
        * 修改mysql root用户密码
            1) 停止mysql服务 运行输入services.msc 停止mysql服务
                或者 cmd -->  net stop mysql
            2) 在cmd下 输入 mysqld --skip-grant-tables 启动服务器 光标不动 (不要关闭该窗口)
            3) 新打开cmd 输入mysql -u root -p 不需要密码
            use mysql;
            update user set password=password('abc') WHERE User='root';
            4) 关闭两个cmd窗口 在任务管理器结束mysqld 进程
            5) 在服务管理页面 重启mysql 服务
            密码修改完成
            
三、sql的概述
    SQL:Structure Query Language。(结构化查询语言)
    SQL被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后来被国际化标准组织(ISO)采纳为关系数据库语言的国际标准。
四、sql的分类
    DDL(Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等;     CREATE、 ALTER、DROP
    DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据);        INSERT、 UPDATE、 DELETE
    DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
    DQL(Data Query Language):数据查询语言,用来查询记录(数据)。    SELECT
* 注意:sql语句以;结尾
五、数据库的操作
    1.创建数据库
    (1)创建一个名词为mydb1的数据库
    CREATE DATABSE mydb1;
    (2)创建一个使用gdk字符集的mydb2数据库
    CREATE DATABSE mydb2 character set gbk;
    2.查询数据库
    查看当前数据库服务器中的所有数据库
    show databases;
    查看前面创建的mydb2数据库的定义信息
    Show  create  database mydb2;
    删除前面创建的mydb3数据库
    Drop database mydb3;
    3.修改mysql
    查看服务器中的数据库,并把mydb2的字符集修改为utf8;
    alter database mydb2 character set utf8;
    4.其他:
    查看当前使用的数据库
    select database();
    切换数据库
    use mydb2;
六、数据表的操作
    * 语法:
            create table 表名(
                字段1 字段类型,
                字段2 字段类型,
                ...
                字段n 字段类型
            );
                
    * 常用数据类型:
            int:整型
            double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99;
            char:固定长度字符串类型; char(10)  'abc       '
            varchar:可变长度字符串类型;varchar(10) 'abc'
            text:字符串类型;
            blob:字节类型;
            date:日期类型,格式为:yyyy-MM-dd;
            time:时间类型,格式为:hh:mm:ss
            timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss  会自动赋值
            datetime:日期时间类型 yyyy-MM-dd hh:mm:ss

    当前数据库中的所有表
    SHOW TABLES;
    查看表的字段信息
    DESC employee;
    在上面员工表的基本上增加一个image列。
    ALTER TABLE employee ADD image blob;
    修改job列,使其长度为60。
    ALTER TABLE employee MODIFY job varchar(60);
    删除image列,一次只能删一列。
    ALTER TABLE employee DROP image;
    表名改为user。
    RENAME TABLE employee TO user;
    查看表格的创建细节
    SHOW CREATE TABLE user;
    修改表的字符集为gbk
    ALTER TABLE user CHARACTER SET gbk;
    列名name修改为username
    ALTER TABLE user CHANGE name username varchar(100);

    删除表
    DROP TABLE user ;
七、DML操作
    1.查询表中的所有数据
    SELECT * FROM 表名;

    DML是对表中的数据进行增、删、改的操作。不要与DDL混淆了。
    INSERT 、UPDATE、 DELETE

    小知识:
    在mysql中,字符串类型和日期类型都要用单引号括起来。'tom'  '2015-09-04'
    空值:null
    
    2.插入操作:INSERT:
    语法: INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);
    注意:列名与列值的类型、个数、顺序要一一对应。
    可以把列名当做java中的形参,把列值当做实参。
    值不要超出列定义的长度。
    如果插入空值,请使用null
    插入的日期和字符一样,都使用引号括起来。
    练习 :
    create table emp(
    id int,
    name varchar(100),
    gender varchar(10),
    birthday date,
    salary float(10,2),
    entry_date date,
    resume text
    );

    INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
    VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');

    INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
    VALUES(2,'lisi','male','1995-5-10',10000,'2015-5-5','good boy');

    INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
    VALUES(3,'wangwu','male','1995-5-10',10000,'2015-5-5','good boy');

    批量插入:
    INSERT INTO emp VALUES
    (4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
    (5,'li','m','2015-09-01',10000,'2015-09-01',NULL),
    (6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);
    
    3.删除操作 DELETE:
    语法 : DELETE FROM 表名 【WHERE 列名=值】
    练习 :
    删除表中名称为’zs’的记录。
    DELETE FROM emp WHERE name=‘zs’;
    删除表中所有记录。
    DELETE FROM emp;
    使用truncate删除表中记录。
    TRUNCATE TABLE emp;

    DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
    TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。
    删除的数据不能找回。执行速度比DELETE快。
八、DQL操作
    1 基础查询
        1.1 查询所有列
        SELECT * FROM stu;

        1.2 查询指定列
        SELECT sid, sname, age FROM stu;

    2 条件查询
        2.1 条件查询介绍
        条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
        =、!=、<>、<、<=、>、>=;
        BETWEEN…AND;
        IN(set);
        IS NULL; IS NOT NULL
        AND;
        OR;
        NOT;

        2.2 查询性别为女,并且年龄50的记录
          SELECT * FROM stu
        WHERE gender='female' AND ge<50;

        2.3 查询学号为S_1001,或者姓名为liSi的记录
        SELECT * FROM stu
        WHERE sid ='S_1001' OR sname='liSi';

        2.4 查询学号为S_1001,S_1002,S_1003的记录
        SELECT * FROM stu
        WHERE sid IN ('S_1001','S_1002','S_1003');

        2.5 查询学号不是S_1001,S_1002,S_1003的记录
        SELECT * FROM tab_student
        WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

        2.6 查询年龄为null的记录
        SELECT * FROM stu
        WHERE age IS NULL;

        2.7 查询年龄在20到40之间的学生记录
        SELECT *
        FROM stu
        WHERE age>=20 AND age<=40;
        或者
        SELECT *
        FROM stu
        WHERE age BETWEEN 20 AND 40;

        2.8 查询性别非男的学生记录
        SELECT *
        FROM stu
        WHERE gender!='male';
        或者
        SELECT *
        FROM stu
        WHERE gender<>'male';
        或者
        SELECT *
        FROM stu
        WHERE NOT gender='male';

        2.9 查询姓名不为null的学生记录
        SELECT *
        FROM stu
        WHERE sname IS NOT NULL;
        或者
        SELECT *
        FROM stu
        WHERE NOT sname IS NULL;


    3 模糊查询
        当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。
        通配符:
        _ 任意一个字符
            %:任意0~n个字符

        '%张%'  '张_'
        3.1 查询姓名由5个字母构成的学生记录
        SELECT *
        FROM stu
        WHERE sname LIKE '_____';
        模糊查询必须使用LIKE关键字。其中 “_”匹配任意一个字母,5个“_”表示5个任意字母。

        3.2 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
        SELECT *
        FROM stu
        WHERE sname LIKE '____i';

        3.3 查询姓名以“z”开头的学生记录
        SELECT *
        FROM stu
        WHERE sname LIKE 'z%';
        其中“%”匹配0~n个任何字母。

        3.4 查询姓名中第2个字母为“i”的学生记录
        SELECT *
        FROM stu
        WHERE sname LIKE '_i%';

        3.5 查询姓名中包含“a”字母的学生记录
        SELECT *
        FROM stu
        WHERE sname LIKE '%a%';

    4 字段控制查询
        4.1 去除重复记录
        去除重复记录(两行或两行以上记录中系列的上的数据都相同),例如emp表中sal字段就存在相同的记录。当只查询emp表的sal字段时,那么会出现重复记录,那么想去除重复记录,需要使用DISTINCT:
        SELECT DISTINCT sal FROM emp;

        4.2 查看雇员的月薪与佣金之和
          因为sal和comm两列的类型都是数值类型,所以可以做加运算。如果sal或comm中有一个字段不是数值类型,那么会出错。
        SELECT *,sal+comm FROM emp;

        comm列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。下面使用了把NULL转换成数值0的函数IFNULL:
        SELECT *,sal+IFNULL(comm,0) FROM emp;

        4.3 给列名添加别名
        在上面查询中出现列名为sal+IFNULL(comm,0),这很不美观,现在我们给这一列给出一个别名,为total:
        SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
        给列起别名时,是可以省略AS关键字的:
        SELECT *,sal+IFNULL(comm,0)  total FROM emp;

    5 排序  order by 列名 asc(默认) desc
        5.1 查询所有学生记录,按年龄升序排序
        SELECT *
        FROM stu
        ORDER BY sage ASC;
        或者
        SELECT *
        FROM stu
        ORDER BY sage;

        5.2 查询所有学生记录,按年龄降序排序
        SELECT *
        FROM stu
        ORDER BY age DESC;

        5.3 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
        SELECT * FROM emp
        ORDER BY sal DESC,empno ASC;

    6 聚合函数  sum avg max min count
        聚合函数是用来做纵向运算的函数:
        COUNT():统计指定列不为NULL的记录行数;
        MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
        MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
        SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
        AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

        6.1 COUNT
        当需要纵向统计时可以使用COUNT()。
        查询emp表中记录数:
        SELECT COUNT(*) AS cnt FROM emp;

        查询emp表中有佣金的人数:
        SELECT COUNT(comm) cnt FROM emp;
        注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。

        查询emp表中月薪大于2500的人数:
        SELECT COUNT(*) FROM emp
        WHERE sal > 2500;

        统计月薪与佣金之和大于2500元的人数:
        SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

        查询有佣金的人数,有领导的人数:
        SELECT COUNT(comm), COUNT(mgr) FROM emp;

        6.2 SUM和AVG
        当需要纵向求和时使用sum()函数。
        查询所有雇员月薪和:
        SELECT SUM(sal) FROM emp;

        查询所有雇员月薪和,以及所有雇员佣金和:
        SELECT SUM(sal), SUM(comm) FROM emp;

        查询所有雇员月薪+佣金和:
        SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

        统计所有员工平均工资:
        SELECT AVG(sal) FROM emp;

        6.3 MAX和MIN
        查询最高工资和最低工资:
        SELECT MAX(sal), MIN(sal) FROM emp;

    7 分组查询

        当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部门来分组。
        注:凡和聚合函数同时出现的列名,一定要写在group by 之后


        7.1 分组查询
        查询每个部门的部门编号和每个部门的工资和:
        SELECT deptno, SUM(sal)
        FROM emp
        GROUP BY deptno;

        查询每个部门的部门编号以及每个部门的人数:
        SELECT deptno,COUNT(*)
        FROM emp
        GROUP BY deptno;

        查询每个部门的部门编号以及每个部门工资大于1500的人数:
        SELECT deptno,COUNT(*)
        FROM emp
        WHERE sal>1500
        GROUP BY deptno;

        7.2 HAVING子句
        查询工资总和大于9000的部门编号以及工资和:
        SELECT deptno, SUM(sal)
        FROM emp
        GROUP BY deptno
        HAVING SUM(sal) > 9000;
          
            注:having与where的区别:
                1.having是在分组后对数据进行过滤.
                  where是在分组前对数据进行过滤
                
        2.having后面可以使用聚合函数(统计函数)
                  where后面不可以使用聚合函数。
        WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。


    8 LIMIT  方言
        LIMIT用来限定查询结果的起始行,以及总行数。

        8.1 查询5行记录,起始行从0开始
        SELECT * FROM emp LIMIT 0, 5;

        注意,起始行从0开始,即第一行开始!

        8.2 查询10行记录,起始行从3开始
        SELECT * FROM emp LIMIT 3, 10;

        8.3 分页查询
        如果一页记录为10条,希望查看第3页记录应该怎么查呢?
        第一页记录起始行为0,一共查询10行;
        第二页记录起始行为10,一共查询10行;
        第三页记录起始行为20,一共查询10行;
        8.3 查询代码的书写顺序和执行顺序
            查询语句书写顺序:select – from- where- group by- having- order by-limit
            查询语句执行顺序:from - where -group by - having - select - order by-limit    

九、数据完整性
        作用:保证用户输入的数据保存到数据库中是正确的。
        确保数据的完整性 = 在创建表时给表中添加约束
        完整性的分类:
        > 实体完整性
        > 域完整性
        > 引用完整性
    1、实体完整性
        实体:即表中的一行(一条记录)代表一个实体(entity)
        实体完整性的作用:标识每一行数据不重复。
        约束类型: 主键约束(primary key)  唯一约束(unique)  自动增长列(auto_increment)

    1.1主键约束(primary key)
        特点:数据唯一,且不能为null
        例:
        第一种添加方式:
        CREATE TABLE student(
        Id int primary key,
        Name varchar(50)
        );
        第一种添加方式:此种方式优势在于,可以创建联合主键
        CREATE TABLE student(
        id int,
        Name varchar(50),
        Primary key(id)
        );
        CREATE TABLE student(
        id int,
        Name varchar(50),
        Primary key(id,name)
        );
        第三种添加方式:
        CREATE TABLE student(
        Id int,
        Name varchar(50)
        );
        ALTER TABLE student
        ADD  PRIMARY KEY (id);

    1.2唯一约束(unique):
            CREATE TABLE student(
        Id int primary key,
        Name varchar(50) unique
        );


    1.3自动增长列(auto_increment)

        给主键添加自动增长的数值,列只能是整数类型,但是如果删除之前增长的序号,后面再添加的时候序号不会重新开始,而是会接着被删除的那一列的序号
        CREATE TABLE student(
        Id int primary key auto_increment,
        Name varchar(50)
        );

        INSERT INTO student(name) values(‘tom’);

    2、域完整性
        域完整性的作用:限制此单元格的数据正确,不对照此列的其它单元格比较
        域代表当前单元格
        域完整性约束:数据类型 非空约束(not null) 默认值约束(default)
        Check约束(mysql不支持) check();
    2.1 数据类型:(数值类型、日期类型、字符串类型)
    2.2 非空约束:not null
        CREATE TABLE student(
        Id int pirmary key,
        Name varchar(50) not null,
        Sex varchar(10)
        );

        INSERT INTO student values(1,’tom’,null);

    2.3 默认值约束 default
        CREATE TABLE student(
        Id int pirmary key,
        Name varchar(50) not null,
        Sex varchar(10) default ‘男’
        );

        insert into student1 values(1,'tom','女');
        insert into student1 values(2,'jerry',default);
    3、引用完整性
        要有外键必须先有主键,主键和外键的类型必须一致