文章标题

来源:互联网 发布:更改计算机端口号 编辑:程序博客网 时间:2024/06/10 04:11

SQL 学习笔记

@(Inbox)


  • SQL 学习笔记
    • 基本语句和关键词
      • SELECT
      • WHERE 用于过滤记录
      • AND OR
      • ORDER BY 此关键字用于对结果进行排序
      • INSERTINTO 语句 用于插入
      • UPDATE 语句 用于更新
      • DELETE 语句用于删除
    • 高级教程
      • SELECT TOP LIMITROWNUM 子句
      • like 操作符 通配符
      • IN 操作符
      • BETWEEN 操作符
      • 别名 AS
      • 连接 JOIN


基本语句和关键词

1. SELECT

select * from table_name
select column_name,column_name from table_name
DISTINCT选取唯一值 select distinct column_name form table_name

2. WHERE 用于过滤记录

  • 搜索
    Select * from emp where empno=7900;

  • 筛选 : 比较运算符包涵:= > < >= ,<=, !=,<> 表示(不等于)
    Select * from emp where ename='SMITH';

  • 逻辑运算:逻辑运算的优先级:() not and or
    Select * from emp where sal > 2000 and sal < 3000;
    Select * from emp where sal > 2000 or comm > 500;
    select * from emp where not sal > 1500;

  • 特殊条件
    空值判断
    Select * from emp where comm is null;
    between and 在……之间
    Select * from emp where sal between 1500 and 3000;
    in 在某个列表中
    Select * from emp where sal in (5000,3000,1500);
    like 模糊查询
    Select * from emp where ename like 'M%';

    • % 表示多个字值,_ 下划线表示一个字符;
    • M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
    • %M% : 表示查询包含M的所有内容。
    • %M_ : 表示查询以M在倒数第二位的所有内容。

3. AND & OR

在where一节的逻辑运算中已涉及此部分内容

4. ORDER BY 此关键字用于对结果进行排序

SELECT column_name, column_name FROME table_name ORDER BY column_name, column_name ASC|DESC;

ORDER BY 多列的时候,先按照第一个column name排序,在按照第二个column name排序;如上述教程最后一个例子:
1)、先将country值这一列排序,同为CN的排前面,同属USA的排后面;
2)、然后在同属CN的这些多行数据中,再根据alexa值的大小排列。
3)、ORDER BY 排列时,不写明ASC DESC的时候,默认是ASC,即默认升序排列。

5. INSERTINTO 语句 用于插入

  • 第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:
    INSERT INTO table_name VALUES (value1,value2,value3,...);
  • 第二种形式需要指定列名及被插入的值:
    INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...);

注意:
- id字段会自动更新
- 如果不指定列名的话,需要列出所有列的值!

6. UPDATE 语句 用于更新

UPDATE table_name SET column1=value1, column_2=value2, .... WHERE some_column=some_value;

!!注意
WHERE 子句规定哪条记录或者哪些记录需要更新。如果省略了 WHERE 子句,所有的记录都将被更新!
执行没有 WHERE 子句的 UPDATE 要慎重,再慎重。

7. DELETE 语句用于删除

DELETE FROM table_name WHERE some_column=some_value;'

DELETE FROM Websites WHERE name='百度' AND country='CN';

您可以在不删除表的情况下,删除表中所有的行。这意味着表结构、属性、索引将保持不变:

DELETE FROM table_name;

DELETE * FROM table_name;

高级教程

1. SELECT TOP/ LIMIT/ROWNUM 子句

选取前几条数据

SELECT * FROM Persons LIMIT 5;

SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;

SELECT TOP 50 PERCENT * FROM Websites;

2. like 操作符 & 通配符

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern;

like 模糊查询
Select * from emp where ename like 'M%';
- % 表示多个字值,_ 下划线表示一个字符;
- M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
- %M% : 表示查询包含M的所有内容。
- %M_ : 表示查询以M在倒数第二位的所有内容。

通配符 描述 % 替代0个或多个字符 - 替代一个字符 [charlist] 此字符集中的任一单个字符 [^charlist]或[!charlist] 不存在于此字符集中的任一单个字符

使用 REGEXP 或 NOT REGEXP运算符 (或 RLIKE 和 NOT RLIKE) 来操作正则表达式。

SELECT * FROM Websites WHERE name REGEXP '^[GFs]';

3. IN 操作符

允许在 where 中规定多个值
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1,value2,...);

4. BETWEEN 操作符

BETWEEN
NOT BETWEEN

数值类型可以使用 between WHERE alexa NOT BETWEEN 1 AND 20;
文本值类型也可以 WHERE name NOT BETWEEN 'A' AND 'H';
日期类型也可以 WHERE date BETWEEN '2016-05-10' AND '2016-05-14';

不同数据库的between操作符定义不同:

在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。
在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段。
在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。

5. 别名 AS

在下面的情况下,使用别名很有用:
- 在查询中涉及超过一个表
- 在查询中使用了函数
- 列名称很长或者可读性差
- 需要把两个列或者多个列结合在一起

下面的 SQL 语句选取 “菜鸟教程” 的所访问记录。我们使用 “Websites” 和 “access_log” 表,并分别为它们指定表别名 “w” 和 “a”(通过使用别名让 SQL 更简短):

SELECT w.name, w.url, a.count, a.date
FROM Websites AS w, access_log AS a
WHERE a.site_id=w.id and w.name=”菜鸟教程”;

在下面的 SQL 语句中,我们把三个列(url、alexa 和 country)结合在一起,并创建一个名为 “site_info” 的别名

SELECT name, CONCAT(url, ‘, ‘, alexa, ‘, ‘, country) AS site_info
FROM Websites;

6. 连接 JOIN

四种情况:
- INNER JOIN:如果表中有至少一个匹配,则返回行(注释:INNER JOIN 与 JOIN 是相同的。)
- LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN:只要其中一个表中存在匹配,则返回行。 现在是 FULL OUTER JOIN???

SELECT Websites.id, Websites.name, access_log.count, access_log.date
FROM Websites
INNER JOIN access_log
ON Websites.id=access_log.site_id;