初学者不点进去就太亏了,MYSQL数据库超全知识点总结!

本文首发于CSDN博客ityanger的同名文章:初学者不点进去就太亏了,MYSQL数据库超全知识点总结!.

1 数据库概述

1.1 什么是数据库

  • 数据库就是一个文件系统,只不过我们需要通过命令(SQL)来操作这个文件系统。
  • 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
  • 数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

1.2 数据库的作用

  • 存储数据,数据的仓库,带有访问权限,限制不同的人有不同的操作。

1.3 为什么要学数据库

  • 操作的都是后台数据,取到后台数据进行封装,然后交给前台去展现。

1.4 常见的数据库

  1. MySQL:开源免费的适用于中小型企业的免费数据库,sun 公司收购了 MySQL,sun 公司被 Oracle 收购了,Oracle 收购之后就开始收费了。
  2. Mariadb:由 MySQL 创始人搞出来的,直接是 MySQL 开源版本的一个分支,基本上所有的命令都是一样的。
  3. Oracle:甲骨文公司,商业收费,适用于大型电商网站,收购 sun 公司和Java。
  4. db2:IBM 公司,主要提供解决方案,软件和硬件,服务器架构。银行系统大多数采用的是 db2。
  5. SQLserver:Windows 里面,政府网站 asp.net,大多数大学教学通常都是采用 SQLserver,图形化工具不错。
  6. Sybase:已经被淘汰了。
  • NoSQL 非关系型数据库:key:value 的形式,常见的有 Mongodb、Redis 等。

1.5 关系型数据库

  1. 主要是用来描述实体与实体之间的关系。
  2. E-R 图表示:实体-方框,属性-椭圆,关系-菱形。

1.6 MySQL数据库服务器

  • MySQL 数据库:数据库管理软件。
  • 服务器:类似一台电脑,这台电脑安装相关的服务器软件,这些软件会监听不同的端口号,根据用户访问的端口号,提供不同的服务。

2 MySQL的SQL语句

  1. SQL:Structure Query Language 结构化查询语言。
  2. DDL:数据定义语言。定义数据库,数据库表及结构。create(创建),drop(删除),alter(修改)。
  3. DML:数据操纵语言:主要是用来操作数据。insert(插入),update(修改),delete(删除)。
  4. DCL:数据控制语言:定义访问权限,取消访问权限,安全设置 grant。
  5. DQL:数据查询语言:select(查询),from子句,where子句。

2.1 数据库的CRUD的操作

  • 首先要登录数据库服务器:mysql -u [用户名] -p [密码]

2.1.1 创建数据库

  1. create database 数据库名字;
    create database sql_1;
    
  2. create database 数据库名字 character set 字符集;
    create database sql_2 character set utf8;
    
  3. create database 数据库名字 character set 字符集 collate 校对规则;
    create database sql_3 character set utf8 collate utf8_bin;
    

2.1.2 查看数据库

  1. -- 查看所有的数据库
    show databases;
    
  2. -- 查看数据库定义的语句
    show create database 数据库的名字
    show create database sql_1;
    show create database sql_2;
    

2.1.3 修改数据库

  1. -- 修改数据的字符集
    alter database 数据库的名字 character set 字符集;
    alter database sql_1 character set gbk;
    

2.1.4 删除数据库

  1. drop database 数据库名字;
    drop database sql_2;
    drop database sql_3;
    

2.1.5 其它数据库操作命令

  1. -- 切换数据库(选中数据库)
    use 数据库的名字;
    use sql_1;
    
  2. -- 查看当前正在使用的数据库
    select database();
    

2.2 表的CRUD操作

2.2.1 创建表

  1. create table 表名(
        列名1 列的类型(长度) 约束,
        列名2 列的类型(长度) 约束,
        . . . . . .
    );
    
    create table student(
        sid int primary key,
        sname varchar(15),
        sex int,
        age int
    );
    
  2. 列的类型
    -- int
    -- char/varchar[char:固定长度, varchar:可变类型]
    -- double, float, boolean
    -- date[YYYY-MM-DD]
    -- time[hh:mm:ss]
    -- datatime[YYYY-MM-DD hh:mm:ss] 默认值是null
    -- timestamp[YYYY-MM-DD hh:mm:ss] 默认使用当前时间
    -- text[主要是用来存放文本]
    -- blob[存放的是二进制]
    
  3. 列的约束
    -- 主键约束: primary key
    -- 唯一约束: unique
    -- 非空约束: not null
    

2.2.2 查看表

  1. -- 查看所有表
    show tables;
    
  2. -- 查看表的定义
    show create table 表的名字;
    show create table student;
    
  3. -- 查看表的结构
    desc 表的名字;
    desc student;
    

2.2.3 修改表

  • 添加列(add),修改列类型(modify),修改列名(change),删除列(drop),修改表名(rename)。
  1. -- 添加列
    alter table 表名 add 列名 列的类型 列的约束
    alter table student add grade int not null;
    
  2. -- 修改列类型
    alter table 表名 modify 列名 列的类型;
    alter table student modify sex varchar(2);
    
  3. -- 修改列名
    alter table 表名 change 原列名 新列名 新列的类型;
    alter table student change sex tel varchar(20);
    
  4. -- 删除列
    alter table 表名 drop 列名;
    alter table student drop tel;
    
  5. -- 修改表名
    rename table 原表名 to 新表名;
    rename table student to stus;
    
  6. -- 修改表的字符集
    alter table 表名 character set 字符集;
    alter table stus character set gbk;
    

2.2.4 删除表

  1. drop table 表名;
    drop table stus;
    

2.3 表中数据的CRUD操作

2.3.1 插入数据

  1. insert into 表名(列名1, 列名2, 列名3) values(值1, 值2, 值3);
    insert into student(sid, sname, sex, age) values (1, 'liuyi', 1, 23);
    
  2. -- 如果插入的是全列名的数据,表名后面的列名可以省略
    insert into 表名 values(值1, 值2, 值3);
    insert into student values(2, 'chener', 1, 23);
    
  3. -- 注意,如果插入的是部分列,列名不可省略
    insert into student(sid, sname) values(3, 'zhangsan');
    insert into student values(3, 'zhangsan');  --错误
    
  4. -- 批量插入
    insert into student values
    (4, 'lisi', 1, 23),
    (5, 'wangwu', 1, 23),
    (6, 'zhaoliu', 1, 23),
    (7, 'sunqi', 1, 23),
    (8, 'zhouba', 1, 23);
    

2.3.2 删除记录

  1. delete from 表名 [where 条件];
    delete from student where sid=10;
    
  2. -- 如果没有指定条件,会将表中的数据一条一条全部删除掉
    delete from student;
    
  3. delete 删除数据和 truncate 删除数据的区别
    -- delete: DML 一条一条删除表中的数据
    -- truncate: DDL 先删除表再重建表
    -- 关于哪条执行效率高,具体要看表中的数据
    -- 如果数据比较少,delete 比较高效
    -- 如果数据比较多,truncate 比较高效
    

2.3.3 更新表记录

  1. update 表名 set 列名1=列1的值, 列名2=列2的值 [where 条件];
    
    -- 如果参数是字符串或日期,要加上单引号
    update student set sname='李四' where sid=4;
    
    -- 没有条件,那么每一条记录都会执行
    update student set sname='李四', sex=20;
    

2.3.4 查询记录

  1. select [distinct] [*] [列名1, 列名2] from 表名 [where 条件]; -- distinct 去除重复数据
    
  2. 先创建两个表,用于操作:

    -- 商品分类
    -- 1. 分类ID
    -- 2. 分类名称
    -- 3. 分类描述
    create table category(
        cid int primary key auto_increment,
        cname varchar(10),
        cdesc varchar(31)
    );
    
    -- 所有商品
    -- 1. 商品ID
    -- 2. 商品名称
    -- 3. 商品价格
    -- 4. 生产日期
    -- 5. 商品分类ID
    -- 商品和商品分类:所属关系
    create table product(
        pid int primary key auto_increment,
        pname varchar(10),
        price double,
        pdate timestamp,
        cno int
    );
    -- 关于数据这里就不再操作了,随便一点数据就行
    
  3. 简单查询

    -- 查询所有商品
    select * from product;
    
    -- 查询商品名称和商品价格
    select pname, price from product;
    
  4. 别名查询,as 关键字,as 可以省略

    -- 表别名(主要用于多表查询)
    select p.pname, p.price from product as p;
    
    -- 列别名
    select pname as 商品名称, price as 商品价格 from product;
    
    -- 省略 as 关键字
    select pname 商品名称, price 商品价格 from product;
    
  5. 去掉重复的值

    -- 查询商品所有的价格
    select price from product;
    select distinct price from product;
    
    -- select 运算查询:仅仅在查询结果上做了运算,不改变表中的数据
    select *, price*1.5 from product;
    select *, price*0.9 from product;
    select *, price*0.5 as 折后价 from product;
    
  6. 条件查询 [where关键字], 指定条件,确定要操作的记录

    -- 查询商品价格>60的所有商品信息
    select * from product where price > 60;
    
    -- where 后的条件写法
    -- 关系运算符:> >= < <= = != <>
    -- <> 不等于,标准 SQL 语法
    -- != 不等于,非标准 SQL 语法
    
    -- 查询商品价格不等于 88 的所有商品
    select * from product where price <> 88;
    
    -- 查询商品价格在 10 到 100 之间
    select * from product where price > 10 and price < 100;
    
    -- between...and...
    select * from product where price between 10 and 100;
    
  7. 逻辑运算:and, or, not

    -- 查询出商品价格小于 100 或者商品价格大于 900 的商品
    select * from product where price < 100 or price > 900;
    
  8. like 模糊查询

    -- _:代表一个字符
    -- %:代表多个字符
    
    -- 查询出名字中带有'饼'的所有商品 '%饼%'
    select * from product where pname like '%饼%';
    
    -- 查询第二名是'烟'的所有商品 '_烟%'
    select * from product where pname like '_烟%';
    
  9. in 在某个范围中获取值

    -- 查询出商品分类ID在1,4,5里面的所有商品
    select * from product where cno in (1, 4, 5);
    
  10. 排序查询:order by 关键字

    -- asc: ascend 升序,默认的排序方式
    -- desc: descend 降序
    
    -- 查询所有商品,按照价格进行排序
    select * from product order by price;
    
    -- 查询所有商品,按价格进行降序排序
    select * from product order by price desc;
    
    -- 查询名称有'小'的商品,按价格升序
    select * from product where pname like '%小%' order by price asc;
    
  11. 聚合函数

    sum():求和
    avg():求平均值
    count():统计数量
    max():最大值
    min():最小值
    
    -- 获取所有商品价格的总和
    select sum(price) from product;
    
    -- 获取所有商品的平均价格
    select avg(price) from product;
    
    -- 获取所有商品的个数
    select count(*) from product;
    
  • 注意,where 条件后面不能接聚合函数
  1. 子查询

    -- 查询商品价格大于平均价格的商品
    select * from product where price > (select avg(price) from product);
    
  2. 分组:group by

    -- 根据 cno 字段分组,分组后统计商品个数
    select cno, count(*) from product group by cno;
    
    -- 根据 cno 分组,分组统计每组商品的平均价格并且商品平均价格>60
    select cno, avg(price) from product group by cno having avg(price) > 60;
    
    -- having 关键字,可以接聚合函数,出现在分组之后
    -- where 关键字,不可以接聚合函数,出现在分组之前
    
  3. 编写顺序

    -- S..F..W..G..H..O
    -- select .. from .. where .. group by .. having .. order by
    
  4. 执行顺序

    -- F..W..G..H..S..O
    -- from .. where .. group by .. having .. select .. order by 
    

2.3 分页查询

  1. limit [索引], [显示的个数]
    
    select * from product limit 0, 3; -- 出来的是第1~3条的3条数据
    select * from product limit 3, 3; -- 出来的是第4~6条的3条数据
    

2.4 多表之间的关系维护

  1. 外键约束: foreign key
    -- 给 product 中的 cno 添加一个外键约束(两张表:product,category)
    alter table product add foreign key(cno) references category(cid);
    
  • 删除的时候, 先删除外键关联的所有数据,再才能删除分类的数据。
  1. 主键约束:默认就是不能为空,唯一。

    • 外键都是指向另外一张表的主键
    • 一张表只能有一个主键
  2. 唯一约束:列里面的内容必须是唯一,不能出现重复情况,可为空。

    • 唯一约束不可以作为其它表的外键
    • 可以有多个唯一约束

2.4.1 建数据库原则

  • 通常情况下,一个项目/应用建一个数据库。

2.4.2 多表之间的建表原则

  1. 一对多:商品和分类

    • 建表原则:在多的一方添加一个外键,指向一的一方的主键。
  2. 多对多:老师和学生,学生和课程

    • 建表原则:建立一张中间表,将多对多的关系,拆分成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表。
  3. 一对一:班级和班长, 公民和身份证, 国家和国旗

    • 建表原则:
      • 将一对一的情况,当作是一对多情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表
      • 直接将两张表合并成一张表
      • 将两张表的主键建立起连接,让两张表里面主键相等
    • 实际用途: 用的不是很多(拆表操作).
      • 拆表操作:将个人的常用信息和不常用信息拆分出来,减少表的臃肿。

2.5 多表查询

2.5.1 笛卡尔积(交叉连接查询)

  1. -- 查出来的就是两张表的乘积,查出的结果没有意义。
    select * from product, category;
    
  2. -- 过滤出有意义的数据
    select * from product, category where cno = cid;
    select * from product as p, category as c where p.cno = c.cid;
    select * from product p, category c where p.cno = c.cid;
    

2.5.2 内连接查询

  1. -- 隐式内连接
    select * from product p, category c where p.cno = c.cid;
    
  2. -- 显式内连接
    select * from product p inner join category c on p.cno = c.cid;
    
  3. -- 区别
    -- 隐式内连接:在查询出结果的基础上去做 where 条件过滤
    -- 显式内连接:带着条件去查询结果,执行效率要高
    

2.5.3 左外连接

  1. 左外连接,会将左表中的所有数据都查询出来,如果右表中没有对应的数据,用 null 代替。
  2. select * from product p left outer join category c on p.cno = c.cid;
    

2.5.4 右外连接

  1. 右外连接,会将右表中的所有数据都查询出来,如果左表中没有对应的数据,用 null 代替。
  2. select * from product right outer join category c on p.cno = c.cid;
    

3 END

感谢看到这里的各位读者朋友们,如果你感到本文写的不错,就顺手点个赞👍收藏一下,也可以关注一波~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 1).创建数据库 create database学生选课数据库 2).创建四张表 Create table Stu...
    blvftigd阅读 1,570评论 0 0
  • JDBC(JAVA DataBase connectivity)-java数据库连接 为什么会出现JDBC SUN...
    进击的大东阅读 701评论 0 0
  • 数据库 1.概念 数据库是一个文件系统,只不过我们需要用命令(SQL)来操作,用来存储数据,带有访问权限,限制不同...
    hgzzz阅读 172评论 0 0
  • 不是所有的机遇都会让你有所准备,也不要认为一些看不懂的事情是无用的,做好当下。
    苏_a1fb阅读 56评论 0 0
  • 汪汪队,又名狗狗巡逻队,第五季中文离线版上线了! 让你的孩子远离网络的束缚,在旅途中、帐篷里也能观看喜欢的动画 点...
    鵸鵌阅读 1,326评论 0 0