MySql学习笔记

孤街醉人 提交于 2019-11-28 13:04:13

原文: http://blog.gqylpy.com/gqy/473

置顶:来自一名75后老程序员的武林秘籍——必读(博主推荐)


来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/

你好,我是一名极客!一个 75 后的老工程师!

我将花两分钟,表述清楚我让你读这段文字的目的!

如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍!

没错,我就是这个老者!

干研发 20 多年了!我也年轻过,奋斗过!我会画原理图,会画 PCB,会模拟,会数字!玩过 PLC,玩过单片机,会用汇编,会用 C!玩过 ARM,比如 PLC,STM32,和时下正在起飞的 NXP RT1052!搞过 DSP,比如 TMS320F28335!搞过 FPGA,不管 Xilinx 还是 Altera,也不管是 Verilog 还是 VHDL,或者直接画数字电路图!我懂嵌入式系统,比如 uCOS 和 Linux!我懂开源的硬件,比如 Arduino 和树莓派!我也搞软件,学了一堆上位机的语言C#,JAVA,Python,Kotlin,Swift!会写爬虫工具,又自学写APP,不管Android 还是 IOS!

可是这一切有什么用呢?土鸡瓦狗!不值一提!干技术的永远就是最苦逼的那个人!

我相信看到这里的你,应该是个 IT 圈的人!或许是个学生,在学习某个技能!或者是个初入职场的年轻人,在啃某个技术!或者是个工程师,被项目困住,想找个资料快速突破阻碍!反正不管怎么样,你们都不会是泛泛之辈,不可能轻易交出智商税!

所以我把这份资料放进我的收费资源里,以证明接下去我要跟你讲的这本武功秘籍是可以真真实实的帮你赚到钱的!

我不知道叫它什么好,我把它写的像武林秘籍!所以我姑且叫它《武林秘籍》或者叫《赚钱秘籍》!

《武林秘籍》里封装了一个本人近期创造的一个可以一劳永逸的赚钱方法!你可以理解为躺着赚钱,或者挂机赚钱!请你放心,不是让你去违法!

我是一个IT男,从来不忽悠别人,这是我做人的原则。若此举能帮助你付起房子首付与月供,减轻一些目前高房价的压力,何乐而不为呢!

我提取里边几个要点:

  1. 将你手里有的资源按照说明书一步一步完成所有动作就可以躺着赚钱。
  2. 你不可能不劳而获,但是用这个方法确实是可以一劳永逸!
  3. 我用业余时间操作这个项目三个月,现在每天稳定收入300+。
  4. 里边会告诉你哪些是资源,怎么源源不断的获取资源。
  5. 里边会告诉你怎么获取爆炸的流量。
  6. 里边会告诉你很多黑技能(不是干坏事)。
  7. 总之,里边字字如金,有些东西我不告诉你可能这辈子都不会知道!

交了这波智商税,你的能力会爆涨,我说的不是你的专业能力,而是在这个社会生存的基础能力!

以上所有的东西可以规为武功的招式,但如果你想短期就实现目标,我还在说明书的最后留下了一些现成资源的下载链接,包括一些稀缺的资源,保证物有所值。这部分内容可以规为内功,继不继承由你自已决定!

好了,最后跟所有的老者不一样的是:这个老人要问你收取一点点小费,才会把无比珍贵的秘籍交到你手中!

以下是付款链接,付款后你将获取《武林秘籍》的访问密码。随后你将解锁另外一个谋生技能,在工作挣着死工资的同时,该技能也能同时帮你赚另一份钱,终身受用!

http://www.gqylpy.com/get_wlmj_pwd

能在此遇见是我们的缘分,我愿意帮助你,祝你取得成功!

传说中的武林秘籍:http://blog.gqylpy.com/gqy/401/

SQL

1.什么是sql?
Structured Query Language:结构化查询语言,定义了操作数据库的规则。
2.SQL通用语法

  1. SQL语句可以单行或多行书写,以分号结尾。
  2. 常用空格或缩进来提高SQL语句的可读性。
  3. Mysql的语句不区分大小写,关键字建议大写
  4. 注释:
单行注释 – 注释内容(注意有空格)或#注释内容(mysql特有)
多行注释 /* 注释内容 */

3.SQL的分类

  1. DDL:Data Definition Language,数据定义语言
    用来定义数据库对象:数据库,表,列等。

  2. DML:Data Manipulation Language,数据操作语言,用来对数据库的增删改

  3. DQL:Data Query Language,数据查询语言,用来查询记录

  4. DCL:Data Control Language,数据控制语言,用来定义数据库的访问权限和安全级别

DDL

1,操作数据库
1).创建

create database  [ if  not  exists ]  数据库名称   [character  set  字符集名] ; 

2).查询

show  databases;   --  查询所有数据库的名称 

3).修改

alter  database  数据库名称  character  set  字符集名;    --  修改字符集,utf8,gbk等等 

4).删除

drop  database  [if  exists]  数据库名称 

5).使用

select  database();  --  查询正在使用的数据库 use  数据库名称;  --  使用某个数据库 

2.操作表
1).创建表

create  table  表名(         列1  数据类型,         列2  数据类型,         ........         列n  数据类型 ); 
数据类型 说明
int 整数
double 小数
date 日期,yyyy-MM-dd
datetime 日期,yyyy-MM-dd HH:mm:ss
timestamp 时间戳类型,格式同上,若不赋值或赋值为null,则默认使用系统时间
varchar(最大长度) 字符串

2).查询

show tables;  --  查询所有表名 desc  表名;   --  查询表的结构 

3).修改

alter table  表名  rename  to  新名字; alter table  表名  character  set  字符集名称; alter table  表名  add  列名  数据类型; alter table  表名  change  列名  新列名  新数据类型; alter table  表名  modify  列名  新数据类型; 

4).删除

drop  table  表名; drop  table  [if  exists]  表名; alter table  表名  drop  列名; 

DML

1.添加数据

insert  into  表名( 列1,列2,...列n )   values( 值1,值2,....值n ); --  注意列和值一一对应,列可以省略不写,除了数字,其他类型的值都要用“”或‘’引起来 

2.删除数据

delete  from  表名   [ where  条件 ] 

DQL

select           字段列表(字段间用逗号分隔) from         表名列名(逗号分隔) where         条件 group  by         分组字段(以某字段为依据分组) having         分组后的条件 order  by         排序 limit         分页限定 

1).排序查询

order  by   排序字段1  排序方式1,排序字段2  排序方式2........ --  排序方式:ASC为升序,默认;DESC为降序,有多个排序条件,先判断前面的,再判断后面的。 

2).聚合函数

名称 说明
count() 计算个数,一般用来非空列的count(*)
max(列名) 最大
min(列名) 最小
sum(列名) 总和
ayg(列名) 平均

注意:聚合函数的计算要排除null值,一般选择不包含null值的列或者使用IFNULL函数

3).分页查询

select  *  from  表名  limit  始数据索引,每页的条数; 

约束

概念:对表中的数据进行限定,保证数据的正确,有效和完整。

1.非空约束 not null

create  table  stu(         id  int  not  null,         name  varchar(30) ); 

或者

alter  table  stu  modify  id  int  not  null;   --  创建后再添加约束 

删除约束

alter  table  stu  modify  id  int; 

2.唯一约束 unique

同上,将not null换成unique即可
注意:添加唯一约束的列依然可以有多个null值

3.主键约束 primary key

同上,将unique换成primary key即可,删除主键除外
注意:一张表只能有一个主键

alter  table  stu  drop  primary  key; 

4.自动增长 auto_increment

用法同3,前提是该列名必须为数字类型

5.外键约束 foreign key

  • 主表:用来约束其他表的表
  • 从表:非主表即从表

在新建表时添加外键:

foreign  key (外键名)  references  主表( 被关联的列 ); 

如图,建表后添加外键

删除外键

级联操作

问题的产生

在操作外键时,如下:

创建部门表

创建员工表

添加测试数据


结果如图

提出问题:若把部门表中的id值2改成5,发生什么?

update  department  set  id = 5  where  id = 2; 

结果:department 表中id值2成功改成5,但employee表中的dep_id依然为2。
同理,当删除id为1的部门时,对应的员工信息依然存在。以上两种情况都不符合实际生产的需求,而级联操作就可以解决这样的问题。

级联操作,即在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作。注意:级联操作是针对从表的,相关语法只需对从表执行。

级联操作的语法 描述
ON UPDATE CASCADE 级联更新,只能在创建表的时候创建级联关系。更新主表的主键时,从表中外键也自动同步更新
ON DELETE CASCADE 级联删除

用法如下:

数据库设计的范式

概念:
设计数据库时,遵从不同的规范,设计出合理的关系型数据库,这些不同的规范称为范式。各种范式呈递次规范,越高的范式数据冗余就越小。
常见其他概念:

函数依赖 A -->B,如果确定A属性的值,可以确定唯一B值,则称B依赖于A
完全函数依赖 A–>B,B依赖于A的所有值
部分函数依赖 B依赖于A的部分值
传递函数依赖 A–>B–>C,若确定A属性的值,可以确定唯一B属性的值,从而确定唯一C属性的值,则C传递依赖于A
若一张表中,一个或多个属性,被其他属性所完全依赖,则这(些)属性称为该组的码

目前关系型数据库有6种范式:
第一范式(1NF),第二范式,第三范式,巴斯-科德范式,第四范式,第五范式(完美范式),一般前3种范式已经够用。

范式 说明
1NF 每一列都是不可分隔的原子数据项
2NF 在1NF的基础上,非码属性必须完全依赖于码属性
3NF 在2NF的基础上,消除所有传递依赖

多表查询

  • 数据准备
CREATE DATABASE duobiao; # 创建部门表 CREATE TABLE dept(     id INT PRIMARY KEY AUTO_INCREMENT,     NAME VARCHAR(20) );  INSERT INTO dept (NAME) VALUES('开发部'),('市场部'),('财务部');  # 创建员工表  CREATE TABLE emp(     id INT PRIMARY KEY AUTO_INCREMENT,     NAME VARCHAR(20),     gender VARCHAR(1),     salary DOUBLE,     join_date DATE,     dept_id INT,     FOREIGN KEY (dept_id) REFERENCES dept(id) );  INSERT INTO emp VALUES(NULL,'张三','男',5000,'2013-01-28',1); INSERT INTO emp VALUES(NULL,'李四','男',4500,'2017-01-28',2); INSERT INTO emp VALUES(NULL,'王五','男',6000,'2013-01-26',2); INSERT INTO emp VALUES(NULL,'小敏','女',5000,'2013-01-28',3); 
  • 部门表

  • 员工表

左表与右表

表名在关键字join左边的表叫左表,否则叫右表

内连接

用左表去匹配右表,如果符合条件就显示。

  • 隐式内连接
    没有使用join关键字,条件用where来限定
select 字段名 from 左表,右表 where 条件; 

如:

SELECT * FROM dept,emp WHERE dept.`id` = emp.`dept_id`; 

  • 显式内连接
select 字段名 from 左表 [inner] join 右表 on 条件; 

如查询张三的信息:

SELECT      *  FROM       emp e  INNER JOIN     dept d ON      e.`dept_id` = d.`id` WHERE      e.`name` = '张三'; 

外连接

  • 左外连接

用左表去匹配右表,如果符合就显示,否则显示null。可以理解为,在内连接的基础上确保左表数据的显示

SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件; 
-- 添加一个销售部  INSERT INTO dept (NAME) VALUES('销售部');  -- 内连接查询 SELECT * FROM dept,emp WHERE dept.`id` = emp.`dept_id`; 

-- 外连接查询 SELECT * FROM dept LEFT OUTER JOIN emp ON dept.`id` = emp.`dept_id`; 

  • 右外连接

用右表去匹配左表,如果符合就显示,否则显示null。可以理解为,在内连接的基础上,确保右表数据的显示

SELECT 字段名 FROM 左表 RIGHT [OUTER] JOIN 右表 ON 条件; 

如:

-- 新增一个员工 INSERT INTO emp VALUES(NULL,'小李','男',5000,'2013-01-28',NULL); -- 右外连接查询 SELECT * FROM dept RIGHT OUTER JOIN emp ON dept.`id` = emp.`dept_id`; 

原文: http://blog.gqylpy.com/gqy/473

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!