黑马程序员技术交流社区

标题: 【石家庄校区】数据库基础知识 [打印本页]

作者: Catherine.qing    时间: 2018-1-11 15:16
标题: 【石家庄校区】数据库基础知识
本帖最后由 小石姐姐 于 2018-1-12 10:35 编辑

数据库第一天(基础SQL语句)


数据库分类:常用前两个
MYSQL:数据库,开源免费
Oracle:收费大型数据库收购了Sun
DB2:银行
SQLServer:
SyBace:
SQLite:


类--表
列--类字段,成员变量
表中的每行数据---对象


启动一下这三条指令要用用管理员身份,在任务栏右击任务管理器
scrvices.mse回车
启动:net start mysql
停止:net stop mysql


mysql -uroot -p123456


DDL定义语言
DML操作语言
DCL控制语言
DQL查询语言


SQL语句不区分大小写,建议关键字大写,自定义的用小写
一条SQL可以单行或者多行,结尾以分号结尾;
字符串和日期用单引号,一定要用,要不然会错!


注释用/**/多行
-- 是单行注释或者#也是单行


SQL通用语法


可变字符型:
int 整型                double 浮点数                date 日期类型        格式"yyyy-MM-dd"
varchar 字符串型,存储空间可变,可自动调整,效率低些
char 存储空间不可变字符串型,不能开辟储存空间,效率高,可能会浪费空间


creat database 数据库名;
show database;
drop database abc;
show databases;


* 约束:
        * constraint
        * 作用: 就是对列中记录的值进行限制, 如果插入的数据不符合约束规则, 则该操作会被立刻终止
* 扩展:
        * 约束的种类:
                * **主键约束**: `PRIMARY KEY`, 限制该列的记录值不能为空且唯一(不能重复), 相当于同时设定了`NOT NULL`和`UNIQUE`
                * **自增约束**: `AUTO_INCREMENT`, 设置该列的记录值可以自动增加
                        * 默认从几开始? 1
                        * 能用于什么类型? 只能用于数字类型(如INT, DOUBLE, 小数1.23自增后是2)
                * 外键约束: `FOREIGN KEY`, 主要是连接另一个表的主键
                * 非空约束: `NOT NULL`, 限制该列的记录值不能为空
                * 唯一约束: `UNIQUE`, 唯一, 限制该列的记录值不能重复
                * 检查约束: `CHECK (条件)`, 限制该列插入的记录值是否符合要求
                * 默认值约束: `DEFAULT 值`, 限制该列记录如果没有插入值, 则使用默认值


CREATE TABLE 表名 (
  列名 数据类型(长度) 约束,
  列名2 数据类型(长度) 约束,
  ...
  列名n 数据类型(长度) 约束
);


// VARCHAR和CHAR一般需要手动指定长度, 日期数字等其他类型有默认长度一般不需要指定


* 列出当前数据库的所有表
        * `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 表名 (列名) values (值)
2.insert into 表名 (列名) values (全列值)


* 插入记录格式2: 不指定主键, 让其自增
        * 当设置了主键自增后, 插入记录时可以不考虑主键字段的值. 即字段名和值都没有主键这一列. 同时可以避免产生主键重复的错误
        * 该方式适用于设置了主键自增(AUTO_INCREMENT)的情况


```sql
INSERT INTO 表名
(非自增列名1, 非自增列名2, ..., 非自增列名n)
VALUES
(值1, 值2, ..., 值n);
```




* 插入记录格式3: 不指定列名, 给所有列添加值
        * 不指定列名, 为所有列添加值
        * 该方式适用于为所有列添加值, 可以省去写列名. 但**不能省略主键**


```sql
INSERT INTO 表名
VALUES
(值1, 值2,...,值n);
```


*4: 批量插入记录:
        * 适用于批量插入记录
        
```sql
INSERT INTO 表名
(列1, 列2)
VALUES
(记录1值1, 记录1值2),
(记录2值1, 记录2值2);


INSERT INTO 表名
VALUES
(记录1值1, 记录1值2),
(记录2值1, 记录2值2);


* 条件查询:
        * 即按指定条件查询记录返回符合条件的结果集, 使用`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`: 非空
                * 日期也是可以比较的
ALTER TABLE test ADD COLUMN c INT NOT NULL FIRST


数据库第二天(高级SQL语句与JDBC)


order by [desc] [asc]降序或者升序排列


使用聚合函数查询计算
count 求和,对表中单位数据的个数求和,count(列名)
-- 查询统计账务表中一共多少条数据
注意:函数和括号中间不能有空格!!!!
SELECT COUNT (*) AS 'count' FROM zhangwu;




-- sum 求和函数,对以列中的函数求和计算sum(列名)
-- 对账务表查询,对所有金额求和计算
SELECT SUM(zmoney) FROM zhangwu;




-- 求和,统计所有支出的金额
SELECT SUM(zmoney) FROM zhangwu WHERE zname LIKE '%支出%';
INSERT INTO zhangwu(zname) VALUES ('彩票支出');
DELETE FROM zhangwu WHERE zname='彩票';


-- max 函数,对某列数据获取最大值
SELECT MAX(zmoney) FROM zhangwu;


-- avg 函数,计算一个列的所有数据的平均值
SELECT AVG(zmoney) FROM zhangwu;


分组查询:
group by 被分组的列名必须跟随聚合函数
select 查询的时候,被分组的列,要出现在select选择列的后面


-- 对zname内容进行分组查询求和,但是只是要支出
SELECT SUM(zmoney)AS 'getsum',zname FROM zhangwu WHERE zname LIKE '%支出%'
GROUP BY zname
ORDER BY 'getsum' DESC;


-- 对zname内容进行分组查询求和,但是只要支出,显示金额大于5000
-- 结果集是分组查询后,再次进行筛选,不能使用where,分组后再次过滤用having
SELECT SUM(zmoney) AS 'getsum',zname FROM zhangwu  WHERE zname LIKE '%支出%'
GROUP BY zname HAVING getsum>5000;


注意:分组和排序都要放在查询的后面


**having与where的区别
having是分组以后进行过滤
where是分组前对数据进行过滤
having后面可以用分组函数
where后面不可以使用分组函数


select,from---where---group by---having---order by
SELECT SUM(zmoney) AS 'getsum',zname FROM zhangwu WHERE zname LIKE'%支出%'
-- 先分组,有条件加having
GROUP BY zname HAVING getsum>5000
-- 后排序
ORDER BY getsum DESC;


* 注意:
        * 聚合函数与分组的使用效果
                * 使用聚合函数后再进行分组, 才相当于汇总统计
                        * `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条件中可以使用表的所有列名






JDBC开发的步骤
        1.注册驱动---固定步骤
                告知JVM使用的是那个数据库的驱动
        2.获得连接---固定步骤
                使用JDBC中的类,完成对MYSQL数据库的连接
        3.获得语句执行平台---固定步骤
                通过连接对象获取对SQL的执行者对象
        4.执行SQL语句
                使用执行者对象,向数据库执行SQL语句
                获取到数据库的执行后的结果
        5.处理结果
        6.释放资源---固定步骤
                调用一堆close()









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