SQL语句的标准在不同的数据库管理系统中,兼容性不同,第一次学习MySQL数据库管理系统已经是好久的事了,当然,我也并没有深入的去研究过其他的数据库管理系统,所以正如那位大佬说,你没有资格做选择,因为你没有经历其他的,所以只能说现在的好!不论如何,我就是喜欢MySQL,如果有时间进一步研究了其他的数据库管理系统,也许会改变,话不多说,进入正题,今天主要整理了SELECT相关的SQL语句,期望对各位读者有所帮助
数据查询
SELECT * FROM Student;
SELECT sname,sage FROM Student;
#可以查询字符串,将查询字符串显示在查询结果中
SELECT sname,'birthday:',year FROM Student;
SELECT DISTINCT sno FROM SC; #取出重复行
如果没有指定DISTINCT的话,默认是ALL,重复数据也会被显示出来
条件查询
SELECT * FROM stu WHERE sage < 18;
SELECT * FROM stu WHERE sage BETWEEN 20 AND 23;
SELECT * FROM stu WHERE sdept IN ('CS','MA','IS');
条件查询之模糊查询 %代表任意长度 _代表一个长度
SELECT * FROM WHERE sname LIKE 'test'; 等价于 SELECT * FROM Student WHERE sname='test';
SELECT * FROM Student WHERE sname LIKE '李%'; #匹配所有的李姓数据
SELECT * FROM Student WHERE sname LIKE '李_'; #匹配所有的李姓两个字的数据
SELECT * FROM Student WHERE sname NOT LIKE '李_'; #匹配所有的除李姓两个字之外的数据
-- 当查询条件中包含通配符%或者_时,我们需要通过关键词 ESCAPE '\' 通配符进行转义 mysql不能使用该关键字
SELECT * FROM stu WHERE name LIKE '123\_ads%'
SELECT * FROM stu WHERE name LIKE '123\_ads__s_'
SELECT * FROM stu WHERE name IS NULL;
SELECT * FROM stu WHERE dept='CS' AND age < 18
-- AND 的优先级高于 OR
SELECT * from stu WHERE dept='CS' OR dept='MA'
-- ORDER BY 子句
SELECT * FROM stu WHERE age BETWEEN 18 and 20 ORDER BY id DESC;-- 倒叙 ASC是升序
-- GROUP BY 想要在group by中使用条件,就需要借助having关键字
SELECT * FROM stu GROUP BY age; -- 依据年龄进行分组
SELECT * FROM stu GROUP BY age HAVING COUNT(*) > 3;
SELECT count(name) FROM stu GROUP BY sex HAVING avg(age)>1
连接查询
-- 查询两个表中,所有name字段相同的数据
SELECT * from stu,users WHERE stu.name = users.name
-- 根据相同id取用户名
SELECT users.name from users,stu where users.id = stu.id
-- 当某个字段只在一个表中存在时,那就可以省略表前缀
SELECT users.name,password from users,stu where users.id = stu.id
外连接
-- 左外连接,会将users表中的数据全部显示出来,stu中没有的则为空
SELECT stu.name,class,users.id FROM users LEFT OUTER JOIN stu ON(stu.id=users.id)
-- 左外连接,会将stu表中的数据全部显示出来,users中没有的则为空
SELECT stu.name,class,users.id FROM stu LEFT OUTER JOIN users ON(users.id=stu.id)
-- 右外连接,会将users表中的数据全部显示出来 与左外连接相反
SELECT stu.name,class,users.id FROM stu RIGHT OUTER JOIN users ON(users.id=stu.id)
多表连接
SELECT * FROM users,stu,attricle WHERE users.id=stu.id AND users.id = attricle.id
嵌套查询
在SQL语句中,一个select-from-where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询称为嵌套查询
-- in表示前面的值是否在后面的集合中
SELECT * FROM attricle WHERE id IN(SELECT id FROM users WHERE name='test')
不相关子查询 : 子查询的条件不依赖与父级
相关子查询 : 子查询的查询条件依赖于父级
EXISTS子查询
带有EXISTS关键词的子查询不返回任何数据,只产生逻辑真“true”或逻辑假值“false”
当EXISTS后面的查询语句查询出结果之后,前面才能查询出结果,否则查询结果为空
SELECT * FROM stu WHERE EXISTS(SELECT name FROM users WHERE id=18)
NOT EXISTS与额、EXISTS恰恰相反
集合查询(UNION,INTERSECT, EXCEPT)
UNION 并操作
INTERSECT 交操作 (mysql不支持)
EXCEPT 查操作 (mysql不支持)
注:参加集合操作的个查询结果的列数必须相同
SELECT name FROM stu UNION SELECT password FROM users
基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象
通过FROM子句生成派生表时,必须为派生表起一个别名,可以使用as关键字,也可以省略
简单理解:一个查询语句要作为别人查询语句的源头
SELECT name FROM Student,(SELECT sno FROM SC WHERE NO='1')as SCI WHERE Student.sno=SCI.sno;
全部为本人亲自整理,并经过测试的语句,如有错句,病句劳烦留言!