黑马程序员技术交流社区

标题: 【石家庄校区】SQL的一些总结 [打印本页]

作者: gaohanlong    时间: 2018-1-11 15:29
标题: 【石家庄校区】SQL的一些总结
本帖最后由 小石姐姐 于 2018-1-12 10:55 编辑

【石家庄校区】SQL的一些总结

* 数据库
    * 数据库的概念: 存储数据的仓库. 本质是一个文件系统, 数据按照指定的格式将数据存储起来, 用户可以对数据库中的数据进行增删改查
    * DBMS: Database Management System, 数据库管理系统. 是操作和管理数据库的大型软件, 用于建立, 使用和维护数据库, 对数据库进行统一管理和控制, 以保证数据库的安全性和完整性. 用户通过数据库管理系统访问数据库中表内的数据
    * 常见数据库
        * `MySQL`
        * `Oracle`
    * 数据库: 存储数据表
    * 数据表: 存储记录
        * 由行和列组成的
    * DBMS: 操作数据库
    * 表和Java类的对应关系
        * 表名: Java类名
        * 列名: 成员属性名
        * 记录: 类对象
* MySQL
    * 安装
    * 配置和遇到的问题
    * 命令行的登录和退出
        * 登录: `mysql -u 用户名 -p`
        * 退出: `exit`
* SQL基本语言
    * SQL的概念: Structured Query Language, 结构化查询语言
        * 结构: 数据表是由行和列组成的, 是有结构的, 从这种结构中查询
    * SQL的4中分类
        * DDL: Data Defination Language, 数据定义语言, 用来定义数据库对象(库, 表等)
            * CREATE
            * ALTER
            * DROP
        * DML: Data Manipulation Language, 数据操作语言, 对表中的记录进行增, 删, 改
            * INSERT
            * UPDATE
            * DELETE
        * DQL: Data Query Language, 数据查询语言, 对表中的记录进行查
            * SELECT
            * FROM
            * WHERE
        * DCL: Data Control Language, 数据控制语言, 创建修改用户, 权限
    * SQL特点
        * SQL不区分大小写
        * 一条SQL语句以`;`分号结尾, 一条语句可以多行书写
        * 单词之间通过空格分隔, 参数之间通过`,`逗号分隔
        * 字符串和日期要用`''`或`""`引起来, 建议单引号
    * SQL注释(2+1种)
        * 2种单行注释
            * `#单行注释`
            * `-- 单行注释`: 减号后必须有一个空格
        * 1种多行注释: `/* 注释内容 */`
    * SQL的数据类型
        * `INT`: 整数
        * `DOUBLE`: 小数
        * `VARCHAR`: 可变长度字符
        * `CHAR`: 固定长度字符
        * 其他看文档
        * VARCHAR和CHAR的区别:
            * VARCHAR(200), 可变长度字符, 存储占用的内存空间是可变的, 如果你的数据容量小于我们指定的空间大小, 那么就会按照实际的数据空间来开辟内存大小
                * 优点: 节省内存
                * 缺点: 因为每次存入数据时都会判断数据的实际大小, 来动态修改内存空间, 所以需要占用资源, 效率低
            * CHAR(200), 固定长度字符, 存储占用的内存空间是不可变的. 无论实际存入的数据容量是多大, 都占用这么大的空间
                * 优点: 插入数据时不需要额外操作, 效率高
                * 缺点: 可能会浪费空间
    * SQL对库的操作
        * 创建库
            * 使用默认字符集创建库: `CREATE DATABASE 库名;`
                * 默认是UTF-8编码
            * 指定字符集: `CREATE DATABASE 库名 CHARACTER SET '字符集';`
        * 删除库
            * `DROP DATABASE 库名;`
        * 查看所有库
            * `SHOW DATABASES;`
        * 使用库
            * `USE 库名;`
        * 查看当前使用的库
            * `SELECT DATABASE();`
    * SQL对表的操作
        * 创建表: `CREATE TABLE 表名 (列名1 数据类型 约束, 列名2 数据类型 约束);`
        * 删除表: `DROP TABLE 表名;`
        * 查看当前库中的所有表: `SHOW TABLES;`
        * 修改表的结构: `ALTER TABLE 表名 操作关键字 列名 数据类型 约束;`
            * 增加列: `ALTER TABLE 表名 ADD 新列名 新数据类型 新约束;`
            * 删除列: `ALTER TABLE 表名 DROP 列名;`
            * 修改列的数据类型和约束(不能修改列名): `ALTER TABLE 表名 MODIFY 列名 新数据类型 新约束;`
            * 修改列的列名, 数据类型, 约束: `ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 新约束;`
        * 修改表名: `RENAME TABLE 旧表名 TO 新表名;`
    * SQL对记录的操作
        * 增
            * 一次插入一条记录: `INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2);`
            * 一次性插入一条记录(省略自增主键): `INSERT INTO 表名 (非主键自增列1, 非主键自增列2) VALUES (值1, 值2);`
            * 一次插入所有列的记录(省略列名): `INSERT INTO 表名 VALUES (值1, 值2);`
                * 值的数量和顺序必须和表的列一致
            * 一次插入多个记录(指定列): `INSERT INTO 表名 (列1, 列2) VALUES (记录1值1, 记录1值2), (记录2值1, 记录2值2);`
            * 一次插入多个记录(省略列): `INSERT INTO 表名 VALUES (记录1值1, 记录1值2), (记录2值1, 记录2值2);`
        * 删
            * 删除符合条件的记录: `DELETE FROM 表名 WHERE 条件;`
            * 删除所有记录: `DELETE FROM 表名;`
            * 清空表: `TRUNCATE TABLE 表名;`
            * `DELETE FROM 表名;`和`TRUNCATE TABLE 表名;`的区别
                * DELETE, 逐条删除记录, 不会重置自增计数器
                * TRUNCATE, 删除表再重建, 会重置自增计数器
        * 改
            * 修改符合条件的记录: `UPDATE 表名 SET 列名1=新值, 列名2=新值 WHERE 条件;`
            * 修改所有记录: `UPDATE 表名 SET 列名1=新值, 列名2=新值;`
        * 查
            * 查询指定列: `SELECT 列名1, 列名2 FROM 表名;`
            * 查询所有列: `SELECT * FROM 表名;`
            * 条件查询: `SELECT 列名1, 列名2 FROM 表名 WHERE 条件;`
                * 运算符
                    * 比较运算符
                        * `=`: 相等
                        * `<>`或`!=`: 不等
                        * `>`: 大于
                        * `<`: 小于
                        * `>=`: 大于等于
                        * `<=`: 小于等于
                        * `BETWEEN...AND...`: 在一个范围内(包含头和尾)
                            * 如: BETWEEN 0 AND 10
                        * `IN ()`: 在列表中, 满足列表中一个即可
                            * 如: IN (1, 3, 5)
                        * `IS NULL`: 是空
                        * `LIKE 通配符`: 模糊查询
                            * `%`: 一个百分号可以表示任意个字符. 比如'王%', 王大锤, 王五
                            * `_`: 一个下划线可以表示一个字符. 比如'王_', 只能匹配王五
                    * 逻辑运算符
                        * `AND`: 与. 两边条件同时成立才成立
                        * `OR`: 或. 两边条件只要有一个成立就成立
                        * `NOT`: 非, 取相反结果
                            * `NOT BETWEEN ... AND ...`: 不在范围内
                            * `NOT IN`: 不在列表中
                            * `NOT LIKE`: 不匹配
                            * `IS NOT NULL`: 非空
            * 去重:     `SELECT DICTINCT 列名1, 列名2 ... FROM 表名 WHERE 条件;`
            * 别名:
                * `字段名 AS 别名`
                * `表名 AS 别名`
* 高级SQL
    * 排序
        * `ORDER BY 列名 ASC|DESC;`
        * 注意:
            * 默认顺序为升序
            * WHERE在前, ORDER BY在后
    * 聚合函数
        * 用在`SELECT`后或`HAVING`后
        * `COUNT(列名)`: 计算记录数量
            * NULL值不会被算入数量
        * `SUM(列名)`: 将该列的值求总和
            * 如果不是数字类型, 则结果为0
        * `MAX(列名)`: 求该列值中的最大值
        * `MIN(列名)`: 求该列值中的最小值
        * `AVG(列名)`: 求该列所有值的平均值
            * 如果不是数字类型, 则结果为0
    * 分组
        * `GROUP BY 列名 HAVING 条件;`: 对查询结果集分组, 然后再按条件过滤
        * 注意:
            * 分组查询中GROUP BY后的列不一定必须是SELECT选择的列, 即使SELECT后没有, 也可以分组
            * HAVING条件中的列名必须是SELECT条件或GROUP BY条件中使用过的字段
            * 聚合函数后进行分组相当于汇总统计
                * SELECT zname, SUM(zmoney) FROM zhangwu GROUP BY zname;
            * 不跟随聚合函数, 则只有第一条记录的值
                * SELECT zname, zmoney FROM zhangwu GROUP BY zname;
        * HAVING和WHERE的区别
            * 过滤时机不同
                * WHERE是在分组前对结果进行过滤
                * HAVING是在分组后对结果进行再次过滤
            * 是否可跟随聚合函数不同
                * WHERE后不可使用聚合函数
                * HAVING后可以使用聚合函数
            * 条件可用字段不同
                * HAVING条件中的字段必须是SELECT条件或GROUP BY条件中使用过的字段
                * WHERE条件中可以使用表的所有字段





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2