SQL语句学习
一、SQL DML 和 DDL
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。
查询和更新指令构成了 SQL 的 DML 部分:
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。
SQL 中最重要的 DDL 语句:
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
二、关键词 DISTINCT
关键词 DISTINCT 用于返回唯一不同的值。
语法:
SELECT DISTINCT 列名称 FROM 表名称
SQL 使用单引号来环绕文本值(大部分数据库系统也接受双引号)。如果是数值,请不要使用引号。
三、SQL JOIN - 使用 Join
除了上面的方法,我们也可以使用关键词 JOIN 来从两个表中获取数据。
如果我们希望列出所有人的定购,可以使用下面的 SELECT 语句:
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM PersonsINNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
ORDER BY Persons.LastName
结果集:
LastName |
FirstName |
OrderNo |
Adams |
John |
22456 |
Adams |
John |
24562 |
Carter |
Thomas |
77895 |
Carter |
Thomas |
44678 |
不同的 SQL JOIN
除了我们在上面的例子中使用的 INNER JOIN(内连接),我们还可以使用其他几种连接。
下面列出了您可以使用的 JOIN 类型,以及它们之间的差异。
- JOIN: 如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行
实例:
姓名相同:
Select Name,Count(*)
From helloworld.tb_user Group By Name Having Count(*) > 1
年龄不同:
Select *
From helloworld.tb_user Group By name Having Count(*) >1
where age in (
Select age from helloworld.tb_user
Group By age Having Count(*) =1
)
查询名字相同且年龄不同,密码为1111111,时间段为2013-09-18到2016-12-30,且是最后一条数据
我写:
select * from tb_user where name in
(select name from tb_user group by name having count(*) > 1)
and name in (select name from tb_user group by name,age having count(*) < 2 )
and password='1111111'
and created>'2013-09-18'
and created<'2016-12-30'
order by created desc limit 1
同事写:
select name,MAX(created) created from (
select * from tb_user t where name in
(select name from tb_user td group by name having count(*) > 1)
and name in (select name from tb_user td group by name,age having count(*) < 2)
and password='1111111'
and created>'2013-09-18'
and created<'2016-12-3 0'
)a
GROUP BY name