NULL使用记录
写在前面在前面学习的过程中,我们多次遇到由于数据值为NULL而导致的各种问题,那么本篇就来总结一下NULL使用过程中需要注意的点。
本文的主要内容如下:(1)在比较运算符中使用NULL;(2)IN和NULL比较;(3)NOT IN和NULL比较;(4)EXISTS、NOT EXISTS和NULL比较;(5)使用IS NULL、IS NOT NULL来判断NULL;(6)聚合函数中NULL的坑;(7)主键的值不允许为NULL;(8)文章总结。
在比较运算符中使用NULL仔细阅读下面SQL语句的执行结果:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879mysql> select 1 > NULL;+----------+| 1 > NULL |+----------+| NULL |+----------+1 row ...
数据查询语言(DQL)---子查询
写在前面前面学习了连接查询,这是SQL查询的重点也是难点内容,一定要灵活掌握。接下来学习另一个重点内容—子查询,这是衡量开发人员SQL水平的一个指标。
本文的主要内容如下:(1)子查询;(2)子查询分类;(3)子查询出现在select后面;(4)子查询出现在from后面;(5)子查询出现在where或者having后面;(6)子查询出现在where或者having后面—标量子查询;(7)子查询出现在where或者having后面—列子查询;(8)子查询出现在where或者having后面—行子查询;(9)子查询出现在exists后面(相关子查询);(10)文章总结。
子查询子查询是指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL4.1开始引入。说白了就是出现在select语句中的select语句,这就是子查询或者说是内查询,外部的select查询语句则称为主查询或者外查询。
子查询分类子查询按照结果集的行列数不同,可以分为4种:标量子查询、列子查询、行子查询和表子查询:(1)标量子查询,结果集中只有一行一列;(2)列子查询,结果集中只有一列多行;(3)行子查询,结果集 ...
数据查询语言(DQL)---连接查询
写在前面迄今为止我们都是在一张表内进行数据的增删改查操作,但是在实际工作中大部分都是涉及到同时操作多个表的情况,因此就需要使用到本篇学习的连接查询。
本文的主要内容如下:(1)笛卡尔乘积;(2)SQL中笛卡尔乘积语法;(3)内连接;(4)内连接—无连接条件;(5)内连接—有连接条件;(6)内连接—组合条件;(7)自连接;(8)外连接;(9)左连接(左外连接);(10)右连接(右外连接);(11);(12)全外连接(MySQL没有);(13)文章总结。
前期数据为了更好的学习连接查询,这里提前创建两张表和插入一些数据。
第一步,创建两张表:部门表(t_department)和员工表(t_employee),其中员工表内部有个department_id引用来自部门表的id,相应的SQL语句如下:
123456789101112131415161718mysql> drop table if exists t_department;Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> create table t_depart ...
MySQL用户权限管理
写在前面在实际工作中可能会遇到当管理员创建了一个用户之后,但是该用户却无法登陆系统,没有对应的权限,通过本篇文章的学习,开发者就能解决这个问题。
本文的主要内容如下:(1)MySQL权限工作原理;(2)查看所有用户;(3)创建新用户;(4)修改用户密码;(5)给用户授权;(6)查看用户权限;(7)撤销用户权限;(8)授权原则介绍;(9)文章总结。
MySQL权限工作原理MySQL出于安全性考量,采用“主机名+用户名”这一双重验证机制来判断一个用户的身份。在互联网中,仅仅通过用户名来判断一个用户的身份,这是非常复杂的操作,但是开发者可以通过IP或者主机名来判断一台机器,且如果某位用户是通过这个机器访问的,那么就可以识别成功为一个用户。因此,当一个用户对MySQL发送指令的时候,MySQL就通过“主机名+用户名”这一机制来判断用户身份,进而验证用户权限。
MySQL权限验证分为两个阶段,第一个阶段:连接数据库,此时MySQL会根据用户名和用户来源(IP或者主机名)来判断用户是否有权限连接;第二阶段:对MySQL服务器发起请求操作,如create table、select、delete、up ...
数据查询语言(DQL)---group by和having分组查询
写在前面在学习了前面的order by和limit分页查询之后,接下来开始学习另一个较为高级的用法—分组查询,这个在实际工作中用到的频率也是较大的。
本篇是DQL的分组查询篇,主要学习的内容如下所示:(1)分组查询基本语法格式;(2)聚合函数;(3)单个字段分组;(4)多个字段分组;(5)分组前筛选数据;(6)分组后筛选数据;(7)where和having的区别;(8)分组后排序;(9)综合查询;(10)分组查询中的坑;(11)文章小结等。
需要说明的是,本篇文章代码中被[]包含的内容表示可选的,而被|分割的内容表示可选其一。
分组查询基本语法格式分组查询的基本语法格式如下所示:
1234select column,group_function,... from table[where condition]group by group_by_expression[having group_condition];
解释一下上述代码的含义,group_function是聚合函数,group_by_expression是分组表达式,如果存在多个,那么需要使用逗号进行隔开;group_cond ...
数据查询语言(DQL)---order by和limit排序查询
写在前面在实际工作中经常会有一些特殊需求,如在开发一个电商系统时,如果我们想查看今天所有成交的订单,并按照交易额由高到低进行排序展示,那么就需要用到本篇学习的排序查询了。
本篇是DQL的排序查询篇,主要学习的内容如下所示:(1)排序查询基本语法格式;(2)单字段排序;(3)多字段排序;(4)按别名排序;(5)按函数排序;(6)where之后排序;(7)截取查询基本语法格式;(8)获取前n行记录;(9)获取最大的一条记录;(10)获取排名第n到m的记录;(11)分页查询;(12)limit中不能使用表达式;(13)limit后面2个参数不能为负数;(14)排序分页存在的坑;(15)文章小结等。
需要说明的是,本篇文章代码中被[]包含的内容表示可选的,而被|分割的内容表示可选其一。
排序查询所谓的排序查询就是将查询得到的结果进行排序后进行展示。
基本语法格式排序查询的基本语法格式如下所示:
1select 字段名 from 表名 order by 字段1 [asc|desc],字段2 [asc|desc],...;
在上述语句中,需要排序的字段必须跟在order by后面,[asc|des ...
数据查询语言(DQL)---where条件查询
写在前面在实际工作中经常会有一些特殊需求,如在开发一个电商系统时,如果我们想查看某个用户的所有订单,或者查看某个用户在某个时间段内所有的订单,此时就需要对订单表中的数据进行筛选,然后按照用户和时间进行过滤,最后得到期望的结果,这是再简单不过的需求了。
但是基于之前学过的知识,我们是无法完成这个需要,此时就需要使用条件查询来对指定表进行操作,那么本篇就来学习SQL中常用的条件查询语句。
本篇是DQL的条件查询篇,主要学习的内容如下所示:(1)条件查询基本语法格式;(2)等于(=);(3)不等于(<>或者!=);(4)大于(>);(5)逻辑查询运算符;(6)并且(AND);(7)或者(OR);(8)模糊查询(like);(9)区间查询(between…and);(10)IN查询;(11)NOT IN查询;(12)NULL的注意事项;(13)IS NULL查询;(14)IS NOT NULL查询;(15)安全等于(<=>);(16)经典面试题;(17)文章小结等。
条件查询在MySQL中,条件语句就是使用关键字where,后面跟上一个或多个条件,这些条件用于对前 ...
数据查询语言(DQL)---select基本使用
写在前面前面学习使用DML来管理数据库中的数据,接下来学习如何使用数据查询语言(Data Query Language)来对数据库中存储的数据进行查询操作。说白了就是介绍如何从数据库中获取数据,开发者可以按照DQL的语法给数据库发送一条指令,然后数据库就会按照需求来返回满足条件的数据。
由于DQL使用起来较为复杂,且应用场景较为广泛,因此这里分多篇进行介绍学习。本篇是DQL基础篇,主要学习的内容如下所示:(1)DQL基本语法格式;(2)查询常量;(3)查询表达式;(4)查询函数;(5)查询指定字段;(6)查询所有列;(7)列别名;(8)表别名等。
DQL语法基本语法格式数据查询最基本的语法格式如下所示:
1select 查询的列 from 表名;
请注意,由于MySQL不区分大小写,因此语句中的select和SELECT、from和FROM最终效果都是一致的。
查询结果会放在一个表格中,表格的第一行称为列头,自第二行开始是数据,有点类似于一个二维数组。
查询常量查询常量的语法格式如下所示:
1select 常量值1,常量值2,常量值3,...;
例子1:下面就展示了,如何查询常量:
1 ...
数据管理语言(DML)---insert、delete和update
写在前面前面学习使用DDL来管理数据库、数据表和列,接下来学习如何使用数据操作语言(Data Manipulation Language)来对数据库中存储的数据进行一些管理操作。数据操作语言以INSERT(增加)、UPDATE(修改)、DELETE(删除)三者为核心,是非常重要的操作指令。通常我们习惯上将这三者加上后面即将学习的SELECT称为CRUD,也就是增删改查。
本篇主要学习的内容如下所示:(1)插入操作–插入单行;(2)插入操作–批量插入;(3)修改操作–单表修改;(4)修改操作–多表修改;(5)删除操作–使用delete删除–delete单表删除;(6)删除操作–使用delete删除–delete多表删除;(7)使用truncate删除;(8)drop、truncate和delete区别等。
同时需要说明的是,本文所有命令中包含的[]内的信息属于可选项,开发者可按照实际情况进行选用。
插入操作插入单行插入单行有两种方式,下面分别进行介绍。
方式1:使用values命令,完整命令格式如下所示:
1insert into 表名[(字段1,字段2,...)] values(值1, ...
数据定义语言(DDL)
写在前面本篇正式进入数据库相关操作的学习,会使用数据定义语言(Data Define Language)来对数据库、数据表进行一些管理操作。
本篇主要学习的内容如下所示:(1)创建库;(2)删除库;(3)列出库的信息;(4)建库的通用命令;(5)创建表;(6)查看数据表结构:(7)修改表;(8)表设置备注;(9)删除表;(10)复制表;(11)修改表的存储引擎;(12)增加列;(13)修改列;(14)删除列;(15)几个问题等。
同时需要说明的是,本文所有命令中包含的[]内的信息属于可选项,开发者可按照实际情况进行选用。
库管理创建库创建库的语法格式如下:
1create database [if not exists] 库名;
删除库删除库的语法格式如下:
1drop database [if exists] 库名;
列出库的信息开发者可以使用如下命令来列出库的信息:
1show databases like '数据库名';
建库的通用命令一般都会先判断是否存在某个数据库,如果存在则先删除该库,然后才重新创建;如果不存在则直接创建,此时建库的通用命令如下:
12d ...