MySQL(day_15)

数据库服务器(关系型数据库管理系统)

RDBMS  =  管理员(manager) + 仓库(database)

database = N个table

table:-> 表结构:定义表的列名和列类型!
                -> 标记录:一行一行的记录!

1. 什么是DBMS:数据的仓库
        > 方便查询
        > 可存储的数据量大
        > 保证数据的完整、一致
        > 安全可靠

2. DBMS的发展:今天主流数据库为关系型数据库管理系统(RDBMS 使用表格存储数据)

3. 常见DBMS:Orcale、MySQL、SQL Server、 DB2 、Sybase

4. DBMS = 管理程序 + 多个数据库(DB)

5. DB = 多个table(不只是table,但这里先不介绍其他组成部分)

6. table的结构(即表结构)和 table 的记录(即表记录)的区别!

7. 应用程序与DBMS:应用程序使得DBMS来存储数据!


服务器操作

1) 开启服务器(必须保证mysql为windows服务):net start mysql

    > 查看进程表中是否存在:mysqld.exe进程(存在)

2) 关闭服务器(必须保证mysql为windows服务):net stop mysql

    > 查看进程表中是否存在:mysqld.exe进程(不存在)

客户端操作(DOS命令)

    1. 登录服务器:mysql  -uroot  -p123456  -hlocalhost
        > -u:后面跟随用户名
        > -p:后面跟随密码
        > -h:后面跟随IP

    2. 退出服务器:exit/quit


SQL

    1. 什么是SQL:结构化查询语言(Structured  Query  Language)

    2. SQL的作用:客户端使用SQL来操作服务器
        > 启动mysql.exe,连接服务器后,就可以使用 sql 来操作服务器了
        > 将来会使用 Java 程序连接服务器,然后使用 sql 来操作服务器

    3. SQL标准(例如SQL99)
        > 由国际标准组织(ISO)制定的,对DBMS的统一操作方法

    4. SQL方言
        > 某种DBMS不只支持SQL标准,而且还会有一些自己独有的语言

    5. SQL语法
        > SQL语句可以在单行或多行书写,以分号结尾
        > 可以利用空格和缩进来增强语句的可读性
        > 不区分大小写,关键字用大写

    6. SQL语句分类(★★★)
        > DDL:数据库或表的结构操作
        > DML;对表的记录进行更新(增、删、改)
        > DQL:对表的记录的查询
        > DCL:对用户的创建,及授权!


DDL

1)数据库

    * 查询当前所有数据库    ——>  SHOW  DATABASES;
    * 切换(选择要操作的)数据库    ——>  USE  数据库名;
    * 创建数据库    ——>  CREATE  DATABASE  [IF  NOT  EXISTS]  数据库名 [CHARSET = UTF8];
    * 删除数据库    ——>  DROP  DATABASE  [IF  EXISTS] 数据库名;
    * 修改数据库编码    ——>  ALTER  DATARASE  数据库名  CHARACTER  SET  utf8;

2)数据类型(列表型)

    * int:整型
    * double:浮点型 例如double(5,2)表示最多5位,其中小数两位,最大为999.99
    * decimal:浮点型 该类型不会出现精度缺失问题
    * char:固定长度字符串类型 -> char(255)
                    当数据长度不足指定长度,补足到指定长度
    * varchar:可变长度字符串类型 -> varchar(65535)
    * text(clob):字符串类型
    * blob:字节类型
    * date:日期类型,格式为:yyyy-MM-dd
    * time:时间类型,格式为:hh:mm:ss
    * timestamp:时间戳类型

3)表

    * CREATE  TABLE  表名(
            列名  列类型,
            列名  列类型,
            ....);
    * 查看当前数据库中所有表名称:SHOW  TABLES;
    * 查看指定表的创建语句:SHOW  CREATE  TABLE  表名(了解);
    * 查看表结构:DESC  表名;
    * 删除表:DROP  TABLE  表名;
    * 修改表:前缀 —— ALTER  TABLE  表名
            >  修改之添加列:
            ALTER  TABLE 表名  ADD {
                列名  列类型,
                ...
            }
        > 修改之修改列类型(如果被修改的列已存在数据,那么新的类型可能会影响到已存在的数据)
            ALTER  TABLE  表名  MODIFY  列名  列类型;
        > 修改之修改列名:ALTER  TABLE  表名  CHANGE  原创名  新列名  列类型;
        > 修改之删除列:ALTER  TABLE  表名  DROP  列名;
        > 修改之修改表名称:ALTER  TABLE  原表名 RENAME  TO 新表名;

DML:数据库操作语言

1)插入数据

    * INSERT  INTO  表名(列名1,列名2,...) VALUES(列值1,列值2....);
        >  在表名后给出要插入的列名,其他没有指定的列等同与插入null值
    > 在VALUES 后给出列值,值的顺序和个数必须与前面指定的列对应

    * INSERT INTO 表名 VALUES(列值1,列值2);
            > 没有给出要插入的类,那么表示插入所有列
            > 值的个数必须是该表列的个数
            > 值的顺序,必须与表创建时给出的列的顺序相同

2)修改数据

    * UPDATE 表名  SET  列名1 = 列值1,列名2 = 列值2, ...[WHERE 条件]
    * 条件(条件可选的):
            >  条件必须是一个 boolean 类型的值或者表达式。
            > 运算符:= != <> > < <= >= BETWEEN...AND IN(...) IS NULL NOT OR AND

3)删除数据

    * DELETE FROM 表名 [WHERE 条件];

DCL(理解即可)

    * 一个项目创建一个用户!一个项目对应的数据库只有一个!
    * 这个用户只能对这个数据库有权限,其他数据库你就操作不了!

1) 创建用户
    * CREATE USER 用户名@IP地址 IDENTIFIED BY '密码';
            > 用户只能在指定的IP地址上登录
    * CREATE USER 用户名@'%' IDENTIFIED BY '密码';
            > 用户可以在任意IP地址上登录

2)给用户授权
    * GRANT 权限1,....,权限n ON 数据库.* TO 用户名@IP地址;
            > 权限、用户、数据库
            > 给用户分派在指定的数据库上的指定的权限
            > 例如:GRANT CREATE,...,SELECT ON mydb1.* TO user1@localhost;
         * 给用户分派在mydb1数据库上的CREATE,...,DELETE,SELECT权限

 * GRANT ALL ON 数据库.* TO 用户名@IP地址;
        > 给用户分派指定数据库上的所有权限

3)撤销授权
     * REVOKE 权限1,....,权限n ON 数据库.* FROM 用户名@IP地址;
            > 撤销指定用户在指定数据库上的操作权限

4)查看权限
    * SHOW GRANTS FOR 用户名@IP地址;
            > 查看指定用户的权限

5)删除用户
    * DROP USER 用户名@IP地址;

DQL(数据查询语言):

1)查询所有列:
    * SELECT * FROM 表名    --> 其中 * 表示查询所有列

2)查询指定列
    * SELECT 列1,列2,... FROM 表名;

3)列运算

     I.数量类型的列可以做加、减、乘、除运算
            > SELECT 列元素*1.5 FROM 表名;
                --> 如果列元素非数字类型,则值为0;若为NULL,无论是什么运算结果仍为null

    II.字符串类型可以做连接
            > SELECT CONCAT(列元素1, 列元素2) FROM 表名;
                --> 列元素1和列元素2均为字符串或者字符类型

    III.转换null值
            > SELECT IFNULL(列元素, 0) + 1000 FROM 表名;
                --> IFNULL(列元素, 0) 如果该列元素为null值,则当成0进行计算

    IV.给列起别名
            > SELECT 列元素1 as job, 列元素2.... FORM 表名;
                 --> 这里的as可以省略,其中job叫做列元素1的别名

4)条件查询

与前面介绍的UPDATE的DELETE语句一样,SELECT语句也可以使用WHERE子句来控制记录。
        * SELECT 列元素1,列元素2... FROM 表名 WHERE 条件语句;

5)模糊查询

该查询有利于对数据名称不确定情况下的查询

* SELECT * FROM 表名 WHERE name like '张_'      查询名字两个字,且姓张的数据

* SELECT * FROM 表名 WHERE name like '_ _ _'    查询名字由三个字组成的数据

--> 模糊查询需要使用到运算符: like  ,其中'_' 匹配一个字符 而'%'匹配0-n个字符!!!

* SELECT * FROM 表名 WHERE name like '张%'      查询姓张的数据

* SELECT * FROM 表名 WHERE name like '%小%'      查询名字中带有小字的数据

* SELECT * FROM 表名 WHERE name like '%'        等同于没有设立条件,名字为null的无法查询到

6)排序

I. SELECT * FROM 表名 ORDER BY 列元素 ASC; 按列元素进行升序排列

II. SELECT * FROM 表名 ORDER BY 列元素 DESC; 按列元素进行降序排列

III. SELECT * FROM 表名 ORDER BY 列元素1 ASC, 列元素2 DESC;

    --> 先按列元素1进行升序排列,若列元素1数据相同的,再按列元素2进行降序排序

7)聚合函数

I. COUNT
        SELECT COUNT(*) FROM 表名;   
--> 计算该表中所有列的记录的行数(如果某列的记录均为null,不计入)

II. MAX/MIN
        SELECT MAX(列元素) FROM 表名;
--> 查询该列元素最大值
        SELECT MIN(列元素) FROM 表名;
--> 查询该列元素最小值

III. SUM
        SELECT SUM(列元素) FROM 表名;
--> 查询该列元素的总和

IV. AVG
        SELECT AVG(列元素) FROM 表名;
--> 查询该列元素的平均值

8)分组查询

把记录使用某一列进行分组,然后查询组信息。
     例如:查看所有部门的记录数
        SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;
            --> 使用deptno分组,查询部门编号和每个部门的记录数
        SELECT job, MAX(SAL) FROM emp GROUP BY job;
            --> 使用job分组,查询每种工作的最高工资

组条件
以部门分组,查询每组记录数。条件为记录数大于3
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno HAVING COUNT(*) > 3;

9)limit 子句(方言)

LIMIT用来限定查询结果的起始行以及总行数

    例如:查询起始行为第5行,一共查询3行记录
            SELECT * FROM emp LIMIT 4, 3;
                --> 其中4表示从第5行开始,其中3表示一共查询3行。

一页的记录数:10行, 查询第3页
        SELECT * FROM emp LIMIT 20, 10;
            --> (当前页-1) * 每页记录数
                 (3 - 1)*10 , 10


练习题:

推荐阅读更多精彩内容