文章目录
数据库概述
数据库:数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。
关系型数据库:是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。
NoSQL:泛指非关系型的数据库。比如键值存储数据库
SQL概述
SQL:结构化查询语言(Structured Query Language),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
分类
- DDL(Data Definition Language):数据库模式定义语言,用于定义数据库对象,例如库、表、列
- DML(Data Manipulation Language):数据操作语言,用户通过它可以实现对数据库的基本操作,例如增、删、改数据库中的数据
- DQL(Data QueryLanguage):数据查询语言,用来查询记录(数据)
- DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别
MySQL语法
列名的数据类型
数据类型 | 描述 | 举例 |
---|---|---|
int | 整型 | id int |
double | 浮点型double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99 | money double(5,2) |
char | 固定长度字符串类型 | name char(10) |
varchar | 可变长度字符串类型 | name varchar(10) |
text | 字符串类型,存大格式的文本,一般不用 | |
blob | 字节类型,存字节类型的数据,如电影、图片,一般不用 | |
date | 日期类型,格式为:yyyy-MM-dd | |
time | 时间类型,格式为:hh:mm:ss | |
datetime | 日期时间类型 yyyy-MM-dd hh:mm:ss | |
timestamp | 时间戳类型 yyyy-MM-dd hh:mm:ss,该类型的字段的默认值位当前时间 |
DDL
对于数据库的操作
-- 创建数据库:CREATE DATABASE 库名
CREATE DATABASE myDemo
-- 删除数据库:DROP DATABASE 库名
DROP DATABASE myDemo
-- 查询所有数据库
SHOW DATABASES
-- 切换使用的数据库:USE 库名
USE myDemo
对于表的操作
-- 创建表:CREATE TABLE 表名(列名1 类型1,列名2 类型2,...)
CREATE TABLE stu_Info(stu_no VARCHAR(10),stu_name VARCHAR(10),stu_age INT)
-- 删除表:DROP TABLE 表名
DROP TABLE stu_Info
-- 查询表的结构:DESC 表名
DESC stu_Info
-- 修改表名:ALTER TABLE 原表名 RENAME TO 新表名
ALTER TABLE stu_Info RENAME TO student
对于列的操作
-- 添加列:ALTER TABLE 表名 ADD 列名 数据类型
ALTER TABLE stu_Info ADD stu_grade DOUBLE(5,1)
-- 删除列:ALTER TABLE 表名 DROP 列名
ALTER TABLE stu_Info DROP stu_grade
-- 修改列的数据类型:ALTER TABLE 表名 MODIFY 原列名 新数据类型
ALTER TABLE stu_Info MODIFY stu_name VARCHAR(15)
-- 修改列名:ALTER TABLE 表名 CHANGE 原列名 新列名 新数据类型
-- 可用于修改列的数据类型
ALTER TABLE stu_Info CHANGE stu_name studentName VARCHAR(20)
DML
对于表中数据的操作
-- 添加数据:INSERT INTO 表名(列名1,列名2,...) VALUES('数据1','数据2',...)
-- 日期和时间数据要使用单引号包裹起来,且要符合格式
INSERT INTO stu_Info(stu_no,stu_name,stu_age,stu_birthday) VALUES('001','James',15,'2002-05-06 10:00:00')
-- 如果给所有字段添加数据可以写成:
INSERT INTO stu_Info VALUES('001','James',15,'2002-05-06 10:00:00')
-- 删除数据
-- 删除表中所有数据:DELETE FROM 表名
DELETE FROM stu_Info
-- 根据条件删除某一行:DELETE FROM 表名 WHERE 条件
-- 删除表stu_Info中stu_name为'James'的一行记录
DELETE FROM stu_Info WHERE stu_name='James'
-- 删除表stu_Info中stu_name为'James'且stu_age为15的一行记录
DELETE FROM stu_info WHERE stu_name='James' AND stu_age=15
--修改数据
-- 将所有记录的stu_no修改为'002'
UPDATE stu_Info SET stu_no='002'
-- 根据条件修改数据:UPDATE 表名 SET 列名=新数据 WHERE 条件
UPDATE stu_Info SET stu_no='003' WHERE stu_name='James'
-- 修改多个数据:UPDATE 表名 SET 列名1=新数据1,列名2=新数据2 WHERE 条件
UPDATE stu_Info SET stu_no='003',stu_age=18 WHERE stu_name='James'
DQL
员工表
CREATE TABLE emp(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm DECIMAL(7,2),
deptno INT
)
WHERE 子句
WHERE子句可有条件地从表中选取数据,类似于程序语言中的 if 条件,根据 MySQL表中的字段值来读取指定的数据。
WHERE子句也可以运用于SQL的SELECT、DELETE或者UPDATE命令。
操作符 | 描述 |
---|---|
= | 等号,如果相等返回true |
!= | 不等于,如果不相等返回true |
> | 大于号,如果左边的值大于右边的值返回true |
< | 小于号, 如果左边的值小于右边的值返回true |
>= | 大于等于号,如果左边的值大于或等于右边的值返回true |
<= | 小于等于号, 如果左边的值小于或等于右边的值返回true |
也可以使用 AND 、OR等操作符指定一个或多个条件。
SELECT 查询
SELECT 语句用于从数据库中选取数据
-- 格式:SELECT 列名 FROM 表名 WHERE 条件
-- 从指定表中查询符合条件的所有列名的信息
-- 从emp表中查询sal(薪资)大于1500的empno,ename,job,sal列名的信息
SELECT empno,ename,job,sal FROM emp WHERE sal>1500
-- 可以使用AS来给列名指定别名
SELECT empno AS 编号,ename AS 姓名,job AS 职位,sal AS 薪资 FROM emp WHERE sal>1500
-- '*'表示通配符
-- 从emp表中查询sal(薪资)大于1500的所有列名信息
SELECT * FROM emp WHERE sal>1500
SELECT语句中进行计算
在SELECT语句中可以进行计算
SELECT empno AS 编号,ename AS 姓名,sal*12 AS 年薪 FROM emp
注意:NULL参加运算结果为NULL
-- 如果要加上NULL值进行计算,使用IFNULL函数给NULL值指定计算的值
-- IFNULL(v1,v2):如果v1的值不为NULL,则返回v1,否则返回v2。
SELECT empno AS 编号,ename AS 姓名,sal*12+IFNULL(comm,0) AS 年薪 FROM emp
DISTINCT
DISTINCT关键词用于返回唯一不同的值。
-- 如果表中的sal数据有多个3000只会查询到一条
SELECT DISTINCT sal FROM emp WHERE sal=3000
-- 会查询到多项记录,因为姓名具有差异
SELECT DISTINCT ename,sal FROM emp WHERE sal=3000
ORDER BY 排序
ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序,默认按照升序对记录进行排序
-- 根据sal(薪资)进行升序排序
SELECT * FROM emp ORDER BY sal ASC
-- 根据sal(薪资)进行降序排序
SELECT * FROM emp ORDER BY sal DESC
-- 可定义第二排序条件
-- 对根据sal(薪资)的排序结果再次按照comm(奖金)进行排序,默认为升序
SELECT * FROM emp ORDER BY sal,comm
-- 也可分别指定排序方式
SELECT * FROM emp ORDER BY sal ASC,comm DESC
常见操作符的使用
AND操作符
如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。
-- 从emp表中查询sal(薪资)大于1500且小于3000的所有列名信息
SELECT * FROM emp WHERE sal>1500 AND sal<3000
OR操作符
如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。
-- 从emp表中查询sal(薪资)小于1000或大于3000的所有列名信息
SELECT * FROM emp WHERE sal<1000 OR sal>3000
BETWEEN操作符
BETWEEN操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
-- 从emp表中查询sal(薪资)在1500到3000之间的所有列名信息
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000
-- 相当于
SELECT * FROM emp WHERE sal>=1500 AND sal<=3000
IN操作符
IN操作符允许您在 WHERE 子句中规定多个值。
-- 从emp表中查询job(职位)为'CLERK'或'ANALYST'的所有列名信息
SELECT * FROM emp WHERE job IN('CLERK','ANALYST')
IS NULL操作符和IS NOT NULL操作符
对于NULL值有专有的操作符判断值是否为空
-- 从emp表中查询comm(奖金)为NULL的所有列名信息
SELECT * FROM emp WHERE comm IS NULL
-- 从emp表中查询comm(奖金)不为NULL的所有列名信息
SELECT * FROM emp WHERE comm IS NOT NULL
NOT操作符
代表非,一般和其他操作符一起使用
-- 从emp表中查询job(职位)不为'CLERK'或'ANALYST'的所有列名信息
SELECT * FROM emp WHERE job NOT IN('CLERK','ANALYST')
-- 从emp表中查询sal(薪资)不在1500到3000之间的所有列名信息
SELECT * FROM emp WHERE sal NOT BETWEEN 1500 AND 3000
-- 相当于
SELECT * FROM emp WHERE NOT (sal>=1500 AND sal<=3000)
LIKE 子句
可以在WHERE子句中使用LIKE子句,进行模糊查询,类似于根据关键词搜索
-- _:匹配单个任意字符 %:匹配多个任意字符
-- 从emp表中查询姓名中包括'a'的所有列名信息,结果不区分大小写
SELECT * FROM emp WHERE ename LIKE '%a%'
-- 从emp表中查询姓名以'a'开头的所有列名信息
SELECT * FROM emp WHERE ename LIKE 'a%'
-- 从emp表中查询姓名以'k'结尾的所有列名信息
SELECT * FROM emp WHERE ename LIKE '%k'
-- 从emp表中查询姓名的第二个字符为'm'的所有列名信息
SELECT * FROM emp WHERE ename LIKE '_m%'
-- 从emp表中查询姓名为5个字符的所有列名信息,LIKE后是5个_
SELECT * FROM emp WHERE ename LIKE '_____'
-- 可以使用LIKE子句代替等号 =
-- 从emp表中查询姓名为'Smith'的所有列名信息
SELECT * FROM emp WHERE ename LIKE 'Smith'
聚合函数
AVG()函数
AVG()函数返回数值列的平均值。
-- 查询emp表中的sal(薪资)的平均值
SELECT AVG(sal) AS 平均工资 FROM emp
COUNT()函数
COUNT()函数返回匹配指定条件的行数。
-- 查询具有奖金的人数
SELECT COUNT(comm) FROM emp
NULL值不参与统计
MAX()函数和MIN()函数
MAX()函数返回指定列的最大值
MIN()函数返回指定列的最小值
-- 查询最高薪资
SELECT MAX(sal) AS 最高薪资 FROM emp
-- 查询最低薪资
SELECT MIN(sal) AS 最低薪资 FROM emp
SUM()函数
SUM()函数返回数值列的总数。
-- 返回薪资的总和
SELECT SUM(sal) AS 薪资总和 FROM emp
GROUP BY 语句
GROUP BY语句用于结合聚合函数,根据一个或多个列对结果集进行分组。
-- 从表emp中根据deptno(部门编号)进行分组查询每个部门的平均工资
SELECT deptno 部门编号,AVG(sal) 平均工资 FROM emp GROUP BY deptno
-- 查询各部门sal(薪资)大于1500的人数,WHERE子句的条件放在GROUP BY之前
SELECT deptno 部门编号,COUNT(*) 人数 FROM emp WHERE sal>1500 GROUP BY deptno
HAVING 子句
在SQL中增加HAVING子句原因是,WHERE关键字无法与聚合函数一起使用。
HAVING子句可以让我们筛选分组后的各组数据。
-- 查询平均薪资大于2000的部门
SELECT deptno 部门编号,AVG(sal) 平均薪资 FROM emp GROUP BY deptno HAVING AVG(sal)>2000
-- 查询各部门中sal(薪资)大于1500的人员的平均工资
SELECT deptno 部门编号,AVG(sal) 平均薪资 FROM emp WHERE sal>1500 GROUP BY deptno
WHERE和HAVING的区别:
WHERE子句位于GROUP BY之前,用于在分组前根据条件进行筛选,不满足条件的不参与分组
HAVING子句位于GROUP BY之后,用于对分组后的数据进行二次筛选
LIMIT
LIMIT限制查询到的记录项
-- SELECT 要查询的列名信息 FROM 表名 LIMIT 记录项索引,记录项数
-- 从第1项记录开始查询,查询4项记录
SELECT * FROM emp LIMIT 0,4
-- 从第5项记录开始查询,查询5项记录
SELECT * FROM emp LIMIT 4,5
可使用LIMIT完成记录的分页展示