数据库的复习(一)

2020年2月28日

数据库概述

  1. 数据库(DataBase:DB):指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被各种用户或应用共享的数据集合。(文件系统)是存储,维护和管理数据的集合
  2. 数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。

数据库与数据库管理系统的关系

在这里插入图片描述

数据库服务器,数据库和表的关系

在这里插入图片描述

SQL

特点:
高度非过程化,即用SQL操作数据库,只需要指出“做出来”,无须指明“怎么做”,存取路径的选择和操作的执行由DBMS自动完成。

分类:

  1. DDL : 数据定义语言,用来定义数据库对象:库,表,列等等
  2. DML : 数据操作语言,用来操作数据库表中的记录
  3. DQL : 数据查询语言,用来查询记录
  4. DCL : 数据控制语言,用来定义访问权限和安全级别

DDL

  1. 创建数据库:CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification[,create_specification]…]
    列子:

    1. 创建mydb1数据库 语句:CREATE DATABASE mydb1;
      结果: 在这里插入图片描述
      在这里插入图片描述
    2. 创建使用gbk字符集的mydb3数据库 语句:create database mydb3 character set gbk;
      结果:在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    3. 创建使用gbk字符集的并带校对规则的mydb4数据库 语句:Create database mydb4 character set gbk COLLATE gbk_chinese_ci;
      结果:在这里插入图片描述
      在这里插入图片描述
  2. 查看数据库:show
    例子:
    1. 显示数据库语句:show databases;
    在这里插入图片描述
    2. 显示数据库创建语句:show create database mydb3;
    在这里插入图片描述

  3. 删除数据库:drop database db_name;
    例子:
    1. drop database mydb4;
    在这里插入图片描述
    在这里插入图片描述

  4. 修改数据库:ALTER DATABASE db_name[alter_specification…]
    例子:

    1. alter database mydb3 character set utf8;
      在这里插入图片描述
  5. 使用数据库:use db_name;

  6. 查看当前使用的数据库: select database();

  7. 操作数据表:
    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)
    );

    1. 查看当前数据库中所有的表:show tables;
    2. 查看表的字段信息:desc 表名;
      在这里插入图片描述
    3. 在表中添加一个列:alter table 表名 add 字段1 字段类型;
      在这里插入图片描述
      1. 修改表中的列:alter table 表名 modify job(列表名) varchar(60)(要修改字段属性);
      2. 删除表中的列:alter table 表名 drop 列表名;
      3. 表改名:rename table 表名 to 新表名;
      4. 查看表的创建信息:SHOW CREATE TABLE表名;
      5. 修改表的字符集为gbk:ALTER TABLE 表名 CHARACTER SET gbk;
      6. 列名name修改为username:ALTER TABLE 表名 CHANGE name username varchar(100);
      7. 删除表:DROP TABLE 表名 ;

DML(*)

是对表中的数据进行增,删,改的操作。
ps:在mysql中,字符串类型和日期类型都要用单引号括起来。‘tom’ ‘2015-09-04’,空值:null

  1. 查询表中所有的数据:select * from 表名;
  2. 插入操作: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);
  1. 修改操作 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';
  2. 删除操作 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. 基础查询
    1. 查询所有列
    代码:select * from stu;
    2. 查询指定列表
    代码:select sid,sname,age from stu;
  2. 条件查询
    条件查询就是在查询时给出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;
  3. 模糊查询
    当想查询姓名中包含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%';
  4. 字段控制查询
    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;
  5. 排序 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;
  6. 聚合函数 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;
  7. 分组查询
    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是对分组后数据的约束。
  8. 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
    *

今天复习就到这里,如果其中内容有错误,或者一些不合适,请大家给我指正,谢谢大家!

发布了9 篇原创文章 · 获赞 8 · 访问量 390

猜你喜欢

转载自blog.csdn.net/qq_41816516/article/details/104550860
今日推荐