一、专业术语:
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 索引:使用索引可快速访问数据库表中的待定信息,索引是对数据库表中一列或多列的值进行排序的一种结构,类似于书籍的目录。
- 事务:是指作为单个逻辑工作单位执行的一系列操作,要么完全的执行,要么完全的不执行。
二、常用数据库命令
- 创建数据库
create database 数据库名称; - 删除数据库
drop database 数据库名称; - 查看数据库
show databases; - 使用数据库
use 数据库名; - 查看数据库当中有多少张表
show tables;
三、 SQL语言(核心知识点)
sql数据类型
- DDL(数据定义语言):用来定义数据库对象:创建库、表、列等。
- DML(数据库操作语言):用来操作数据库表中的记录。
- DQL(数据查询语言):用来查询数据。
- DCL(数据控制语言):用来定义访问权限和安全级别。
sql常用数据类型
| 类型 | 备注 |
|---|---|
| double | 浮点型,例如double(5,2)标识最多5位,其中必须有2位小数,即最大值为999.99 |
| char | 固定长度字符串类型,char(6) 'abc ' |
| varchar | 可变长度字符串类型:varchar(6) 'abc' |
| text | 字符串类型 |
| blob | 二进制类型 |
| date | 日期类型,格式为:yyyy-MM-dd |
| time | 时间类型,格式为:hh:mm:ss |
| datetime | 日期时间类型:yyyy-MM-dd hh:mm:ss |
DDL语句
| 作用 | 代码 |
|---|---|
| 创建数据库 | create database 数据库名 character set utf8; |
| 添加一列 | alter table 表名 add 列名 数据类型; |
| 查看表的字段信息 | desc 表名; |
| 修改一个表的字段类型 | alter table 表名 modify 字段名 数据类型; |
| 删除一行 | alter table 表名 drop 字段名; |
| 修改表名 | rename table 原始表名 to 要修改的表名; |
| 查看表的创建细节 | show create table 表名; |
| 修改表的字符集为gbk | alter table 表名 character set gbk;(字符集名称) |
| 修改表的列名 | alter table 表名 change 原始列名 新列名 数据类型; |
| 删除表 | drop table 表名; |
注意:每段代码后都有分号,一般情况下,系统的代码应该大写,咱自己写的代码应该小写,但是为了阅读方便,此出都用了小写。
DML语句
| 作用 | 代码 |
|---|---|
| 查询表中的所有数据 | SELECT * FROM 表名; |
| 插入操作 | INSERT INTO 表名(列名1, 列名2...) VALUES(列值1, 列值2...); |
| 批量插入 | INSERT INTO 表名(列名1, 列名2...) VALUES(列值1, 列值2...), (列值1, 列值2...); |
| 把所有学生的分数改为80 | UPDATE students SET score=80; |
| 把姓名为zs的学生分数改为60 | UPDATE students SET score=60 WHERE name='zs'; |
| 把姓名为ls的年龄改为20,分数改为70 | UPDATE students SET age=20,score=70 WHERE name='ls'; |
| 把wc的年龄在原来的基础上加1岁 | UPDATE students SET age=age+1 WHERE name='wc'; |
| 删除表中数据1 | DELETE FROM 表名 【WHERE 列名=值】;(表结构还在,删除后的数据可以找回) |
| 删除表中数据2 | TRUNCATE TABLE 表名;(把表直接drop掉,再创建一个同样的新表,删除数据不能找回,执行速度比DELETE快) |
注意:
- 插入操作时:
- 列名与列值的类型、个数、顺序要一一对应;
- 值不要超出定义的长度
- 插入的日期和字符一样,都是用引号括起来。
DQL语句
结果集:数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。通过查询语句查询出来的数据以表的形式展示我们称这个表为虚拟结果集,存放在内存中。
条件查询
条件查询:就是在查询时给出WHERE子句,在WHERE子句中可以使用一些运算符及关键字。
| 关键字 | 含义 |
|---|---|
| BETWEEN...AND | 值在什么范围 |
| IN(set) | 固定范围值 |
| IS NULL | 为空 |
| IS NOT NULL | 不为空 |
| AND | 与 |
| OR | 或 |
| NOT | 非 |
| =、!= | 等于、不等于 |
举例子
| 目的 | 代码 |
|---|---|
| 查询性别为男且年龄为20岁的学生记录 | SELECT * FROM students WHERE gender='男' AND age=20; |
| 查询学号为1001或者名为zs的记录 | SELECT * FROM students WHERE id='1001' OR name='zs'; |
| 查询学号为1001、1002、1003的记录 | SELECT * FROM students WHERE id IN('1001','1002','1003'); |
| 查询年龄为null的记录 | SELECT * FROM students WHERE age IS NULL; |
| 查询年龄在18到20岁之间的学生记录 | SELECT * FROM students WHERE age >= 18 AND age <= 20;或者SELECT * FROM studentds WHERE age BETWEEN 18 AND 20; |
| 查询性别非男的学生记录 | SELECT * FROM students WHERE gender != '男'; |
| 查询姓名不为null的学生记录 | SELECT * FROM students WHERE name IS NOT NULL; |
模糊查询
定义:根据指定的关键词进行查询;使用***LIKE***关键字后跟通配符;_:任意一个字符;%:任意0~n个字符
| 目的 | 代码 |
|---|---|
| 查询姓名由5个字符构成的学生记录 | SELECT * FROM students WHERE name LIKE '_____';(5个'_'表示5个任意字母) |
| 查询姓名由5个字符构成且第5个字母为's'的学生记录 | SELECT * FROM students WHERE name LIKE '____s'; |
| 查询姓名以‘m’开头的学生记录 | SELECT * FROM students WHERE name LIKE 'm%'; |
| 查询姓名中第2个字母为‘u’的记录 | SELECT * FROM students WHERE name LIKE '_u%'; |
| 查询姓名包含‘s’字母的学生记录 | SELECT * FROM students WHERE name LIKE '%s%'; |
字段控制查询
- 去除重复记录:
SELECT DISTINCT name FROM students; - 把查询字段的结果进行运算,必须都要是数据型
SELECT *,字段1+字段2 FROM 表名;- 列有很多记录的值为NULL,因为任何东西与NULL相加结果还是NULL,所以结算结果可能会出现NULL。
- 下面使用了把NULL转换成数值0的函数IFNULL:
SELECT *,age+INNULL(score,0) FROM students;
- 对查询结果起别名
SELECT *,yw+INNULL(SX,0) AS total FROM score;(total为新起的别名)
排序
使用关键字ORDER BY
- 升序:ASC
- 降序:DESC
| 目的 | 代码 |
|---|---|
| 对所有员工的薪水进行排序 | SELECT * FROM employee ORDER BY salary ASC; |
| 查询所有学生记录,按年两降序排序 | SELECT * FROM students ORDER BY age DESC; |
| 查询所有员工,按月薪降序排序,如果月薪相同时,按编号升序排序 | SELECT * FROM employee ORDER BY salary DESC, id ASC; |
聚合函数
| 函数 | 备注 |
|---|---|
| COUNT() | 统计指定列部位NULL的记录行数 |
| MAX() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算 |
| MIN() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算 |
| SUM() | 计算指定列的数值和,如果指定列不是数值类型,那么计算结果为0 |
| AVG() | 计算指定列的平均值,如果指定列不是数值类型,那么计算结果为0 |
举例子
| 目的 | 代码 |
|---|---|
| 查询employee表中的记录数 | SELECT COUNT(*) AS total_record FROM employee; |
| 查询员工表中有绩效的人数 | SELECT COUNT(performance) FROM employee; |
| 查询员工表中月薪大于2500的人数 | SELECT COUNT(*) FROM employee WHERE salary > 2500; |
| 统计月薪与绩效之和大于5000的人数 | SELECT COUNT(*) FROM employee WHERE salary + IFNULL(performance,0) > 5000; |
| 查询有绩效的人数和有管理费的人数 | SELECT COUNT(performance), COUNT(manage) FROM employee; |
| 查询所有雇员月薪和 | SELECT SUM(salary) FROM employee; |
| 查询所有雇员月薪和以及所有雇员的绩效和 | SELECT SUM(salary), SUM(performance) FROM employee; |
| 查询所有雇员月薪+绩效和 | SELECT SUM(salary+IFNULL(performance,0)) FROM employee; |
| 统计所有雇员平均工资 | SELECT AVG(salary) FROM employee; |
| 查询最高工资和最低工资 | SELECT MAX(salary), MIN(salary) FROM employee; |
分组查询
| 目的 | 代码 |
|---|---|
| 查询每个部门的部门名称和每个部门的工资和 | SELECT department,SUM(salary) FROM employee CROUP BY department; |
| 查询每个部门的部门名称和每个部门的人数 | SELECT department,COUNT(*) FROM employee GROUP BY department; |
| 查询每个部门的部门名称以及每个部门工资大于1500的人数 | SELECT department,COUNT(*) FROM employee WHERE salary > 1500 GROUP BY department; |
| 查询工资总和大于9000的部门名称以及工资和 | SELECT department,SUM(salary) FROM employee GROUP BY department HAVING SUM(salary) > 9000; |
| 查询工资大于2000的,工资总和大于6000的部门名称以及工资和(降序排列) | SELECT department,SUM(salary) FROM employee WHERE salary > 2000 GROUP BY department HAVING SUM(salary) > 6000 DESC; |
注意:having和where的区别
- having是在分组后对数据进行过滤;
- where是在分组前对数据进行过滤;
- having后面可以使用分组函数(统计函数);
- where后面不可以使用分组函数;
- WHERE是对分组钱记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组,而HAVING是对分组后数据的约束。
LIMIT
从第一页开始查 总共查5页
int curPage = 1;
int pageSize = 3;
SELECT * FROM employee LIMIT (curPage - 1)*pageSize, pageSize;(从第0页开始往后查)
数据的完整性
- 什么是数据的完整性: 保证用户输入的数据保存到数据库中时正确的。
- 如何添加数据的完整性: 在创建表时给表中添加约束
实体完整性
- 什么是实体完整性: 表中的一行(一条记录)代表一个实体(entity)。
- 实体完整性的作用: 标识每一行数据不重复,行级约束。
约束类型:
- 主键约束(primary key)
- 特点:每个表中要有一个主键,数据唯一且不能为null。
| 添加方式 |
|---|
| CREAT TABLE 表名(字段1 数据类型 primary key, 字段2 数据类型); |
| CREAT TABLE 表名(字段1 数据类型, 字段2 数据类型, primary key(要设置主键的字段)); |
| 联合主键: CREAT TABLE 表名(字段1 数据类型, 字段2 数据类型, primary key(主键1,主键2));两个主键数据同时相同时,才违反联合主键约束。 |
| ALTER TABLE student ADD CONSTRAINT PRIMARY KEY (id);(先创建表,再去修改表,添加主键) |
- 唯一约束(unique)
- 特点:指定列的数据不能重复,可以为空值
- 添加方式:
CREAT TABLE 表名(字段1 数据类型, 字段2 数据类型 UNIQUE);
- 自动增长列(auto_increment)
- 特点:指定列的数据自动增长;即使数据删除,还是从删除的序号继续往下。
- 添加方式:
CREAT TABLE 表名(字段1 数据类型 PRIMARY KEY AUTO_INCREMENT, 字段2 数据类型 UNIQUE);
域完整性
使用:
- 限制此单元格的数据正确,不对照此列的其他单元格比较;
- 域代表当前单元格。
域完整性约束
- 数据类型:数值类型、日期类型、字符串类型。
- 非空约束(not null)
CREATE TABLE 表名(字段1 数据类型 PRIMARY KEY AUTO_INCREMENT, 字段2 数据类型 UNIQUE not null);
- 默认值约束(default):插入时,values当中的值直接给default
CREATE TABLE 表名(字段1 数据类型 PRIMARY KEY AUTO_INCREMENT, 字段2 数据类型 UNIQUE not null default '男');
参照完整性
什么是参照完整性:
是指表与表之间的一种对应关系,通常情况下可以通过设置两表之间的主键、外键关系,或者编写两表的触发器来实现。有对应参展完整性的两张表格,在对他们进行数据插入、更新、删除的过程中,系统都会将被修改表格与另一张对应表格进行对照,从而阻止一些不正确的数据的操作。
特点:
- 数据库的主键和外键类型一定要一致;
- 连个表必须得要是innoDB类型;
- 设置参照完整性后,外键当中的内值,必须得是主键当中的内容;
- 一个表设置当中的字段设置为主键,设置主键的为主表:
CREAT TABLE student(sid int PRIMARY key, name varchar(50) not null, sex varchar(10) default '男');
- 创建表时,设置外键,设置外键的为子表
CREAT TABLE score(sid INT, score DOUBLE, CONSTRAINT fk_stu_score_sid FOREIGN KEY(sid) REFERENCES student(sid));