ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL-基础语句

2021-05-12 15:34:19  阅读:213  来源: 互联网

标签:语句 StudentName 基础 StudentNo StudentResult student MySQL WHERE SELECT


DQL查询数据*

DQL

Data Query Language:数据查询语言

SELECT

SELECT [ALL | DISTINCT]
{* | table.* | [table.firld1[as alias1][,table.firld2[as alias2]][,...]] }
FROM table_name [as table_alias]
	[left | right | inner join table_name2]  # 联合查询
	[WHERE ...] # 指定结果需满足的条件
	[GROUP BY] # 指定结果安装哪个字段进行分组
	[HAVING] # 过滤分组的记录必须满足次要条件
	[ORDER BY ...] # 指定查询记录按一个或多个条件排序
	[LIMIT {[offset,]row_count | row_countOFFSET offset}]; # 指定查询记录从哪条到哪条

注意:{ }代表必选,[ ] 代表可选的

指定查询字段

# SELECT 字段,... FROM 表
SELECT * FROM student

# 查询指定字段 StudentNo是学号
SELECT `StudentNo`,`StudentName` FROM student

# 别名,给结果起名字 AS 可以给字段和表起别名, AS可以省略
SELECT `StudentNo` AS 学号, `StudentName` AS 姓名 FROM student


# 函数 Concat(a,b)拼接字符串
SELECT CONCAT('姓名:',StudentNo) AS 新名字 FROM student
#结果 :新名字  姓名:xx

# 在下面的 SQL 语句中,我们把三个列(url、alexa 和 country)结合在一起,并创建一个名为 "site_info" 的别名:
SELECT name, CONCAT(url, ', ', alexa, ', ', country) AS site_info
FROM Websites;

去重 distinct

SELECT DISTINCT `StudentName` FROM student

SELECT数据库的列

# select 表达式 from 表
SELECT VERSION()  # 查询系统版本 (函数)
SELECT 100*3 AS 计算结果 #计算 (表达式)
SELECT @@auro_increment_increment  #查询自增的步长(变量)

where

逻辑运算符

在这里插入图片描述

# AND
SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE StudentResult >= 95 AND StudentResult <= 100;

# 模糊查询
SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE StudentResult BETWEEN 95 AND 100;

模糊查询

在这里插入图片描述

# Like 结合 % 代表(0到任意个字符) _(一个字符)
SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE StudentName LIKE '刘%';# 查询姓刘的

SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE StudentName LIKE '刘_';# 查询姓刘的,且名字后面只有一个字

SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE StudentName LIKE '刘__';# 查询姓刘的,且名字后面只有两个字,两个_

SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE StudentName LIKE '%悟%';# 查询名字之间带有悟的

# IN 可以嵌套select
SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE StudentNo IN (1001,1002,1003);# 查询1001,1002,1003学号学员

SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE `Address` IN ('北京');# 查询北京学员

# null not null
SELECT `StudentNo`,`StudentResult`,`StudentName` FROM student
WHERE address='' OR address IS NULL;# 查询北京学员

联表查询join

SQL join 用于把来自两个或多个表的行结合起来。

  • left join : 左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
  • right join : 右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
  • inner join : 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
  • full join : 外连接,返回两个表中的行:left join + right join。
  • cross join : 结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。

img

# student 有`StudentNo`,`StudentName`
# result 有`StudentNo`,`StudentResult`,,`SubjectNo`
# join (连接的表) on (判断的条件) 连接查询
SELECT s.StudentNo,StudentResult,SubjectNo,StudentName
FROM student AS s #判断StudentNo是哪个表的
INNER JOIN result AS r
WHERE s.StudentNo = r.StudentNo;
# where是等值查询,join on是连接查询

# Right Join 右查询
# 如果关键字使用where的话,则会两表所有信息,效果如inner join
# 必须是表建立之后才可以使用where 所以在inner join中可以达到和on 一样的效果但在left JOIN或者right join中用where就会报错原因就是表还没有建立
SELECT s.StudentNo,StudentResult,SubjectNo,StudentName
FROM student s #判断StudentNo是哪个表的
RIGHT JOIN result r
ON s.StudentNo = r.StudentNo;

# Left Join 左查询
# LEFT JOIN 关键字从左表(Websites)返回所有的行,即使右表(access_log)中没有匹配。
# left join就是显示左边的所有数据,及右边显示的是和左边有交集部分的数据,inner join只显示有交集的行
# left join 左连接:展示左表所有数据,以及右表符合on条件的数据,右表不符合的则为空显示。
SELECT s.StudentNo,StudentResult,SubjectNo,StudentName
FROM student s #判断StudentNo是哪个表的
LEFT JOIN result r
ON s.StudentNo = r.StudentNo;

ON 和 WHERE:on先筛选后关联,where是先关联后筛选

  • 1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
  • 2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

Left Join 和 Right Join

在这里插入图片描述

# 添加条件,查询缺考
SELECT s.StudentNo,StudentResult,SubjectNo,StudentName
FROM student s #判断StudentNo是哪个表的
LEFT JOIN result r
ON s.StudentNo = r.StudentNo
WHERE StudentResult IS NULL;

# 添加条件,查询参加同学信息,学号,姓名,科目,分数,Student,result,Subject,SubjectNo科目ID,SubjectName科目,StudentNo学生ID,StudentName学生姓名,StudentResult分数
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s #判断StudentNo是哪个表的
RIGHT JOIN result r
ON s.StudentNo = r.StudentNo
INNER JOIN `Subject` sub
ON r.SubjectNo = sub.SubjectNo;

# 查询select
# 几张表查 FROM 表 xxx(LEFT/RIGHT) Join 连接的表  ON 交叉条件
# 存在多张表查询,先查询两张表然后慢慢加
# FROM a left b 以a表为基准
# FROM a right b 以b表为基准

自连接

一张表拆为两张一样的表

SELECT a.`categoryName` AS '父栏目', b.`categoryName` AS '子栏目'
FROM `category` AS a, `category` AS b
WHERE a.`categoryid` = b.`pid`;

分页

order by:通过哪个字段排序,怎么排

排序:升序ASC,降序DESC

SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s #判断StudentNo是哪个表的
RIGHT JOIN result r
ON s.StudentNo = r.StudentNo
INNER JOIN `Subject` sub
ON r.SubjectNo = sub.SubjectNo
ORDER BY StudentResult DESC # 学生成绩降序排序
LIMIT 0,5 # 显示5数据,数据由1-5
LIMIT 1,5 # 显示5个数据,数据由2-6

分页

limit:当前页,页面大小

第N页 limit (n-1)*pageSize, pageSize

limit(查询起始下标,pageSize)

# 找到课程xxx,的前10名学生,且分数大于90的学生信息
SELECT s.StudentNo,StudentName,SubjectName,StudentResult
FROM student s #判断StudentNo是哪个表的
RIGHT JOIN result r
ON s.StudentNo = r.StudentNo
INNER JOIN `Subject` sub
ON r.SubjectNo = sub.SubjectNo
WHERE SubjectName = "xxx" AND StudentResult >= 90
ORDER BY StudentResult DESC # 学生成绩降序排序
LIMIT 0,10; # 显示5数据,数据由1-5

子查询

在where查询中嵌套一个子查询

where (select * from)

SELECT StudentNo,SubjectName,StudentResult
FROM result r #判断StudentNo是哪个表的
INNER JOIN `Subject` sub
ON r.SubjectNo = sub.SubjectNo
WHERE SubjectName = "xxx" 
ORDER BY StudentResult DESC; # 学生成绩降序排序

# 子查询 由里到外
SELECT StudentNo,SubjectName,StudentResult
FROM result r #判断StudentNo是哪个表的
WHERE SubjectNo = (
	SELECT SubjectNo FROM `Subject` WHERE SubjectName = "xxx"
);# 括号里查的是SubjectName=数据库结构-1的课程的SubjectNo,然后在result表中查出SubjectNo等于此值的所有需要字段,得到考这门课的学生No,查出的课程No和分数
# 子查询 找到课程xxx,的前10名学生,且分数大于90的学生信息
SELECT DISTINCT StudentNo,StudentName
FROM student #判断StudentNo是哪个表的
WHERE StudentNo IN (SELECT StudentNo FROM result WHERE StudentResult >= 90 AND SubjectNo = (SELECT SubjectNo FROM Stuject WHERE SubjectName = "xxx") )
ORDER BY StudentResult DESC # 学生成绩降序排序
LIMIT 0,10; # 显示5数据,数据由1-5

MYSQL函数

常用函数(不常用)

数学

  • 绝对值:SELECT ABS()
  • 向上取整:SELECT CEILING()
  • 向下取整:SELECT FLOOR()
  • 随机数:SELECT RAND()
  • 返回数的符号:SELECT SIGN(-10) ,负数返回-1,正数返回1

字符串

  • 字符串长度:SELECT CHAR_LENGTH(‘xxx’)
  • 字符串拼接:SELECT CONCAT()
  • 字符串插入:SELECT INSERT(替换的字符,替换起始位置(由1开始),替换几个字符,替换的字符)
  • 字符串全部大写:SELECT LOWER()
  • 字符串全部小写:SELECT UPPER()
  • 字符第一次出现位置:SELECT INSTR(字符串,查询的字符)
  • 字符串替换:SELECT REPLACE(字符串,要替换的字符,要替换的字符)
  • 字符串截取:SELECT SUBSTR(字符串,要截取的开始位置,截取几个)
  • 字符串反转:SELECT REVERSE()

时间

  • 获取当前时间:SELECT CURRENT_DATE()
  • 获取当前日期:SELECT CURDATE()
  • 获取当前时间:SELECT NOW()
  • 获取本地时间:SELECT LOCALTIME()
  • 获取系统时间:SELECT SYSDATE()
  • 年:SELECT YEAR(NOW())
  • 天:SELECT DAY(NOW())

系统

  • 用户:SELECT SYSTEM_USER()
  • SELECT USER()
  • 版本:SELECT VERSION()

聚合函数(常用)

函数名描述
COUNT()计数
SUM()求和
AVG()平均值
MAX()最大值
MIN()最小值

COUNT()

SELECT COUNT(studentname) FROM student; #count(字段)指定列,会忽略所有的null值,主键快
SELECT COUNT(*) FROM student; # 不会忽略所有的null值,本质计算行数
SELECT COUNT(1) FROM result; # 不会忽略所有的null值,本质计算行数,不是主键时,速度快
SELECT SUM(`StudentResult`) AS `SUM` FROM result;
SELECT SubjectName, AVG(StudentResult), MAX(StudentResult), MIN(StudentResult)
FROM result r
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubjectNo`
# WHERE AVG() 错误 WHERE的条件不能用分组,需要使用HAVING
GROUP BY r.SubjectNo  # 通过上面字段分组
HAVING `SUM` > 80
# where是判断每一条记录,having二次过滤可以判断组

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数。

MD5

主要增强算法复杂度不可逆性。但彩虹表可以破解

CREATE TABLE 'testmd5'(
	`id` INT(4) NOT NULL,
    `name` VARCHAR(20) NOT NULL,
    `pwd` VARCHAR(50) NOT NULL,
    PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO testmd5 VALUES(1, 'XX','1234'),(2, 'XXY','123411'),(3, 'EEXX','122234');

UPDATE testmd5 SET pwd=MD5(pwd) # 加密全部
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1 # 加密id=1的
# 插入时加密
INSERT INTO testmd5 VALUES(4, 'XddX',MD5('1211334'));
# 校验
SELECT * FROM testmd5 WHERE name = 'XddX' AND pwd = MD5('1211334');

标签:语句,StudentName,基础,StudentNo,StudentResult,student,MySQL,WHERE,SELECT
来源: https://blog.csdn.net/weixin_38022166/article/details/116708579

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有