您现在的位置是:首页 >技术教程 >SQL(--修改中--)网站首页技术教程
SQL(--修改中--)
目录
一、基本介绍
- sql是一种语言。
- mysql是一种关系型数据库管理系统RDBMS(Relational Database Management System)
- MySQL 使用标准的 SQL 数据语言形式
代码规范:
- SQL语句不区分大小写,但建议关键字大写、数据列和表名小写
基础概念:
- 关系型数据库,是指建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
语法:
1、注释符号:
- -- 两个横杠加一个空格,注释单行
- /*注释多行*/
条件判断符 说明 = 相等 <>, != 不相等 < 小于 <= 小于或等于 > 大于 >= 大于或等于 BETWEEN 位于两值之间
二、常用函数
常用函数:
- 数学函数
- 集合函数
- 字符串函数
- 日期和时间函数
- 条件判断函数
- 系统信息函数
- 加密函数
- 其他函数
集合函数
集合函数 解释 AVG() 返回某列的平均值 COUNT(*) 返回表中的总行数 COUNT(字段名) 返回指定列的总行数 MAX() 返回某列的最大值
(数值、字符、字符串)
MIN() 返回某列的最小值 SUN() 返回某列值的和
- 集合函数无法嵌套,括号里不能是语句
- 集合函数可以把空值转成 null 输出
- HAVING后面可以接集合函数,WHERE后面不可以
- AVG(条件)相当于SUM(IF(条件,1,0))/COUNT(全体)
字符串函数
字符串函数 解释 CHAR_LENGTH(str) 返回字符串的长度 CONCAT(s1,s2...) 拼接字符串
(有任一参数为NULL,返回NULL)
CONCAT(x,s1,s2...) 把分隔符x放在要拼接的字符串之间
(有分隔符时,可忽视参数中出现的NULL)
ELT(n,s1,s2,s3...) 返回第n个字符串
若无符合,则返回NULL
FIELD(s,s1,s2...sn) 返回s在列表s1,s2...sn中第一次出现的位置
(s1的位置为1)
FIND_IN_SET(s1,s2) 返回字符串s1在字符串列表s2中出现的位置 INSERT(s1,x,len,s2) 截取len长度的s2的子串替换s1下标从x开始的部分,
最终返回替换后的s1
LOWER(str)或LCASE(str) 把字符串里的字符全部转成小写 LENGTH(str) 返回字符串包含的字符个数 LEFT(s,n) 返回字符串s最左边的n个字符 LPAD(s1,len,s2) 填充字符串。
要返回的s1长度必须是len,
不够长就用s2从s1左边开始补,
超长就截断s1右边多余的部分
LTRIM(s) 删除字符串s左边的空格字符后返回s LOCATE(s1,s2)
或POSITION(s1 IN s2)
或INSTR(s2,s1)
返回s1在s2中开始的位置 MAKE_SET(x,s1,s2...sn) 把x换成二进制数,返回列表s1,s2...sn中与二进制数中1出现的位置相对应的字符串 RIGHT(s,n) 返回字符串s最右边的n个字符 RPAD(s1,len,s2) 填充字符串。
要返回的s1长度必须是len,
不够长就用s2从s1右边开始补,
超长就截断s1右边多余的部分
RTRIM(s) 删除字符串s右边的空格字符后返回s REPEAT(s,n) 返回一个由字符串s重复n次组成的字符串 REPLACE(s,s1,s2) 用s2替代s中所有的s1 REVERSE(s) 返回反转后的s SPACE(n) 返回一个由n个空格组成的字符串 STRCMP(s1,s2) 比较s1和s2的大小
相同:返回0
小于:返回-1
其他:返回1
SUBSTRING(s,n,len)
或MID(s,n,len)
截取返回s中下标从n开始的len长度的子串(从1开始计算)
(n>0时,从左边开始;n<0,右边)
SUBSTRING_INDEX(s,delim,count) count为正数,代表从s左边取标识符delim出现第count次之前的子串;负数则从右边。 TRIM(s) 删除字符串s左右两端的空格字符后返回s TRIM(s1 FROM s) 删除字符串s左右两端所有的子串s1 UPPER(str)或UCASE(str) 把字符串里的字符全部转成大写
MYSQL的日期和时间函数
日期和时间函数 解释 CURDATE()或CURRENT_DATE() 将当前日期按照YYYY-MM-DD
或YYYYMMDD格式的值返回
CURDATE()+0 将当前日期转换成数值型YYYYMMDD
CURTIME()或CURRENT_TIME() 将当前时间以HH:MM:SS
或HHMMSS的格式返回
CURTIME()+0 将当前日期转换成数值型HHMMSS CURRENT_TIMESTAMP()
或LOCALTIME()
或NOW()
或SYSDATE()
返回当前日期和时间值
格式:YYYY-MM-DD HH:MM:SS
或YYYYMMDDHHMMSS
UNIX_TIMESTAMP(NOW())
或UNIX_TIMESTAMP()
返回一个UNIX时间戳
1970-01-01 00:00:00 GMT之后的秒数
UNIX_TIMESTAMP(date) 返回形式为date类型 FROM_UNIXTIME(date) 把date(秒数)转换成普通格式时间
YYYY-MM-DD HH:MM:SS
UTC_DATE() 返回当前UTC(世界标准时间)日期值
格式:YYYY-MM-DD或YYYYMMDD
UTC_DATE()+0 将当前日期转换成数值型YYYYMMDD UTC_TIME() 返回当前UTC(世界标准时间)时间值
格式:HH:MM:DD
UTC_TIME()+0 将当前时间转换成数值型HHMMDD MONTH(date)
返回date对应的月份 MONTHNAME(date) 返回date对应月份的英文全名 DAY(date) 返回date对应的工作日 DAYNAME(d) 返回d对应工作日的英文全名 DAYOFWEEK(d) 返回d对应的星期
2表示周一
WEEKDAY(d) 返回d对应的星期
0表示周一
WEEK(d) 计算d是一年中的第几周
第二个参数默认为0
(表示指定一周的第一天是周日)
DAYOFYEAR(d) 返回日期d是一年中的第几天(1~366) DAYMONTH(d) 返回日期在一个月中的位置(1~31) YEAR(date) 返回日期date对应的年份(1970~2069) QUARTER(date) 返回日期date对应的一年中
的季度值 (1~4)
MINUTE(time) 返回time对应的分钟数(0~59) SECOND(time) 返回指定时间的秒值(0~59) EXTRACT(type FROM date) 从date中提取type类型的日期部分
如从2018-07-02中提取年份2018
TIME_TO_SEC(time) 返回已转化为秒的time参数 SEC_TO_TIME(seconds) 把秒数seconds转化成时间格式
HH:MM:SS
DATE_FORMAT(date,format) 根据format指定的格式显示date值 TIME_FORMAT(time,format) 根据format指定的格式显示time值 GET_FORMAT(val_type,format_type) 返回日期时间字符串的显示格式 SQL重要的内建日期函数
日期函数 解释 GETDATE() 返回当前日期和时间 DATEPART() 返回日期/时间的单独部分 DATEADD() 在日期中添加或减去指定的时间间隔 DATEDIFF() 返回两个日期之间的时间 CONVERT() 用不同的格式显示日期/时间
MYSQL重要的内建日期函数
函数 解释 NOW() 返回当前的日期和时间 CURDATE() 返回当前的日期 CURTIME() 返回当前的时间 DATE() 提取日期或日期/时间表达式的日期部分 EXTRACT() 返回日期/时间按的单独部分 DATE_ADD() 给日期添加指定的时间间隔 DATE_SUB() 从日期减去指定的时间间隔 DATEDIFF() 返回两个日期之间的天数 DATE_FORMAT() 用不同的格式显示日期/时间
条件判断函数
条件判断函数 解释 IF(expr,v1,v2) 如果表达式expr为TRUE
则返回值v1,否则返回值为v2
IFNULL(v1,v2) 如果v1不为NULL,则返回v1
否则返回v2
CASE
expr
WHEN v1 THEN r1
...
[ELSE rn+1]
END
如果expr值等于某个vn,则返回
对应位置THEN后面的结果,
否则返回ELSE后面的rn+1
三、操作
单表查询
- SELECT * FROM 表名;——查询所有字段
- SELECT 列名 FROM 表名;——查询指定字段
- SELECT 列名1,列名2,…… FROM 表名;——查询指定的多个字段
SELECT 列名1,列名2,…… FROM 表名 WHERE 查询条件; -- 查询指定记录
……
WHERE 字段值 IS NOT NULL;——字段值不为空
……
WHERE 字段值 IS NULL;——字段值为空
……
WHERE 条件1 AND 条件2;——查询同时满足条件1和条件2的结果
……
WHERE 条件1 OR 条件2;——查询满足条件1或条件2的结果(AND先于OR)
SELECT id,name FROM fruits WHERE id IN (1,2); -- 查询id等于1或2的水果……(NOT IN:不满足条件)
SELECT id,name FROM fruits WHERE id BETWEEN 1 AND 4; -- 查询id在范围 [1,4] 内的水果id和name
SELECT id,name FROM fruits WHERE name LIKE 'b%'; -- 查询name以b开头的水果
%b:以b结尾
%b%:包含字母b
a%b:以a开头,以b结尾
_ _ _ _b:以b结尾,且前面只有4个字符(‘_’间没有空格)
SELECT DISTINCT 字段名 FROM 表名;——去重查询
SELECT id FROM fruits ORDER BY id; -- 查询id,并排序(默认升序)
多列进行排序,用逗号隔开,优先级从左往右降低
ORDER BY id DESC;——降序(DESC只对一列有效,按需在列名后添加)
…… GROUP BY 字段 HAVING 条件表达式; -- 分组查询(G和H经常同用)
GROUP BY 可根据多字段的值进行分组,从左往右,层次递进,不断细分
优先级:from>on>where>group by>having>order by>limit
FROM:先知道数据从哪张表取
WHERE:取哪些数据
GROUP BY:对数据进行分组
HAVING:对分组后的数据进行过滤
ORDER BY:对过滤后的数据进行排序
LIMIT:取结果的哪几行数据
GROUP_CONCAT( [DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'] ) -- 把查询到的多个数据拼接在一起输出,用指定分隔符输出(默认为逗号,默认为升序)
SELECT id COUNT(*) Total FROM fruits GROUP BY id WITH ROLLUP; -- 添加一列。在每行后面添加该组的总数
LIMIT [位置偏移量],行数
LIMIT 4,3;——从第5个记录开始,返回3行记录
LIMIT 3;——默认从第1个记录开始,返回3行记录
多表查询
1、内连接查询:
使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,组合成新的记录。
在内连接查询中,只有满足条件的记录才能出现在结果关系中。
- 自连接: SELECT FROM WHERE 或 ANSI
- 指表与其自身进行连接
-- 法一:使用关键字"SELECT FROM WHERE" SELECT s.name FROM s,t WHERE s.classno=t.classno AND t.name="t1"; -- 法二:采用ANSI连接语法形式 SELECT s.name FROM s INNER JOIN t ON s.classno=t.classno AND t.name="t1";
- 使用INNER JOIN语法能够确保不会忘记连接条件,而WHERE子句在某些时刻会影响查询的性能
- 等值连接: =
- 在关键字ON后的匹配条件中通过等于关系运算符(=)来实现等值条件
-- 法一:使用关键字"SELECT FROM WHERE" SELECT s.name,t.name FROM s,t WHERE s.classno=t.classno; -- 法二:采用ANSI连接语法形式 SELECT s.name,t.cname FROM s INNER JOIN t ON s.classno=t.classno;
- 不等连接: >, >=, <, <=, != 等
- 指在关键字ON后的匹配条件中除了等于关系运算符来实现不等条件外,还可以使用包含>, >=, <, <=, != 等关系运算符。
-- 法一:使用关键字"SELECT FROM WHERE" SELECT s.name,t.name FROM s,t WHERE s.classno!=t.classno AND s.id>t.id; -- 法二:采用ANSI连接语法形式 SELECT s.name,t.name FROM s INNER JOIN t ON s.classno!=t.classno AND s.id>t.id;
2、外连接查询:
外连接查询会返回所操作的表中至少一个表的所有数据记录。
与内连接相比,多了某些不满足比较条件的数据
- 左外连接:LEFT JOIN
- 返回包括左表中的所有记录和右表中连接字段相等的记录
- 左连接全名又称为左外连接, left join = left outer join
SELECT field FROM tablename1 LEFT [OUTER] JOIN tablename2 ON CONDITION
- 右外连接:RIGHT JOIN
- 返回包括右表中的所有记录和左表中连接字段相等的记录
SELECT 字段名 FROM tablename1 RIGHT [OUTER] JOIN tablename2 ON CONDITION
- 全外连接:FULL JOIN
SELECT 字段名 FROM tablename1 FULL [OUTER] JOIN tablename2 ON CONDITION
3、复合条件连接查询:INNER JOIN
通过添加过滤条件限制查询的结果,使查询的结果更加准确
SELECT s.name FROM s INNER JOIN t ON s.id=t.id AND s.id=1001;
4、合并查询数据记录
- 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。
- 合并时,两个表对应的列数和数据类型必须相同。
- 各个SELECT语句之间使用UNION或UNION ALL关键字分隔。
- UNION不使用关键字ALL,执行的时候删除重复的记录,所有返回的行都是唯一的。
- 使用关键字ALL的作用是不删除重复行也不对结果进行自动排序。(尽量不用ALL)
SELECT column,... FROM table1 UNION [ALL] SELECT column,... FROM table2
5、子查询
指一个查询语句嵌套在另一个查询语句内部的查询。
- ALL
SELECT num1 FROM s WHERE s>ALL ( SELECT num2 FROM t; ) -- 返回s表中比t表的num2列所有值都大的值
- EXISTS
- NOT EXISTS与EXISTS使用方法相同,返回结果相反
SELECT * FROM s WHERE nums>4 AND EXISTS(SELECT name FROM t WHERE id=9); -- t表中是否存在id=9的数据,如果存在,就查询s表中的nums>4的记录
IN
NOT IN 与IN使用方法相同,返回结果相反
SELECT c_id FROM orders WHERE o_num IN(SELECT o_num FROM orderitems WHERE f_id='c0'); -- 在orderitems表中,查询f_id为c0的订单号,并根据订单号查询具有订单号的客户c_id
- 比较运算符
- >, >=, <, <=, !=等比较运算符
使用正则表达式查询
语法:
SELECT 列名 FROM 表名 WHERE 字段值 REGEXP '正则表达式' ;
添加:
-- 基本语法结构 UPDATE table_name SET column_name1 = value1,column_name2 = value2,...,column_namen = valuen WHERE (condition);
修改:
删除:
-- 基本语法结构 DELETE FROM table_name [WHERE <condition>];
TRUNCATE TABLE table_name;-- 删除整个表
四、MYSQL存储函数/自定义函数
- 存储过程和函数是事先经过编译并存储在数据库中的一SQL语句的集合
存储过程和函数的区别:
- 函数必须有返回值
- 存储过程没有返回值
创建存储过程的基本语法结构:
一:基本形式
CREATE PROCEDURE 存储过程名称(参数...) BEGIN sql语句; END;
二:修改结束符
DELIMITER$ -- 将MYSQL的结束符设置为$,默认是; CREATE PROCEDURE 存储过程名称(参数...) BEGIN sql语句; END$ -- 结束存储过程 DELIMITER ;-- 恢复默认结束符 CALL 存储过程名称(实际参数); -- 调用存储过程
创建存储函数
CREATE FUNCTION 存储函数名称([[IN|OUT|INOUT]存储函数参数列表]) -- IN:输入参数 OUT:输出参数 INOUT:既是输入也可是输出参数。默认为IN型 RETURNS type -- 函数返回数据的类型 RETURN value -- value是sql语句
DELIMITER $ CREATE FUNCTION 存储函数名称([[IN|OUT|INOUT]存储函数参数列表]) -- IN:输入参数 OUT:输出参数 INOUT:既是输入也可是输出参数。默认为IN型 RETURNS type -- 函数返回数据的类型 BEGIN [DECLARE 变量名称 变量类型 [DEFAULT 变量值];] [SET 变量名称 = 变量值;] RETURN value -- value是sql语句 END DELIMITER ;
变量
-- 定义变量 DECLARE 变量名称 变量类型 [DEFAULT 变量值] -- 如果没有DEFAULT语句,默认值为null --变量赋值 SET 变量名称 = 变量值; -- 多个变量赋值 SELECT 字段名称[,...] INTO 变量名称[,...] 查询条件表达式
五、视图
视图:
六、事务
事务: