当前位置 : 主页 > 编程语言 > 其它开发 >

sql 基础详细(持续更新)

来源:互联网 收集:自由互联 发布时间:2022-05-30
sql 基础详细(持续更新) SQL基础一、查询基础语句查询语句的语法格式 Select * from 表名 where 条件; 具体演示 //创建一个学生成绩表create table Student_grade(St_Num int,St_Class varchar(200),St_Name v
sql 基础详细(持续更新) sql 基础详细(持续更新) SQL基础 一、查询基础语句 查询语句的语法格式
Select * from 表名 where 条件;
具体演示
//创建一个学生成绩表
create table Student_grade(
St_Num int,
St_Class varchar(200),
St_Name varchar(64),
St_Grade float
);
//添加数据
insert into Student_grade values(1,1.3,'tom',85);
insert into Student_grade values(2,1.2,'bob',64);
insert into Student_grade values(3,1.1,'tds',59);
insert into Student_grade values(4,1.1,'tnw',90);
insert into Student_grade values(5,1.3,'rose',89);
insert into Student_grade values(6,1.2,'nic',42);
查询表中数据
select * from Student_grade;
St_Num St_Class St_Name St_Grade 1 1.3 tom 85 2 1.2 bob 64 3 1.1 tds 59 4 1.1 tnw 90 5 1.3 rose 89 6 1.2 nic 42
常用的比较函数 运算符 描述 > 大于 < 小于 = 等于 >= 大于等于 <= 小于等于 !=/<> 不等于

where后加条件对表中的书局进行筛选。

//找到不及格的同学
select * from Student_Grade where St_Grade<60;
//找到成绩大于80的同学
select * from Student_Grade where St_Grade>80;
//找到班级为'1.2'的同学
select * from Student_Grade where St_Class=1.2;
//找到班级是1.1或1.2且成绩在60和90之间的同学
select *from Student_Grade where (St_Class='1.1' or St_Class = '1.2') and St_Grade between 60 and 90;

(https://img2022.cnblogs.com/blog/1450099/202203/1450099-20220323235521220-2099370277.png)


逻辑函数 运算符 描述 All 所有运算符用于比较的值到另一个值组中的所有值 AND AND运算符允许多个条件的存在,在一个SQL语句中的WHERE子句 ANY ANY运算符用于比较的值在列表中根据任何适用的条件 BETWEEN BETWEEN 运算符用于搜索一组值的范围内的值,给定的最小值和最大值 IN IN操作符用来比较的文字值已指定一个值的列表 LIKE LIKE运算符用于比较相似的值,使用通配符的值 NOT NOT运算符的含义相反的逻辑运算符,它被使用如 NOT EXISTS, NOT BETWEEN, NOT IN 等,这是一个相反的运算符 OR 使用OR运算符结合SQL语句的WHERE子句中的多个条件 IS NULL NULL操作符用来比较NULL的值
//找到成绩大于80并且班级为1。3的同学
select * from Student_Grade where St_Grade>80 and St_Class='1.3';
//找到成绩在90-60之间班级为1.1或1.2的同学
select *from Student_Grade where (St_Class='1.1' or St_Class = '1.2') and St_Grade between 60 and 90;
//找到名字中含有o的同学
select * from Student_Grade where St_Name like '%o%';
//注意在like的使用中的‘%’表示多个字符‘_’表示单个字符

多表查询 外键约束

主键:数据表A中有一列,这一列可以唯一的标识一条记录
外键:数据表A中有一列,这一列指向了另外一张数据表B的主键

什么是外键

外键指的是在 从表 中 与 主表 的主键对应的那个字段,比如员工表的 dept_id,就是外键使用外键约束可以让两张表之间产生一个对应关系,从而保证主从表的引用的完整性。

数据准备

创建数据库Qcc_xx

CREATE DATABASE Qcc_xx CHARACTER SET utf8;

创建分类表与商品表

#分类表 (一方主表)
CREATE TABLE subject
( cid VARCHAR(32) PRIMARY KEY ,
cname VARCHAR(50) );
#成绩表 (多方从表)
CREATE TABLE achievement
( sid VARCHAR(32) PRIMARY KEY ,
sname VARCHAR(50),
score float,
flag VARCHAR(2),	#是否参加考试 1表示参加考试 2表示未参加考试
type_id VARCHAR(32),
-- 添加外键约束
FOREIGN KEY (type_id) REFERENCES subject (cid) );

添加数据

#分类数据
INSERT INTO subject(cid,cname) VALUES('c001','SQL');
INSERT INTO subject(cid,cname) VALUES('c002','C++');
INSERT INTO subject(cid,cname) VALUES('c003','python');
INSERT INTO subject(cid,cname) VALUES('c004','java');
#成绩数据
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s001','佟某',41,'1','c001');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s002','周某',80,'1','c001');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s003','王某',78,'1','c001');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s004','张某',80,'1','c001');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s005','阮某',85,'1','c001');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s006','周某某',100,'1','c001');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s007','佟某某',68,'1','c001');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s008','孙某某',98,'1','c001');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s009','某某某',92,'1','c001');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s001','佟某',78,'1','c002');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s002','周某',66,'1','c002');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s003','王某',76,'1','c002');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s004','张某',67,'1','c002');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s005','阮某',89,'1','c002');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s006','周某某',77,'1','c002');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s007','佟某某',83,'1','c002');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s008','孙某某',72,'1','c002');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s009','某某某',51,'1','c002');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s001','佟某',87,'1','c003');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s002','周某',65,'1','c003');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s003','王某',62,'1','c003');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s004','张某',86,'1','c003');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s005','阮某',86,'1','c003');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s006','周某某',85,'1','c003');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s007','佟某某',50,'1','c003');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s008','孙某某',70,'1','c003');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s009','某某某',93,'1','c003');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s001','佟某',79,'1','c004');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s002','周某',85,'1','c004');
INSERT INTO achievement(sid, sname,score,flag,type_id) VALUES('s003','王某',94,'1','c004');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s004','张某',100,'1','c004');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s005','阮某',64,'1','c004');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s006','周某某',93,'1','c004');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s007','佟某某',79,'1','c004');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s008','孙某某',56,'1','c004');
INSERT INTO achievement (sid, sname,score,flag,type_id) VALUES('s009','某某某',51,'1','c004');

多表查询的分类 内连接查询

内连接的特点:
通过指定的条件去匹配两张表中的数据, 匹配上就显示,匹配不上就不显示
比如通过: 从表的外键 = 主表的主键 方式去匹配

隐式链接

form子句 后面直接写 多个表名 使用where指定连接条件的 这种连接方式是 隐式内连接.
使用where条件过滤无用的数据

SELECT 字段名 FROM 左表, 右表 WHERE 连接条件;

查询所学生和对应的科目信息

select * from achievement,subject where type_id =cid;


子查询 子查询概念

一条select 查询语句的结果, 作为另一条 select 语句的一部分

子查询的特点

子查询必须放在小括号中
子查询的场景中还会有另外一个特点,整个sql至少会有两个select关键字

子查询常见分类

where型 子查询: 将子查询的结果, 作为父查询的比较条件 =
from型 子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用
exists型 子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用 IN 函数 ,包含子查询的结果

子查询的结果作为条件的查询
SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
通过子查询查出学习成绩的最高的学生
select max(score) from test1
SELECT * from test1 where score=(select max(score) from test1)
查询3班下的学生成绩和姓名
select student_id from test1 where class_no='3'
select name,score from test1 where student_id in (select student_id from test1 where class_no='3')
查询小于平均成绩的同学
select avg(score) from test1
select * from test1 where score<(select avg(score) from test1)
子查询的结果作为一张表
SELECT 查询字段 FROM (子查询)表别名 WHERE 条件;
二、常用函数 一、数学函数

ABS(x) 返回x的绝对值
BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)
CEILING(x) 返回大于x的最小整数值
EXP(x) 返回值e(自然对数的底)的x次方
FLOOR(x) 返回小于x的最大整数值
GREATEST(x1,x2,...,xn)返回集合中最大的值
LEAST(x1,x2,...,xn) 返回集合中最小的值
LN(x) 返回x的自然对数
LOG(x,y)返回x的以y为底的对数
MOD(x,y) 返回x/y的模(余数)
PI()返回pi的值(圆周率)
RAND()返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。
ROUND(x,y)返回参数x的四舍五入的有y位小数的值
SIGN(x) 返回代表数字x的符号的值
SQRT(x) 返回一个数的平方根
TRUNCATE(x,y) 返回数字x截短为y位小数的结果

二、聚合函数(常用于GROUP BY从句的SELECT查询中)

AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果

三、字符串函数

ASCII(char)返回字符的ASCII码值
BIT_LENGTH(str)返回字符串的比特长度
CONCAT(s1,s2...,sn)将s1,s2...,sn连接成字符串
CONCAT_WS(sep,s1,s2...,sn)将s1,s2...,sn连接成字符串,并用sep字符间隔
INSERT(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果
FIND_IN_SET(str,list)分析逗号分隔的list列表,如果发现str,返回str在list中的位置
LCASE(str)或LOWER(str) 返回将字符串str中所有字符改变为小写后的结果
LEFT(str,x)返回字符串str中最左边的x个字符
LENGTH(s)返回字符串str中的字符数
LTRIM(str) 从字符串str中切掉开头的空格
POSITION(substr,str) 返回子串substr在字符串str中第一次出现的位置
QUOTE(str) 用反斜杠转义str中的单引号
REPEAT(str,srchstr,rplcstr)返回字符串str重复x次的结果
REVERSE(str) 返回颠倒字符串str的结果
RIGHT(str,x) 返回字符串str中最右边的x个字符
RTRIM(str) 返回字符串str尾部的空格
STRCMP(s1,s2)比较字符串s1和s2
TRIM(str)去除字符串首部和尾部的所有空格
UCASE(str)或UPPER(str) 返回将字符串str中所有字符转变为大写后的结果

四、日期和时间函数

CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
DATE_ADD(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
DATE_FORMAT(date,fmt) 依照指定的fmt格式格式化日期date值
DATE_SUB(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)
DAYOFMONTH(date) 返回date是一个月的第几天(1~31)
DAYOFYEAR(date) 返回date是一年的第几天(1~366)
DAYNAME(date) 返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts
HOUR(time) 返回time的小时值(0~23)
MINUTE(time) 返回time的分钟值(0~59)
MONTH(date) 返回date的月份值(1~12)
MONTHNAME(date) 返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
NOW() 返回当前的日期和时间
QUARTER(date) 返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date) 返回日期date为一年中第几周(0~53)
YEAR(date) 返回日期date的年份(1000~9999)
一些示例:

--获取当前系统时间:
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP());
SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE);
SELECT EXTRACT(DAY_SECOND FROM CURRENT_DATE);
SELECT EXTRACT(HOUR_MINUTE FROM CURRENT_DATE);
--返回两个日期值之间的差值(月数):
SELECT PERIOD_DIFF(200302,199802);
--在Mysql中计算年龄:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)),'%Y')+0 AS age FROM employee;

--这样,如果Brithday是未来的年月日的话,计算结果为0。
--下面的SQL语句计算员工的绝对年龄,即当Birthday是未来的日期时,将得到负值。
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthday, '%Y') -(DATE_FORMAT(NOW(), '00-%m-%d') <DATE_FORMAT(birthday, '00-%m-%d')) AS age from employee
五、加密函数

AES_ENCRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储
AES_DECRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法解密后的结果
DECODE(str,key) 使用key作为密钥解密加密字符串str
ENCRYPT(str,salt) 使用UNIXcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str
ENCODE(str,key) 使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串,它以BLOB类型存储
MD5() 计算字符串str的MD5校验和
PASSWORD(str) 返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。
SHA() 计算字符串str的安全散列算法(SHA)校验和

--示例:
SELECT ENCRYPT('root','salt');
SELECT ENCODE('xufeng','key');
SELECT DECODE(ENCODE('xufeng','key'),'key');#加解密放在一起
SELECT AES_ENCRYPT('root','key');
SELECT AES_DECRYPT(AES_ENCRYPT('root','key'),'key');
SELECT MD5('123456');
SELECT SHA('123456');
六、控制流函数

MySQL有4个函数是用来进行条件操作的,这些函数可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台。
MySQL控制流函数:
CASE WHEN[test1] THEN [result1]...ELSE [default] END如果testN是真,则返回resultN,否则返回default
CASE [test] WHEN[val1] THEN [result]...ELSE [default]END 如果test和valN相等,则返回resultN,否则返回default
IF(test,t,f) 如果test是真,返回t;否则返回f
IFNULL(arg1,arg2) 如果arg1不是空,返回arg1,否则返回arg2
NULLIF(arg1,arg2) 如果arg1=arg2返回NULL;否则返回arg1
这些函数的第一个是IFNULL(),它有两个参数,并且对第一个参数进行判断。如果第一个参数不是NULL,函数就会向调用者返回第一个参数;如果是NULL,将返回第二个参数。
如:SELECT IFNULL(1,2), IFNULL(NULL,10),IFNULL(4*NULL,'false');
NULLIF()函数将会检验提供的两个参数是否相等,如果相等,则返回NULL,如果不相等,就返回第一个参数。
如:SELECT NULLIF(1,1),NULLIF('A','B'),NULLIF(2+3,4+1);
和许多脚本语言提供的IF()函数一样,MySQL的IF()函数也可以建立一个简单的条件测试,这个函数有三个参数,第一个是要被判断的表达式,如果表达式为真,IF()将会返回第二个参数,如果为假,IF()将会返回第三个参数。
如:SELECTIF(1<10,2,3),IF(56>100,'true','false');
IF()函数在只有两种可能结果时才适合使用。然而,在现实世界中,我们可能发现在条件测试中会需要多个分支。在这种情况下,MySQL提供了CASE函数,它和PHP及Perl语言的switch-case条件例程一样。

CASE函数的格式有些复杂,通常如下所示:
CASE [expression to be evaluated]
WHEN [val 1] THEN [result 1]
WHEN [val 2] THEN [result 2]
WHEN [val 3] THEN [result 3]
......
WHEN [val n] THEN [result n]
ELSE [default result]
END

这里,第一个参数是要被判断的值或表达式,接下来的是一系列的WHEN-THEN块,每一块的第一个参数指定要比较的值,如果为真,就返回结果。所有的WHEN-THEN块将以ELSE块结束,当END结束了所有外部的CASE块时,如果前面的每一个块都不匹配就会返回ELSE块指定的默认结果。如果没有指定ELSE块,而且所有的WHEN-THEN比较都不是真,MySQL将会返回NULL。

--CASE函数还有另外一种句法,有时使用起来非常方便,如下:
CASE
WHEN [conditional test 1] THEN [result 1]
WHEN [conditional test 2] THEN [result 2]
ELSE [default result]
END

这种条件下,返回的结果取决于相应的条件测试是否为真。
示例:

SELECT CASE 'green'
          WHEN 'red' THEN 'stop'
          WHEN 'green' THEN 'go' END;
SELECT CASE 9 WHEN 1 THEN 'a' WHEN 2 THEN 'b' ELSE 'N/A' END;
SELECT CASE WHEN (2+2)=4 THEN 'OK' WHEN(2+2)<>4 THEN 'not OK' END ASSTATUS;
SELECT Name,IF((IsActive = 1),'已激活','未激活') AS RESULT FROMUserLoginInfo;
SELECT fname,lname,(math+sci+lit) AS total,
CASE WHEN (math+sci+lit) < 50 THEN 'D'
WHEN (math+sci+lit) BETWEEN 50 AND 150 THEN 'C'
WHEN (math+sci+lit) BETWEEN 151 AND 250 THEN 'B'
ELSE 'A' END
AS grade FROM marks;
SELECT IF(ENCRYPT('sue','ts')=upass,'allow','deny') AS LoginResultFROM users WHERE uname = 'sue';
--一个登陆验证
七、格式化函数

DATE_FORMAT(date,fmt) 依照字符串fmt格式化日期date值
FORMAT(x,y) 把x格式化为以逗号隔开的数字序列,y是结果的小数位数
INET_ATON(ip) 返回IP地址的数字表示
INET_NTOA(num) 返回数字所代表的IP地址
TIME_FORMAT(time,fmt) 依照字符串fmt格式化时间time值
其中最简单的是FORMAT()函数,它可以把大的数值格式化为以逗号间隔的易读的序列。

--示例:
SELECT FORMAT(34234.34323432,3);
SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d');
SELECT DATE_FORMAT(19990330,'%Y-%m-%d');
SELECT DATE_FORMAT(NOW(),'%h:%i %p');
SELECT INET_ATON('10.122.89.47');
SELECT INET_NTOA(175790383);
八、类型转化函数

为了进行数据类型转化,MySQL提供了CAST()函数,它可以把一个值转化为指定的数据类型。类型有:BINARY,CHAR,DATE,TIME,DATETIME,SIGNED,UNSIGNED

--示例:
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT 'f'=BINARY 'F','f'=CAST('F' AS BINARY);
九、系统信息函数

DATABASE() 返回当前数据库名
BENCHMARK(count,expr) 将表达式expr重复运行count次
CONNECTION_ID() 返回当前客户的连接ID
FOUND_ROWS() 返回最后一个SELECT查询进行检索的总行数
USER()或SYSTEM_USER() 返回当前登陆用户名
VERSION() 返回MySQL服务器的版本


函数部分---转自CSDN博主「Z小胖」

网友评论