#数据库:数据的仓库。
#数据库类型划分:
# 关系型数据库:
# 每行数据代表一个对象信息,每列表示该对象的不同属性。
# 非关系型数据库:
# 以键值对方式存储数据
#数据库的专业术语:
# 以关系型数据库为例:
# 数据库系统 > 数据库管理系统 > 数据库 > 表 > 数据
#常用的关系型数据库:
# 后台使用C、C++、C#等高级编程语言,通常会使用sqlserver数据库
# 后台使用java高级编程语言,通常会使用mysql、oracle、DB2数据库
#非关系型数据库:
# mongdb、redis
#不管是哪种关系型数据库,都是使用SQL语句[数据库脚本语言]。
#安装数据库:
# 先装服务器
# 提供服务的,数据来源
# 服务器会自带命令行客户端[字符界面]
# 再装客户端
# 获取服务,获取数据[图形化界面]
#mysql数据库的最高权限账号是 root root
#编写sql语句的文件称为数据库脚本文件,后缀名.sql
#数据库使用:
#1、启动服务
# (1)右击我的电脑 --> 管理 --> 服务 --> MySQL启动
# (2)右击任务栏 --> 任务管理器 --> 服务 --> MySQL启动
# (3)进入win+r运行窗口,敲cmd进入字符界面,输入指令:net start mysql
#2、登录数据库
# (1)使用服务端自带的字符界面:CommandLine
# 默认使用的是最高权限账号:root 不用输入,只需输入密码。
# (2)使用图形化界面客户端:不是服务器自带的,需要另安装
# 输入账号密码 [以sqlyog为例]
# (3)在window提供的字符界面中登录
# 敲指令:mysql -u root -proot
#3、创建账号、分配权限
# 如果是在界面上维护:通过系统数据库mysql下面的user表,维护一条记录即可
# 使用SQL脚本语句维护:
# 创建登录用户:
# create user '用户名'@'localhost' identified by '密码';
CREATE USER 'ABCD'@'localhost' IDENTIFIED BY '123456';
# 给登录账号分配访问数据的权限:
# grant 权限 on 数据库对象 to 用户
GRANT INSERT,UPDATE,DELETE,SELECT ON mysql.user TO 'ABCD'@'localhost'
#4、创建数据库
# (1)在界面中创建
# 右击首行root@localhost,选择“创建数据库”, 输入数据库名, 维护编码格式,确定即可。
# (2)使用SQL脚本语句创建
# create database 数据名;
CREATE DATABASE ABCDDataBase;
# 使用数据库
# use 数据名;
USE ABCDDataBase;
##5、创建表
# (1)在界面中创建
# 右击tables,选择“创建表”
# 维护表结构[告知对象中的属性有那些]
# 数据库中的类型:
# 整数 INT
# 小数 FLOAT DOUBLE
# 字符串 CHAR VARCHAR TEXT
# 布尔 BIT BOOLEAN --> 建议改为int的1和0表示
# 日期 DATE
# 输入表名
# (2)使用SQL脚本语句创建
# create table 表名
# (
# 列名 类型 约束,
# 列名 类型 约束
# )
CREATE TABLE Teacher
(
teaNo INT(4),
teaName VARCHAR(50),
teaTime FLOAT,
rzTime DATE
)
#6、在表里维护数据
# (1)在界面中维护
# 右击表名,选择“打开表”,双击维grade护数据
# (2)使用SQL脚本语句新增数据
# insert into 表名(列名,列名) values(值,值)
INSERT INTO teacher(teaNo,teaName,teaTime,rzTime) VALUES(1,'zhangsan',10.5,'2013-01-01');
#结构化查询语言SQL语句的分类:
#【一】DDL语句[数据定义语言]
# CREATE、DROP、ALTER
#【二】DCL语句[数据控制语言]
# GRANT、REVOKE COMMIT、ROLLBACK
#【三】DML语句[数据操作语言]
# INSERT、UPDATE、DELETE
#【四】DQL语句[数据查询语言]
# SELECT
#【一】DDL语句[数据定义语言]
#一、create
# 1) 创建用户
# create user '用户名'@'localhost' identified 密码
# 2) 创建数据库
# create database 数据库名;
# 3) 创建表
# create table 表名
# (
# 列名 类型 约束
# )
# 4)创建视图
# create view 视图名
# as
# select语句
# 5)创建索引
# create index 索引名 on 表名(列名)
#二、drop
# 1) 删除用户
DROP USER 'ABCD'@'localhost';
# 2) 删除数据库
DROP DATABASE ABCDdatabase;
# 3) 删除表
DROP TABLE student;
# 4) 删除表结构
#三、alter
#数据完整性约束:
# (1)实体完整性约束
# 作用:约束每一行数据[对象]都唯一
# 实现方式:主键、唯一键、自动增长[特指数值]
# (2)域完整性约束
# 作用:约束每一列的要求
# 实现方式:非空、类型、默认值 [mysql不支持检查约束]
# (3)引用完整性约束
# 作用:约束从表的数据必须关联的上主表数据
# 实现方式:主外键约束
# 区分主从表:“从表”属于“主表”
# 要求:主表必须有主键,主表的关联键和从表的外键类型一致
# 在从表中建
# (4)自定义完整性
# 作用:满足业务需求
# 实现方式:存储过程、触发器
# [1]添加约束
# 1)创建表的同时创建约束
#客户表 从表
CREATE TABLE customer
(
custNo INT(4) PRIMARY KEY AUTO_INCREMENT NOT NULL,
custName VARCHAR(50) UNIQUE KEY,
custAddr VARCHAR(200) NULL DEFAULT '某城市'
typeNo INT(4) NOT NULL,
FOREIGN KEY(typeNo) REFERENCES customerType(custTypeNo) ,
)
/* 外键 关联 主表 关联键 */
#客户类型表 主表
CREATE TABLE customerType
(
custTypeNo INT(4) PRIMARY KEY,
custTypeName VARCHAR(50) NOT NULL
)
CREATE TABLE student
(
stuNo INT(4) ,
stuName VARCHAR(50),
PRIMARY KEY(stuNo,stuName)
)
# 2) 创建表之后追加约束
CREATE TABLE customer
(
custNo INT(4) ,
custName VARCHAR(20),
custTel VARCHAR(11) NOT NULL,
custLevel INT(4) ,
custType INT(4) NOT NULL
)
# [主键、唯一键、默认值、主外键 是可以在建表之后追加约束]
# [自动增长、非空、类型 只能在建表时创建]
# 基本语法:
# Alter table 表名 add constraint 约束名 约束类型(列名)
# 主键:
ALTER TABLE customer ADD CONSTRAINT PK_customer_custNo PRIMARY KEY(custNo)
# 唯一键:
ALTER TABLE customer ADD CONSTRAINT UK_customer_custName UNIQUE KEY(custName)
# 默认值语法:
# ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;
ALTER TABLE customer ALTER custLevel SET DEFAULT 1;
# 主外键语法:
# 主外键:从表的外键关联主表的关联键
# 从表 属于 主表 从表多 对应 主表一
# 从表里的键叫外键 主表里的键叫关联键
# 主外键约束只能在从表里创建,要求主表必须有主键、外键和关联键的类型要一致
# alter table 从表名 add constraint 约束名 FOREIGN KEY(外键列) REFERENCES 主表名(关联键)
ALTER TABLE customer ADD CONSTRAINT FK_customer_customerType FOREIGN KEY(custType) REFERENCES customerType(custTypeNo)
# [2]删除约束
#ALTER TABLE 表名 DROP 约束类型;
#删主键约束
ALTER TABLE customer DROP PRIMARY KEY;
#删唯一键约束
ALTER TABLE customer DROP INDEX UK_customer_custName;
#删默认值
ALTER TABLE customer ALTER custLevel DROP DEFAULT;
#删除主外键
ALTER TABLE customer DROP FOREIGN KEY FK_customer_customerType;
#删除主外键的索引
ALTER TABLE customer DROP INDEX FK_customer_customerType;
# [3]更改表结构
# 修改表名
# ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE customer RENAME AS kehu;
# 添加字段
# ALTER TABLE 表名 ADD 列名 列类型 [约束]
ALTER TABLE kehu ADD custInfo VARCHAR(50) NOT NULL;
# 修改字段
# 列类型 ALTER TABLE 表名 MODIFY 列名 列类型 [约束]
ALTER TABLE kehu MODIFY custinfo CHAR(20) ;
# 列名称 ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型
ALTER TABLE kehu CHANGE custinfo custdesc VARCHAR(50);
#删除字段
#ALTER TABLE 表名 DROP 列名
ALTER TABLE kehu DROP custdesc;
#【二】DCL语句[数据控制语言]
# GRANT、REVOKE COMMIT、ROLLBACK
#grant语句
# 授权功能:添加对表中数据的增删改查权限
# grant 权限 on 数据库名点表名 to 用户
GRANT INSERT,UPDATE,DELETE,SELECT ON ABCDdatabase.student TO ABCD
# 收回权限功能:收回对表中数据的增删改查权限
# REVOKE 权限 ON 数据库对象 FROM 用户
REVOKE INSERT,UPDATE,DELETE ON ABCDdatabase.student FROM ABCD
#做事务的:
#COMMIT语句
# 将数据永久保存到数据库中
#ROLLBACK语句
# 取消当前数据的持久化状态,回退到提交之前
#每一个SQL语句自成一个事务,所以执行单个sql语句也能立即执行保存到数据库
CREATE TABLE bank
(
account VARCHAR(50),
money INT
)
#update修改语句
UPDATE bank SET money=money-500 WHERE account='zhangsan';
UPDATE bank SET money=money+500 WHERE account='lisi';
#取消sql语句的自动提交[取消一个sql语句自成一个事务]
SET autocommit= 0;
#开启事务
START TRANSACTION;
UPDATE bank SET money=money-500 WHERE account='zhangsan';
UPDATE bank SET money=money+500 WHERE account='lisi';
#结束事务
#提交
COMMIT;
#回滚
ROLLBACK;
#sql语句的自动提交
SET autocommit= 1;
#【三】DML语句[数据操作语言]
#新增insert
#1)往已存在的表中插入一条写死数据
# insert into 表名(列名,列名) values(值,值)
INSERT INTO bank(account,money) VALUES ('wangwu',800);
INSERT INTO bank(account) VALUES ('sunba');
INSERT INTO bank(account,sj) VALUES ('sunba','2023-1-1');
INSERT INTO bank(account,money,sj) VALUES ('sunba',DEFAULT,'2023-1-1');
#2)往已存在的表中插入多条数据
# <1>插入多条写死数据
# insert into 表名(列名,列名) values(值,值),(值,值)
INSERT INTO bank(account,money) VALUES ('zhaoliu',600),('tianqi',700);
# <2>从已存在的表中获取数据插入到另一个已存在的表中
# insert into 获得数据的表名(获取数据的列名)
# select 提供数据的列名 from 提供数据的表名
INSERT INTO bank2(zh,ye)
SELECT account,money FROM bank
# <3>往已存在的表中插入多条固定值
# insert into 获得数据的表名(获取数据的列名)
# select 值 union/union all
# select 值
# union合并相同数据,union all不会 不支持default
INSERT INTO bank3(zhanghao,yue)
SELECT 'haha',500 UNION ALL
SELECT 'haha',500
#SELECT 'haha',default
#3)往不存在的表中插入多条数据
# create table 表名(select 提供数据列名 from 提供数据表名)
CREATE TABLE yinhang(SELECT account,money FROM bank)
#已知:数据库中存在student表[学号、姓名、年龄、年级外键]。
#实现:往学生表中插入一条语句。
# 往学生表中插入二条语句。
# 往学生临时表stuTemp[不存在]中插入学生表的所有数据。
#修改update
#语法:update 表名 set 列名=更新值,列名=更新值 where 布尔类型表达式
#条件为true才更新,为false不更新
#整表过滤更新[一行一行更新]
#where省略表示所有条件均为ture
# 且and 或or 非not
UPDATE yinhang SET money = 100, account='zs'WHERE account='zhangsan'
UPDATE yinhang SET money = 100 WHERE account='zhangsan'
UPDATE yinhang SET money = 300 WHERE account='lisi' OR money=100
UPDATE yinhang SET money = 100 WHERE NOT(money = 500)
#删除delete
#语法:delete from 表名 where 布尔类型表达式
#条件为true才删除,为false不删除
#整表过滤删除[一行一行删除]
#where省略表示所有条件均为ture
#注意:
# 删除数据都是删除横着的数据行,不能删除数据列
DELETE FROM bank WHERE account='tianqi'
#关系运算符:and or not
# && || !
#删除truncate
#语法: truncate table 表名
#没有where条件,整表删除
#自动增长列会恢复从1开始
TRUNCATE TABLE kehu
#【四】DQL语句[数据查询语言]
#(1)基本查询语句
#(2)连接(多表)查询语句
#(3)联合查询语句
#(4)子查询语句
#查询语句的作用,将满足条件的数据以结果集的形式返回。
# 1、基本查询语句
# 从单表中取数据显示
# 语法:
# select 列名,列名 显示数据
# from 表名 从表中取数据
# where 布尔条件 整表过滤数据
# group by 分组列 对数据做分类
# having 筛选条件 针对分组后的数据再做过滤
# order by 排序列 对数据排序 asc升序 desc降序
# limit 下标,记录数
# 注意:
# 每种关键字顺序不能改变,但可以缺失。就算缺失,先后顺序也不能改变
# 优先级 高-->低:from --> where --> group by --> having --> order by --> select
# where控制行数,select控制列数
SELECT stuNo,stuName FROM student
SELECT stuNo,stuName FROM student WHERE stuNo = 1
SELECT stuNo,stuName FROM student ORDER BY stuNo DESC
#分组查询:对原表数据做分类,结果集的行数取决于分类的个数
# 显示的列要么出现在分组中,要么出现在聚合函数中
# 多列分组使用逗号隔开,写在前面的先分组,写在后面的后分组
#聚合函数:统计数据的函数。最终得到的是一行一列数据,不能和返回多行多列的数据共同使用
# count(列) 个数
# max(列) 最大值
# min(列) 最小值
# sum(列) 求和
# avg(列) 平均值
SELECT stuName FROM student WHERE stuNo = 1
SELECT gradeId,COUNT(stuNo) FROM student GROUP BY gradeId
SELECT sex, gradeId,COUNT(stuNo) FROM student GROUP BY sex, gradeId
#统计每个年级人数
SELECT gradeId,COUNT(stuNo) FROM student GROUP BY gradeId
#统计最大年龄
SELECT MAX(stuAge) FROM student
#统计每个年级的学生的平均年龄
SELECT gradeId,AVG(stuAge) FROM student GROUP BY gradeId
#统计低年级的学生人数[12年级]
SELECT COUNT(1) FROM student WHERE gradeId < 3
#统计人数超过1个的年级
SELECT gradeId,COUNT(1) FROM student GROUP BY gradeId HAVING COUNT(1) >1
#查询最大年龄前两名
SELECT * FROM student ORDER BY stuAge DESC LIMIT 0,2
#2、连接(多表)查询语句
CREATE TABLE ta
(
id INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL
)
CREATE TABLE tb
(
id INT(4) NOT NULL,
`name` VARCHAR(20) NOT NULL
)
# 从多张表中取数据显示
# [1]内连接 【取两个表的共有数据:在两个表中都具有的关联键,所对应的数据】
# (1)语法:from A inner join B on A.关联键=B.关联键
SELECT * FROM ta INNER JOIN tb ON ta.id=tb.id
# (2)语法:from A,B where A.关联键=B.关联键
SELECT * FROM ta,tb WHERE ta.id=tb.id
#学生表 学号 姓名
#成绩表 学号 成绩
#查询参加考试的学生信息[姓名、成绩]
# [2]外连接
# (1)左(外)连接 【以左表为主表,右表关联左表,左表的数据一定全显示,右表的数据能关联上就显示,关联不上不显示或空代替】
# 语法:from A left join B on A.关联键=B.关联键
SELECT * FROM ta LEFT JOIN tb ON ta.id=tb.id
# (2)右(外)连接 【以由表为主表,左表关联右表,右表的数据一定全显示,左表的数据能关联上就显示,关联不上不显示或空代替】
# 语法:from A right join B on A.关联键=B.关联键
SELECT * FROM ta RIGHT JOIN tb ON ta.id=tb.id
SELECT * FROM tb LEFT JOIN ta ON ta.id=tb.id
#参加考试的学生信息
SELECT * FROM student LEFT JOIN score ON student.stuNo=score.stuId
# (3)完全连接 【两个的数据都要显示,关联不上的以空代替】【Mysql不支持】
# 语法:from A full join B on A.关联键=B.关联键
SELECT * FROM ta FULL JOIN tb ON ta.id=tb.id
1 a1 2 b2
2 a2 3 b3
-------------------
1 a1 NULL NULL
2 a2 2 b2
NULL NULL 3 b3
# [3]交叉连接 【一张表的每条数据都和另一张表的所有记录关联】
# 语法:from A cross join B 【没有on】
SELECT * FROM ta CROSS JOIN tb
# 非要加关联条件,只能在where里加。加完就变成内连接
SELECT * FROM ta CROSS JOIN tb WHERE ta.id=tb.id
#学生表:学号 姓名 年龄 年级编号
#年级表:编号 名称
#只显示学生姓名 和 年级名称
#语法:from A left join B on A.关联键=B.关联键
#学生表:学号 姓名 年龄 年级编号
#成绩表:编号 成绩 学生编号
SELECT studentName,studentResult
FROM student LEFT JOIN result ON student.studentNo=result.studentNo
WHERE studentresult IS NULL
SELECT * FROM ta
INNER JOIN tb ON ta.id = tb.id
INNER JOIN tc ON tc.id = ta.id/tb.id
SELECT * FROM ta,tb,tc WHERE ta.id = tb.id AND tc.id = ta.id/tb.id
#3、联合查询语句
# 合并结果集
# 语法: select 列 from A union / union all
# select 列 from B
# 注意:多个结果集的列必须满足:个数、类型、顺序都一致才能合并
# 默认以第一个结果集的列名做为最终结果集列名
SELECT id,NAME FROM ta;
SELECT id,NAME FROM tb;
SELECT id,NAME FROM ta
UNION
SELECT id,NAME FROM tb;
SELECT gradeId,gradeName FROM grade
UNION ALL
SELECT id,NAME FROM tb;
#查询17岁以下学生
#查询17岁以上学生
#合并结果集
#4、子查询语句
# 当一个sql语句的数据由另一个查询语句提供,这个查询语句称为子查询
# sql语句称为父查询
# 子查询必须用()括起来
#[1]使用场景一:子查询作为条件使用
# 语法: 父查询的 where 列 =/in (子查询)
#查询“一年级”的学生 / 低年级学生
#父查询:学生
#子查询是条件:一年级
# 将已知条件的名称转变为学生表能识别的年级编号
# select gradeId from grade where gradeName = '一年级'
SELECT * FROM student WHERE gradeId = (SELECT gradeId FROM grade WHERE gradeName = '一年级')
SELECT * FROM student WHERE gradeId IN (SELECT gradeId FROM grade WHERE gradeName = '一年级' OR gradeName = '二年级')
#注意:
# 子查询相对父查询优先执行[因为子查询在()里]
# 要求子查询返回结果的个数必须和父查询的条件对应:= 后的子查询只能返回一个值
# 子查询的结果不止一个值,父查询条件用in连接
# [2]使用场景二:子查询作为结果集使用
# 语法: from (子查询) tn
# 注意:结果集的子查询必须加别名
#每个年级的人数
SELECT gradeId,COUNT(1) FROM student GROUP BY gradeId
#查询统计一年级的人数
SELECT gradeId,rs FROM (SELECT gradeId,COUNT(1) AS rs FROM student GROUP BY gradeId) AS tb WHERE gradeId != 1
# [3]使用场景三:子查询作为列使用
# 语法: select (子查询) as 列名 from 表
#查询学生信息(显示 学生学号、学生姓名、年级编号-> 年级名称 )
SELECT stuNo,stuName, gradeId FROM student
SELECT stuNo,stuName, (SELECT gradename FROM grade WHERE grade.gradeId=student.gradeId) mc FROM student
#注意:
#在mysql数据库中,
# 字符串和字符是不做区分的,只有单引号,没有双引号
# 关系(比较)运算符中的判断相等使用的是 = , 没有==
SELECT stuNo AS 学号 FROM student stu WHERE stuNo=2
#列起别名
# 真实列名 as 别名
# 真实列名 别名
# 表名 别名
# 表名 as 别名
# 子查询作为结果集必须起别名
#运算符
#赋值运算符/关系运算符比较相等 =
#算数运算符 + - * / % 【数据库里的+不在作为连接符用了,要求+两边的类型必须一致,都数值型才能运算】
#关系运算符 > < >= <= = != <>
#逻辑运算符 and or not
#MySQL中的函数:
#1、字符串函数
#2、数学函数
#3、日期函数
#4、高级函数
#一、字符串函数
#★1)CHAR_LENGTH(s) 返回字符串 s 的字符数[长度]
SELECT CHAR_LENGTH("RUNOOB") AS LengthOfString;
#★2)CONCAT(s1,s2...sn) 多个字符串合并为一个字符串
SELECT CONCAT("SQL ", "Runoob ", "Gooogle ", "Facebook") AS ConcatenatedString;
#3)FIELD(s,s1,s2...) 返回第一个字符串 s 在字符串列表(s1,s2...)中的位置
SELECT FIELD("c", "a", "b", "c", "d", "e");
#4)FIND_IN_SET(s1,s2) 返回在字符串s2中与s1匹配的字符串的位置
SELECT FIND_IN_SET("c", "a,b,c");
#5)FORMAT(x,n) 格式化 "#,###.##", 将 x 保留到小数点后 n 位,最后一位四舍五入
SELECT FORMAT(250500.5684, 2);
#★6)INSERT(s1,x,len,s2) 字符串 s2 替换 s1 的 x 位置开始长度为 len 的字符串
SELECT INSERT("google.com", 1, 3, "runoob");
#7)LEFT(s,n) 返回字符串 s 的前 n 个字符
SELECT LEFT('runoob',2)
#8)RIGHT(s,n) 返回字符串 s 的后 n 个字符
SELECT RIGHT('runoob',2)
#★9)LOWER(s) 将字符串 s 的所有字母变成小写字母
SELECT LOWER('RUNOOB')
#★10)UPPER(s) 将字符串转换为大写
SELECT UPPER("runoob");
#11)LPAD(s1,len,s2) 在字符串 s1 的开始处填充字符串 s2,使字符串长度达到 len
SELECT LPAD('abc',2,'xx')
#12)RPAD(s1,len,s2) 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len
SELECT RPAD('abc',5,'xx')
#13)LTRIM(s) 去掉字符串 s 开始处的空格
SELECT LTRIM(" RUNOOB ") AS LeftTrimmedString;
#14)RTRIM(s) 去掉字符串 s 结尾处的空格
SELECT RTRIM(" RUNOOB ") AS RightTrimmedString
#★15)TRIM(s) 去掉字符串 s 开始和结尾处的空格
SELECT TRIM(" RUNOOB ") AS TrimmedString
#16)MID(s,n,len) 从字符串 s 的 n 位置截取长度为 len 的子字符串,同 SUBSTRING(s,n,len)
SELECT MID("RUNOOB", 2, 3) AS ExtractString;
#★17)POSITION(s1 IN s) 从字符串 s 中获取 s1 的开始位置
SELECT POSITION('b' IN 'abc')
#18)REPEAT(s,n) 将字符串 s 重复 n 次
SELECT REPEAT('runoob',3)
#★19)REPLACE(s,s1,s2) 将字符串 s2 替代字符串 s 中的字符串 s1
SELECT REPLACE('abc','a','x')
#20)REVERSE(s) 将字符串s的顺序反过来
SELECT REVERSE('abc')
#21)SPACE(n) 返回 n 个空格
SELECT SPACE(10)
#22)STRCMP(s1,s2) 比较字符串 s1 和 s2,如果 s1 与 s2 相等返回 0 ,如果 s1>s2 返回 1,如果 s1
#23)SUBSTR(s, start, length) 从字符串 s 的 start 位置截取长度为 length 的子字符串
SELECT SUBSTR("RUNOOB", 2, 3) AS ExtractString
#★24)SUBSTRING(s, start, length) 从字符串 s 的 start 位置截取长度为 length 的子字符串,等同于 SUBSTR(s, start, length)
SELECT SUBSTRING("RUNOOB", 2, 3) AS ExtractString
#25)SUBSTRING_INDEX(s, delimiter, number) 返回从字符串 s 的第 number 个出现的分隔符。
# 如果 number 是正数,返回第 number 个字符左边的字符串。
# 如果 number 是负数,返回第(number 的绝对值(从右边数))个字符右边的字符串。
SELECT SUBSTRING_INDEX('a*b*c*d*e','*',3)
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1)
#二、数学函数
#★1)ABS(x) 返回 x 的绝对值
SELECT ABS(-1)
#★2)AVG(expression) 返回一个表达式的平均值,expression 是一个字段
SELECT AVG(gradeId) FROM student;
#★3)CEIL(x) 返回大于或等于 x 的最小整数
SELECT CEIL(1.1)
#★4)COUNT(expression) 返回查询的记录总数,expression 参数是一个字段或者 * 号
SELECT COUNT(stuage) AS NumberOfAge FROM student;
#5)EXP(x) 返回 e 的 x 次方
SELECT EXP(1)
#★6)FLOOR(x) 返回小于或等于 x 的最大整数
SELECT FLOOR(1.9)
#★7)MAX(expression) 返回字段 expression 中的最大值
SELECT MAX(gradeId) FROM student;
#★8)MIN(expression) 返回字段 expression 中的最小值
SELECT MIN(gradeId) FROM student;
#9)MOD(x,y) 返回 x 除以 y 以后的余数
SELECT MOD(5,2)
#10)PI() 返回圆周率(3.141593)
SELECT PI()
#11)POW/POWER(x,y) 返回 x 的 y 次方
SELECT POW(2,3)
#12)RAND() 返回 0 到 1 的随机数
SELECT RAND()
#13)SQRT(x) 返回x的平方根
SELECT SQRT(9)
#★14)SUM(expression) 返回指定字段的总和
SELECT SUM(gradeId) FROM student;
#15)TRUNCATE(x,y) 返回数值 x 保留到小数点后 y 位的值(不四舍五入)
SELECT TRUNCATE(1.23456,3)
#三、日期函数
#★1)ADDDATE(d,n) 计算起始日期 d 加上 n 天的日期
SELECT ADDDATE("2022-10-12", 20);
#2)ADDTIME(t,n) 在t时间上添加n表示式[时分秒]
SELECT ADDTIME("2022-10-12 15:17:41", "1:1:20");
#3)CURDATE() 返回当前年月日
SELECT CURDATE();
#4)CURRENT_DATE() 返回当前年月日
SELECT CURRENT_DATE()
#5)CURRENT_TIME() 返回当前时分秒
SELECT CURRENT_TIME();
#6)SELECT CURRENT_TIME() 返回当前年月日时分秒
SELECT CURRENT_TIMESTAMP()
#7)DATE() 从日期或日期时间表达式中提取日期值
SELECT DATE("2022-06-15")
#★8)DATEDIFF(d1,d2) 计算日期 d1->d2 之间相隔的天数
SELECT DATEDIFF('2022-03-02','2022-01-01')
#9)DATE_ADD(d,INTERVAL expr type) 计算起始日期 d 加上一个时间段后的日期 [时间类型可变]
SELECT DATE_ADD("2022-10-12", INTERVAL 10 DAY);
SELECT DATE_ADD("2022-10-12", INTERVAL -3 MONTH);
SELECT DATE_ADD("2022-10-12", INTERVAL 1 YEAR);
#10)DATE_FORMAT(d,f) 按表达式 f的要求显示日期 d
SELECT DATE_FORMAT('2022-10-12 11:11:11','%Y-%m-%d %r')
#11)DATE_SUB(date,INTERVAL expr type) 从日期减去指定的时间间隔
SELECT DATE_SUB('2022-10-12',INTERVAL 2 DAY)
#12)DAY(d) 返回日期值 d 的日期部分
SELECT DAY("2022-10-12");
#13)DAYNAME(d) 返回日期 d 是星期几
SELECT DAYNAME('2022-10-12')
#14)DAYOFMONTH(d) 计算日期 d 是本月的第几天
SELECT DAYOFMONTH('2022-10-12')
#15)DAYOFWEEK(d) 日期 d 今天是星期几 1 星期日
SELECT DAYOFWEEK('2022-10-12')
#16)DAYOFYEAR(d) 计算日期 d 是本年的第几天
SELECT DAYOFYEAR('2022-10-12')
#17)HOUR(t) 返回 t 中的小时值
SELECT HOUR('2022-10-12 15:56:41')
#18)LAST_DAY(d) 给给定日期的那一月份的最后一天
SELECT LAST_DAY("2022-10-12");
#19)LOCALTIME() 返回当前日期和时间
SELECT LOCALTIME()
#20)LOCALTIMESTAMP() 返回当前日期和时间
SELECT LOCALTIMESTAMP()
#21)MINUTE(t) 返回 t 中的分钟值
SELECT MINUTE('2022-10-12 15:56:41')
#22)MONTHNAME(d) 返回日期当中的月份名称,如 November
SELECT MONTHNAME('2022-10-12 15:56:41')
#23)MONTH(d) 返回日期d中的月份值,1 到 12
SELECT MONTH('2022-10-12 15:56:41')
#24)NOW() 返回当前日期和时间
SELECT NOW()
#25)QUARTER(d) 返回日期d是第几季节,返回 1 到 4
SELECT QUARTER('2022-10-12 15:56:41')
#26) SECOND(t) 返回 t 中的秒钟值
SELECT SECOND('2022-10-12 15:56:41')
#27)SEC_TO_TIME(s) 将以秒为单位的时间 s 转换为时分秒的格式
SELECT SEC_TO_TIME(4321)
#28)STR_TO_DATE(string, format_mask) 将字符串转变为日期
SELECT STR_TO_DATE("August 10 2017", "%M %d %Y");
#29) SUBDATE(d,n) 日期 d 减去 n 天后的日期
SELECT SUBDATE('2022-10-12 15:56:41', 10)
#30)SUBTIME(t,n) 时间 t 减去 n 秒的时间
SELECT SUBTIME('2022-10-12 15:56:41', 5)
#31)SYSDATE() 返回当前日期和时间
SELECT SYSDATE()
#32) TIME(expression) 提取传入表达式的时间部分
SELECT TIME("19:30:10");
#33)TIME_TO_SEC(t) 将时间 t 转换为秒
SELECT TIME_TO_SEC('1:12:00')
#34)TIMEDIFF(time1, time2) 计算时间差值
SELECT TIMEDIFF("13:10:11", "13:10:10");
#35)TO_DAYS(d) 计算日期 d 距离 0000 年 1 月 1 日的天数
SELECT TO_DAYS('0001-01-01 01:01:01')
#36)WEEK(d) 计算日期 d 是本年的第几个星期,范围是 0 到 53
SELECT WEEK('2022-10-12')
#37)WEEKDAY(d) 日期 d 是星期几,0 表示星期一,1 表示星期二
SELECT WEEKDAY("2022-10-12");
#38) WEEKOFYEAR(d) 计算日期 d 是本年的第几个星期,范围是 0 到 53
SELECT WEEKOFYEAR('2022-10-12')
#39) YEAR(d) 返回年份
SELECT YEAR("2022-10-12");
#40)YEARWEEK(date, mode) 返回年份及第几周(0到53),mode 中 0 表示周天,1表示周一,以此类推
SELECT YEARWEEK("2022-10-12");
#四、高级函数
# IF(expr,v1,v2)如果表达式 expr 成立,返回结果 v1;否则,返回结果 v2
SELECT IF(100 > 10,'正确','错误')
# CURRENT_USER()/SESSION_USER()/SYSTEM_USER()/USER()返回当前用户
SELECT CURRENT_USER()
# DATABASE()返回当前数据库名
SELECT DATABASE()
# VERSION()返回数据库的版本号
SELECT VERSION()
#分页查询
#limit 第一条记录的下标[下标从0开始],显示记录数
#写在基本SQL语句的最后面[在order by 之后]
#每页显示五条,12条显示3页
#页码数pageNo 每页显示记录数pageSize
# pageIndex = (pageNo-1)*pageSize
# pageSize
# pageNo 1 2 3 4
# pageIndex 0 5 10 15
# 总结:limit (pageNo-1)*pageSize, pageSize
# 在SQL语句中,limit 后面的数据必须是直接数据,不能计算。
#SELECT * FROM student LIMIT (1-1)*5,5 错误的
SELECT * FROM student LIMIT 5,5
#模糊查询
#like '%X%' %表示匹配任意多个字符(支持0个) _表示任意一个字符(不支持0个)
# 姓张的: stuName like '%张%'
SELECT * FROM student WHERE stuName LIKE '%s%'
SELECT * FROM student WHERE stuName LIKE 'z_'
#模糊查询实现:科目名称有“小”字的
#between 小值 and 大值 包含两端值,只要是连续的数据都可使用
SELECT * FROM customer WHERE custLevel BETWEEN 2 AND 8
SELECT * FROM customer WHERE custName BETWEEN 'b' AND 'w'
SELECT * FROM 表 WHERE 时间 BETWEEN '2022-10-01' AND '2022-10-12'
#in(x,x....) / not in() 在范围内匹配值,范围里的数据是精确值
SELECT * FROM student WHERE stuName IN ('z','z%')
#使用in模糊查询学生年龄是16和18岁的
#in会结合子查询实现:查询非类型一的客户信息
#(1)查询不是类型一的类型 select custTypeNo from customertype where custTypeName != 'lx1'
#(2)查询客户
SELECT * FROM kehu WHERE custType IN (SELECT custTypeNo FROM customertype WHERE custTypeName != 'lx1')
#判断空
# (1)该列默认为空,你没维护
# is null / is not null
SELECT * FROM grade WHERE gradeName IS NULL
# (2)该列允许为空,你删成空
# = '' / != ''
SELECT * FROM grade WHERE gradeName = ''