2020年2月28日
数据库概述
- 数据库(DataBase:DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。(文件系统)是存储,维护和管理数据的集合
- 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。
数据库与数据库管理系统的关系
数据库服务器,数据库和表的关系
SQL
特点:
高度非过程化,即用SQL操作数据库,只需要指出“做出来”,无须指明“怎么做”,存取路径的选择和操作的执行由DBMS自动完成。
分类:
- DDL : 数据定义语言,用来定义数据库对象:库,表,列等等
- DML : 数据操作语言,用来操作数据库表中的记录
- DQL : 数据查询语言,用来查询记录
- DCL : 数据控制语言,用来定义访问权限和安全级别
DDL
-
创建数据库:CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification[,create_specification]…]
列子:- 创建mydb1数据库 语句:
CREATE DATABASE mydb1;
结果:
- 创建使用gbk字符集的mydb3数据库 语句:
create database mydb3 character set gbk;
结果:
- 创建使用gbk字符集的并带校对规则的mydb4数据库 语句:
Create database mydb4 character set gbk COLLATE gbk_chinese_ci;
结果:
- 创建mydb1数据库 语句:
-
查看数据库:show
例子:
1. 显示数据库语句:show databases;
2. 显示数据库创建语句:show create database mydb3;
-
删除数据库:drop database db_name;
例子:
1.drop database mydb4;
-
修改数据库:ALTER DATABASE db_name[alter_specification…]
例子:alter database mydb3 character set utf8;
-
使用数据库:
use db_name;
-
查看当前使用的数据库:
select database();
-
操作数据表:
1. 创建表:
create table 表名(
字段1 字段类型,
字段2 字段类型,
字段3 字段类型,
…
);
常用数据类型:
int:整型
double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小 数,即最大值为999.99;
char:固定长度字符串类型; char(10) 'abc ’
varchar:可变长度字符串类型;varchar(10) ‘abc’
text:字符串类型;(可以存大数据的文本)
blob:字节类型;(存储图片,视频,音频)
date:日期类型,格式为:yyyy-MM-dd;
time:时间类型,格式为:hh:mm:ss
timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值
datetime:日期时间类型 yyyy-MM-dd hh:mm:ss例子:
创建一个员工表
代码:
create table emp(
id int,
name varchar(50),
gender varchar(10),
birthday date,
entry_date date,
job varchar(100),
salary double,
resume varchar(200)
);- 查看当前数据库中所有的表:show tables;
- 查看表的字段信息:desc 表名;
- 在表中添加一个列:alter table 表名 add 字段1 字段类型;
- 修改表中的列:alter table 表名 modify job(列表名) varchar(60)(要修改字段属性);
- 删除表中的列:alter table 表名 drop 列表名;
- 表改名:rename table 表名 to 新表名;
- 查看表的创建信息:SHOW CREATE TABLE表名;
- 修改表的字符集为gbk:ALTER TABLE 表名 CHARACTER SET gbk;
- 列名name修改为username:ALTER TABLE 表名 CHANGE name username varchar(100);
- 删除表:DROP TABLE 表名 ;
DML(*)
是对表中的数据进行增,删,改的操作。
ps:在mysql中,字符串类型和日期类型都要用单引号括起来。‘tom’ ‘2015-09-04’,空值:null
- 查询表中所有的数据:
select * from 表名;
- 插入操作:INSERT
语法:INSERT INTO 表名(列名1,列名2,…) values(列值1,列值2,…)
列名与列值的类型个数顺序要一 一对应。
练习:
向员工表中插入数据
代码:
INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');
练习批量复制:
代码:
INSERT INTO emp VALUES
(4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
(5,'li','m','2015-09-01',10000,'2015-09-01',NULL),
(6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);
- 修改操作 UPDATE :
语法:UPADTE 表名 SET 列名1=列值1,列名2=列值2 …WHERE 列名=值
练习:
1. 将所有员工薪水修改为5000元。
代码:update emp set salary = 5000;
2. 将姓名为’zs’的员工薪水修改为3000元。
代码:update emp set salary = 3000 where name = 'zhangsan';
- 删除操作 DELETE
语法:DELETE FROM 表名 【WHERE 列名=值】
练习:
1. 删除表中名称为‘zhangsan’的记实
代码:delete from emp where name = 'zhangsan';
2. 删除表中所有的记录:
代码:delete from emp;
3. 使用truncate删除表中记录。
代码:TRUNCATE TABLE emp;
DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。
删除的数据不能找回。执行速度比DELETE快。
DQL操作
DQL数据查询语言 (重要)
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果集给客户端。查询返回的结果集是一张虚拟表。
查询关键字:SELECT
语法: SELECT 列名 FROM表名
【WHERE --> GROUP BY -->HAVING–> ORDER BY】
语法:
SELECT selection_list /要查询的列名称/
FROM table_list /要查询的表名称/
WHERE condition /行条件/
GROUP BY grouping_columns /对结果分组/
HAVING condition /分组后的行条件/
ORDER BY sorting_columns /结果分组/
LIMIT offset_start, row_count /结果限定/
练习:
- 基础查询
1. 查询所有列
代码:select * from stu;
2. 查询指定列表
代码:select sid,sname,age from stu;
- 条件查询
条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:
=、!=、<>(跟 != 等价)、<、<=、>、>=;
BETWEEN…AND;
IN(set);()括号里跟多个值
IS NULL(表示空值); IS NOT NULL (表示非空值)
AND;与
OR;或
NOT;非
1. 查询性别为女,并且年龄小于50的记录
代码:select * from stu where gender='female' and age<50;
2. 查询学号为S_1001,或者姓名为liSi的记录
代码:select * from stu where sid = 'S_1001' or sname = 'liSi';
3. 查询学号为S_1001,S_1002,S_1003的记录
代码:select * from stu where sid in ('S_1001','S_1002','S_1003');
4. 查询学号不是S_1001,S_1002,S_1003的记录
代码:select * from stu where sid not in ('S_1001','S_1002','S_1003');
5. 查询年龄为null的记录
代码:select * from stu where age is NULL;
6. 查询年龄在20到40之间的学生记录
代码:select * from stu where age>=20 and age <= 40;
代码:select * from stu where age between 20 and 40;
7. 查询性别非男的学生记录
代码:select * from stu where gender = 'female';
代码:select * from stu where gender != 'male';
代码:select * from stu where gender <> 'male';
代码:select * from stu where not gender = 'male';
代码:select * from stu where gender not in ('male');
8. 查询姓名不为null的学生记录
代码:select * from stu where sname is not null;
代码:select * from stu where not sname is null;
- 模糊查询
当想查询姓名中包含a字母的学生时就需要使用模糊查询了。模糊查询需要使用关键字LIKE。
通配符:
_ 任意一个字符
%:任意0~n个字符
‘%张%’ ‘张_’
练习:
1. 查询姓名由5个字母构成的学生记录
代码:select * from stu where sname like '_____';
2. 查询姓名由5个字母构成,并且第5个字母为“i”的学生记录
代码:select * from stu where sname like'____i';
3. 查询姓名以“z”开头的学生记录
代码:select * from stu where sname like 'z%';
4. 查询姓名中第2个字母为“i”的学生记录
代码:select * from stu where sname like '_i%';
5. 查询姓名中包含“a”字母的学生记录
代码:select * from stu where sname like '%a%';
- 字段控制查询
1. 去除重复记录
去除重复记录(两行或两行以上记录中系列的上的数据都相同)想去除重复记录,需要使用DISTINCT:
练习:
查询性别(使用DISTINCT):
代码:select distinct gender from stu;
2. 查询的和运算
当两个字段都是同一个数值类型,可以做加运算
练习:
查询雇员的月薪与佣金之和
代码:SELECT *,sal+comm FROM emp2;
3. 给新的列名加别名
练习:
查询雇员的月薪与佣金之和
代码:SELECT *,sal+comm as total FROM emp2;
代码:SELECT *,sal+comm total FROM emp2;
(也可以将as省去)
4. ifnull 过滤空值
为了更加美观
练习:
将comm中的null改成0
代码:select *,ifnull(comm,0) from emp2; - 排序 order by 列名 asc(默认) desc
asc是升序,desc是降序,其中asc是默认的
练习:
1. 查询所有学生记录,按年龄升序排序
代码:select * from stu order by age asc;
2. 查询所有学生记录,按年龄降序排序
代码:select * from stu order by age desc;
3. 查询所有雇员,按月薪降序排序,如果月薪相同时,按编号升序排序
代码:SELECT * FROM emp2 order by sal desc,empno asc;
- 聚合函数 sum avg max min count
聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
1. count():当需要纵向统计时可以使用COUNT()
练习:
1. 查询stu表中记录数:
代码:select count(*) as cnt from stu;
2. 查询emp2表中有佣金的人数:
代码:select count(comm) as count from emp2 where comm is not null;
代码:SELECT COUNT(comm) cnt FROM emp2;
(只要不是null就计算)
3. 查询emp2表中月薪大于2500的人数:
代码:select count(sal) cnt from emp2 where sal>2500;
4. 统计月薪与佣金之和大于2500元的人数:
代码:select count(*) cnt from emp2 where sal+ifnull(comm,0)>2500;
5. 查询有佣金的人数,有领导的人数:
代码:select count(comm),count(mgr) from emp2;
2. SUM和AVG
1. 当需要纵向求和时使用sum()函数
2. 当需要纵向求平均值时使用avg()函数
练习:
1. 查询所有雇员月薪和:
代码:select sum(sal) from emp2;
2. 查询所有雇员月薪和,以及所有雇员佣金和:
代码:select sum(sal),sum(comm) from emp2;
3. 查询所有雇员月薪+佣金和:
代码:select sum(sal+ifnull(comm,0)) from emp2;
4. 统计所有员工平均工资:
代码:select avg(sal) from emp2;
3. max和min
1. 当需要纵向求最大值时使用max()函数
2. 当需要纵向求最小值时使用min()函数
练习:
1. 查询最高工资和最低工资:
代码:select max(sal),min(sal) from emp2;
- 分组查询
1. 当需要分组查询时需要使用GROUP BY子句(凡和聚合函数同时出现的列名,一定要写在group by 之后)
练习:
1. 查询每个部门的部门编号和每个部门的工资和:
代码:select deptno,sum(sal) from emp2 group by deptno;
2. 查询每个部门的部门编号以及每个部门的人数:
代码:select deptno,count(*) from emp2 group by deptno;
3. 查询每个部门的部门编号以及每个部门工资大于1500的人数:
代码:select deptno,count(*) from emp2 where sal>1500 group by deptno;
2. HAVING子句
练习:
1. 查询工资总和大于9000的部门编号以及工资和:
代码:SELECT deptno, SUM(sal) FROM emp2 GROUP BY deptno HAVING SUM(sal) > 9000;
3. 注:having与where的区别:
1. having是在分组后对数据进行过滤., where是在分组前对数据进行过滤
2. having后面可以使用聚合函数(统计函数), where后面不可以使用聚合函数。
3. WHERE是对分组前记录的条件,如果某行记录没有满足WHERE子句的条件,那么这行记录不会参加分组;而HAVING是对分组后数据的约束。 - LIMIT 方言
LIMIT用来限定查询结果的起始行,以及总行数。
第一个参数,是从第几行开始,第二个参数,是表示一共查几行
练习:
1. 查询5行记录,起始行从0开始(注意,起始行从0开始,即第一行开始!)
代码:SELECT * FROM emp2 LIMIT 0, 5;
2. 查询10行记录,起始行从3开始
代码:SELECT * FROM emp2 LIMIT 3, 10;
9. 查询相关关键字的顺序 ()
1. 查询语句书写顺序:select —> from ----> where —> group by ----> having ----> order by —>limit
2. 查询语句执行顺序:from —> where —> group by —> having - select —> order by ----> limit*
今天复习就到这里,如果其中内容有错误,或者一些不合适,请大家给我指正,谢谢大家!