SQL语句学习

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-182016-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

posted @ 2017-02-14 09:26  hqqbug  阅读(211)  评论(0编辑  收藏  举报