黑马程序员技术交流社区

标题: 【石家庄校区】XML,SQL语句,JDBC阶段笔记 [打印本页]

作者: ...句号    时间: 2018-1-11 15:47
标题: 【石家庄校区】XML,SQL语句,JDBC阶段笔记
本帖最后由 小石姐姐 于 2018-1-12 11:21 编辑

SQL语句,JDBC阶段笔记
SQL语句介绍和分类:
                        用于操作数据库的代码
                分类:
                        DDL:数据定义语言,用来定义数据库对象(库,表等)
                                CREATE  ALTER  DROP
                        DML:数据操作语言,对表中的记录进行增删改
                                INSERT  DELETE  UPDATE
                        DQL:数据查询语言,对表中的记录进行查寻
                                SELECT  FROM  WHERE
                        DCL:数据控制语言,常见修改用户,权限
                        
        SQL通用语法
                特点:
                SQL语句可以单行或多行书写,一条语句的结尾必须以;结尾        
                不区分大小写(默认情况数据也不区分大小写)
                SQL语句的单词之间通过空格分隔,参数之间使用,逗号分隔
                字符串和日期要使用''单引号或""双引号包括,推荐单引号
        SQL注释
                单行注释:
                        #单行注释
                        -- 单行注释(有空格)
                多行注释:
                        /*注释内容*/
               
        常用数据类型:
                        INT:整数
                        DOUBLE:浮点数(小数)
                        VARCHAR:存储空间是可变的,可变长度字符
                        CHAR:存储空间固定的,固定长度字符
                        DATE:
数据库的操作:
        创建数据库:
                CREATE DATABASE 库名;
        删除指定数据库:
                DROP DATABASE 库名;
        查看所有数据库:
                SHOW DATABASES;
               
数据库中创建数据表:
                创建表的操作必须要先使用一个数据库:USE 库名;
        格式:
                CREATE TABLE 表名(
                列名1 数据类型 约束,
                列名2 数据类型 约束,
                列名3 数据类型 约束
                );
                // VARCHAR和CHAR一般需要手动指定长度, 日期数字等其他类型有默认长度一般不需要指定
        * 约束:
        * constraint
        * 作用: 就是对列中记录的值进行限制, 如果插入的数据不符合约束规则, 则该操作会被立刻终止
* 扩展:
        * 约束的种类:
                * **主键约束**: `PRIMARY KEY`, 限制该列的记录值不能为空且唯一(不能重复), 相当于同时设定了`NOT NULL`和`UNIQUE`
                * **自增约束**: `AUTO_INCREMENT`, 设置该列的记录值可以自动增加
                        * 默认从几开始? 1
                        * 能用于什么类型? 只能用于数字类型(如INT, DOUBLE, 小数1.23自增后是2)
                * 外键约束: `FOREIGN KEY`, 主要是连接另一个表的主键
                * 非空约束: `NOT NULL`, 限制该列的记录值不能为空
                * 唯一约束: `UNIQUE`, 唯一, 限制该列的记录值不能重复
                * 检查约束: `CHECK (条件)`, 限制该列插入的记录值是否符合要求
                * 默认值约束: `DEFAULT 值`, 限制该列记录如果没有插入值, 则使用默认值
* 列出当前数据库的所有表
        * `SHOW TABLES;`
* 查看表的结构
        * `DESC 表名;`: desc=description描述
* 删除表
        * `DROP TABLE 表名;`


        
* 修改表的结构
        * 格式: `ALTER TABLE 表名 操作关键字 列名 数据类型 约束;`
                * 操作关键字
                        * `ADD`: 增加列.
                                * `ALTER TABLE 表名 ADD 新列名 数据类型 约束;`
                        * `MODIFY`: 修改指定列的数据类型和约束(不能修改列名).
                                * `ALTER TABLE 表名 MODIFY 要修改的列名 新数据类型 新约束;`
                        * `CHANGE`: 修改指定列的列名+数据类型+约束.
                                * `ALTER TABLE 表名 CHANGE 旧列名 新列名 新数据类型 新约束;`
                        * `DROP`: 删除列.
                                * `ALTER TABLE 表名 DROP 列名;`
* 修改表名
        * 格式: `RENAME TABLE 旧表名 TO 新表名;`   


向数据表中添加数据
        添加数据格式1:
                insert into 表名(列名1,列名2,列名3) values (值1,值2,值3);
        添加数据格式2,不考虑主键
                格式:
                        insert into 表名(列名) values (值);
        添加数据格式3,所有值都给出
                格式:
                        insert into 表名 values (全列值);
        添加数据格式4,批量写入
                格式:
                        insert into 表名 (列名1,列名2,列名3) values
                        (值1,值2,值3),
                        (值1,值2,值3),...
                        
修改(更新)数据表中的数据(记录)
        格式:
                update 表名 set 列1=值1,列2=值2 where 条件;
                where 条件:数据中的唯一性
               
                        
删除指定记录
        格式:
                delete form 表名 where 条件
        清空表格式:
                truncate table 表名
        
解决命令行乱码问题:
        # 将数据库数据修改为Windows的GBK
        SET NAMES 'GBK';  
        
        
数据的基本查询:
        查询指定字段
                SELECT 列名1, 列名2 FROM 表名;
        查询所有字段
                SELECT * FROM 表名;
        DISTINCT去重
                SELECT DISTINCT 列名1, 列名2 FROM 表名;
        AS给字段取别名
                SELECT 列名 AS 别名 FROM 表名;
        对查询结果进行数学计算
                SELECT 列名+值 FROM 表名;  


* 条件查询:
        * 即按指定条件查询记录返回符合条件的结果集, 使用`SELECT`和`WHERE`组合
* `WHERE`:
        * 作用: 条件子句, 过滤符合条件的结果
        * 运算符
                * 比较运算符
                        * `=`: 相等
                        * `<>`或`!=`: 不等
                        * `>`: 大于
                        * `<`: 小于
                        * `>=`: 大于等于
                        * `<=`: 小于等于
                        * `BETWEEN...AND...`: 在一个范围内(包含头和尾), `BETWEEN 0 AND 10;` 0~10
                                * 如:
                        * `IN ()`: 在列表中, 满足列表中一个即可
                                * 如: `IN (1, 3, 5)`
                        * `IS NULL`: 是空
                        * `LIKE 通配符`: 模糊查询
                                * 通配符种类
                                        * `%`: 一个百分号可以表示任意个字符. 比如`王%`, `王大锤`, `王五`
                                        * `_`: 一个下划线可以表示一个字符. 比如`王_`, 只能匹配`王五`
                * 逻辑运算符
                        * `AND`: 与. 两边条件同时成立才成立
                        * `OR`: 或. 两边条件只要有一个成立就成立
                        * `NOT`: 非, 取相反结果
                                * `NOT BETWEEN ... AND ...`: 不在范围内
                                * `NOT IN`: 不在列表中
                                * `NOT LIKE`: 不匹配
                                * `IS NOT NULL`: 非空
                * 日期也是可以比较的
        
排序查询:对已有的结果进行排序
        select * from 表名 order by 列名1 desc/asc,列名2 desc/asc;
        desc 降序
        asc  升序(默认)
        注意: `WHERE`和`ORDER BY`的顺序
                WHERE`在前, `ORDER BY`在后, 否则报错
                因为是排序是对SELECT查询出的结果集再次进行排序, 而不是对表中的数据进行排序. 所以要先把SELECT WHERE的查询结果拿到, 才能使用ORDER BY排序
        
聚合函数:
                作用:竖向对某一列的值进行计算,然后返回一个计算结果
                格式:select 函数名(列名) from 表名...;
        常用的5个聚合函数
                COUNT(列名)`: 计算指定列的记录行数.
                注意: 值为NULL的记录不会被统计
                SUM(列名)`: 计算指定列的数值总和
                如果数据类型不是数值, 则结果为: 0
                MAX(列名)`: 获取指定列的数值中的最大值
                MIN(列名)`: 获取指定列的数值中的最小值
                AVG(列名)`: 计算指定列的数值中的平均值
                如果数据类型不是数值, 则结果为: 0
                
分组查询:
                * 格式:
                * `GROUP BY 列名 HAVING 条件`,
                * `SELECT ... FROM ... WHERE ... GROUP BY 列名 HAVING 条件;`
                * `HAVING`的作用: 可选, 对查询结果进行分组显示后, 再次按条件过滤               
最终一个完整的SELECT语句格式               
        SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... DESC;
        
JDBC:
        JDBC操作数据库的步骤:
                1.注册驱动
                        告知JVM实用的是哪一个数据库的驱动
                        DriberManger.registerDriver():是真实的注册驱动的方法
                        因为驱动中实现了这个方法,推荐我们使用:
                                Class.forName("数据库驱动的Driver实现类的全类名")
                2.获得链接
                        使用JDBC中的类,完成对MySQL数据库的连接
                        获取连接
                                Connection conn = DriverManager.getConnection(url,username,password)
                                url`: 数据库地址, `jdbc:mysql://主机IP:端口号/数据库名
                                        主机IP或端口号可以省略, 默认使用localhost和3306: `jdbc:mysql:///day02_04
                3.获得语句执行平台
                        通过连接对象获取对SQL语句的执行者对象
                                Statement s = conn.creatStatement(); 不安全的
                                PrepardStatement ps = conn.prepareStatement(String sql):创建预编译对象
                                PreparedStatement`接口
                                        void setObject(int paramIndex, Object value)`: 设置指定占位符的值
                                        注意: 索引从1开始
                                        SQL语句中的参数使用`?`问号占位符代替, 且不要写单引号
                                        int executeUpdate()`: 执行INSERT, DELETE, UPDATE语句, 返回生效的行数
                                        注意该方法不要传递参数
                                        ResultSet executeQuery()`: 执行SELECT查询语句, 返回结果集
                                        注意该方法不要传递参数
                4.执行SQL语句
                        使用执行者对象, 向数据库执行SQL语句, 并获取执行结果
                        Statement
                                        增删改: `int s.executeUpdate(String sql)`
                                                判断操作是否成功: 判断返回值是否`>0`则生效, 否则不成功
                                        查: `ResultSet rs = s.executeQuery(String sql)`
                                                思考: 判断操作是否成功: 是返回null呢还是调用`.next()`用是否为true判断?
                                PreparedStatement
                                        增删改: `int ps.executeUpdate();`
                                                判断操作是否成功: 判断返回值是否`>0`则生效, 否则不成功
                                        查: `ResultSet rs = ps.executeQuery();`
                5. 处理结果
                        根据项目的业务需求对结果进行操作
                        `ResultSet`接口
                                boolean next()`: 将结果集的指针向下移动一行, 并返回是否还有下一条记录
                                        注意: 没有调用该方法之前, ResultSet的光标在第一条记录之前, 只有调用一次next方法后, 指针才指向第一条记录
                                boolean next();`: 将指针向后移动, 如果有下一个记录则true, 否则false
                                                默认不执行的之后, 指针在第一条记录之前; 只有调用一次才能指向第一条: `while (rs.next()) {}`
                                        String getString(String 列名)`: 获取指定列的值, 以String类型
                                        Object getObject(String 列名)`: 获取指定列的值, 以Object类型
                                void close()`: 释放结果集资源
                6. 释放资源
                        释放数据库连接, 必须
                        resultSet.close()`
                                preparedStatement.close()`
                                statement.close()`
                                connection.close()`        


作者: Yin灬Yan    时间: 2018-1-15 16:37
我来占层楼啊   




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