沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

SQL学习笔记

因为觉得W3school过于枯燥(真香),所以换了一个网站“自学SQL”( http://www.xuesql.cn/ )试试,以下内容为学习时的笔记(持续更新,如有错误,欢迎指正)。


  • SELECT
  1. 理解: 通常又被称为查询,即从数据库中取出数据,并可在返回之前做一些计算和转换。

  2. 语法:SELECT (某某1),(某某2)…(某某N)FROM (表格名称); (似乎可以小写)

  3. 例子:

    Table: wodebiaoge

    name hobby
    chenlvtang eat
    gnatvlnehc sleep
    SELECT name FROM wodebiaoge;(要不要加分号,以后再加以讨论)

    然后你就会看到:

    name
    chenlvtang
    gnatvlnehc

    如果想要查询所有数据可以用以下代码:(效果我就不展示了,就是那个表格,谁叫我这么懒)

    SELECT * FROM wodebiaoge;

    还可以使用一些条件进行更加详细的筛选:

    Operator(关键字) Condition(意思) SQL Example(例子)
    =, !=, < <=, >, >= Standard numerical operators 基础的 大于,等于等比较 col_name != 4
    BETWEEN … AND … Number is within range of two values (inclusive) 在两个数之间 col_name BETWEEN 1.5 AND 10.5
    NOT BETWEEN … AND … Number is not within range of two values (inclusive) 不在两个数之间 col_name NOT BETWEEN 1 AND 10
    IN (…) Number exists in a list 在一个列表 col_name IN (2, 4, 6)
    NOT IN (…) Number does not exist in a list 不在一个列表 col_name NOT IN (1, 3, 5)
SELECT * FROM wodebiaoge where name in (1,2);
SELECT * FROM wodebiaoge where x>100 and x<200;
....其他差不多(多个条件可以用and 和 or 连接)

对字符串的查询:

Operator(操作符) Condition(解释) Example(例子)
= Case sensitive exact string comparison (notice the single equals)完全等于 col_name = “abc”
!= or <> Case sensitive exact string inequality comparison 不等于 col_name != “abcd”
LIKE Case insensitive exact string comparison 没有用通配符等价于 = col_name LIKE “ABC”
NOT LIKE Case insensitive exact string inequality comparison 没有用通配符等价于 != col_name NOT LIKE “ABCD”
% Used anywhere in a string to match a sequence of zero or more characters (only with LIKE or NOT LIKE) 通配符,代表匹配0个以上的字符 col_name LIKE “%AT%” (matches “AT”, “ATTIC”, “CAT” or even “BATS”) “%AT%” 代表AT 前后可以有任意字符
_ Used anywhere in a string to match a single character (only with LIKE or NOT LIKE) 和% 相似,代表1个字符 col_name LIKE “AN_” (matches “AND”, but not “AN”)
IN (…) String exists in a list 在列表 col_name IN (“A”, “B”, “C”)
NOT IN (…) String does not exist in a list 不在列表 col_name NOT IN (“D”, “E”, “F”)
SELECT * FROM movies where title like "toy story%";(toy story1,toy story2...)
SELECT title,director,year FROM movies where director like "Pete%";(Pete lalal)

(那个网站编辑器好像抽了)

接下来是一些能将筛选条件变得更加严格的语法:

语句 作用 例子
ORDER BY(ASC升序/DESC降序)默认为升序 排序 SELECT * FROM scores ORDER BY alexa (DESC);升序排列(降序)===>1,2,3,4…
DISTINCT 删去重复,只返回不同的 平行世界有很多同名,只想看到大宇宙中不同名字的人怎么办?select distinct name from table;===>张三,李四,沉铝汤,王五(现在看到的数据每个都不同了)
ORDER BY+LIMIT+OFFSET 顾名思义,应该是先排序再选取一段截取下来给你看 如果平行宇宙中有年龄不同的沉铝汤,你现在有一个表,但是它是随便排布的,如果你想看到年龄最大的四个沉铝汤多少岁了该怎么办呢?select years_old from table order by years_old desc limit 4 offset 0;==>25,22,18,16(看来程序员很喜欢从0开始,而且limit好像规定了取多少个,offset规定了从哪里开始,7年后的沉铝汤是怎样呢?)

如果想要将大宇宙关于沉铝汤的表格,先按年龄排序,再按头发长度排序并选出前10该怎么做呢

select * from chenlvtangtable order by years_old(desc) ,hair_long(desc) limit 10 (offset 0);因为默认升序,从0开始截取,所以括号里的语句看具体要求,如果升序且从第一个开始就可以不需要了。

  • JOIN的连接

如果我们得到了两张平行宇宙的表格,一张包含宇宙编号,名字和年龄,另一种有宇宙编号,等级(可能吧),但是即使是平行宇宙也会有特别的人,这些人只在一个世界存在(很可惜,我们大部分人都不是这种人),如果现在我们只想看到两个宇宙中不特殊的人的所有信息该怎么做呢?

先让我们看看这两个表格:

①myworld

id name years_old
1 张三 54
2 李四 21

②yourworld

lallalala(这个宇宙表示id的方法) level
1 3
2 2

如何把他们连接呢?试试下面这个吧!

SELECT myworld.id,myworld.name,myworld.years_old,yourworld.level(我才不想多一列lallala) FROM myworld INNER JOIN  yourworld ON myworld.id = yourworld.lalllala;(好像有点交集的意思哦)

看看效果吧:

id name years_old level
1 张三 54 3
2 李四 21 2

哇,好像并没有沉铝汤喂(确信)???!!!!!!!!!


LEFT (OUTER)JOIN&&RIGHT(OUTER) JOIN&&FULL (OUTER)JOIN(语法与inner一致)

①LEFT JOIN

试试下面这个代码:

SELECT myworld.id,myworld.name,myworld.years_old,yourworld.level(我才不想多一列lallala) FROM myworld LEFT JOIN  yourworld ON myworld.id = yourworld.lalllala;

然后我们就会看到

id name years_old level
1 张三 54 3
2 李四 21 2
666 沉铝汤 18 null(也好像是空白,不过无论是什么都不能说明沉铝汤没等级哦!!)
..

②RIGHT JOIN

试试下面这个代码:

SELECT myworld.id,myworld.name,myworld.years_old,yourworld.level(我才不想多一列lallala) FROM myworld RIGHT JOIN  yourworld ON myworld.id = yourworld.lalllala;

然后我们就会看到

id name years_old level
1 张三 54 3
2 李四 21 2
null null null 100000(yourworld中特殊的人)
.. ..

③FULL JOIN

SELECT myworld.id,myworld.name,myworld.years_old,yourworld.level(我才不想多一列lallala) FROM myworld FULL JOIN  yourworld ON myworld.id = yourworld.lalllala;

然后我们就会看到

id name years_old level
1 张三 54 3
2 李四 21 2
1000
666 沉铝汤 18

  • NULL的处理

    这里我就先跳了,原因我也不知道,就是想跳过!


  • AS♂ we can!

    其实就是个换名字的语句

①给yourworld和myworld换个名字吧,就叫“yw”&&“mw”吧

select yw.level,my.name  from yourwold as yw,myworld as mw;

②把yw里的lallalala换成id_2吧,看着挺难受的,其实是难打

select lallalala as id_2 from yw;

③把yw里的level数据缩减一半顺便把名字改为half_level吧

select level/2.0 as half_level from yw;

  • INSERT INTO(插入语句)

    语法:

    INSERT INTO 表名称 VALUES (值1, 值2,….);

​ 给yw增加沉铝汤的相关信息吧

INSERT INTO yw VALUES ('666','233');

​ 如果只给yw的id_2加上沉铝汤的信息呢,毕竟我们不知道沉铝汤的等级,本着实事求是的精神,我们就不要瞎编了。

INSERT INTO yw (id_2) VALUes ('666');

  • UPDATE

    可用于修改表中的数据

    语法:

    UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值


​ ①修改一下沉铝汤的名字吧,改成“chenlvtang”吧

UPDATE mw SET name = 'chenlvtang' where id = '666';

​ ②如果我想同时改变沉铝汤的名字和年龄呢

UPDATE mw SET name = 'chenlvtang',years_old = '19' where id = '666';

  • DELETE

    用于删除表中的行

    语法:

    DELETE FROM 表名称 WHERE 列名称 = 值;

①想了想还是特殊有意思,所以还是把沉铝汤从yw里面删除吧

DELETE FROM yw WHERE id_2 = '666';

②如果想把yw全部清空呢?

DELETE FROM yw ;
或者
DELETE * FROM yw;

SQL UNION 操作符

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

SQL UNION 语法

SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2

注释:默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

SQL UNION ALL 语法

SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2

另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。

下面的例子中使用的原始表:

Employees_China:

E_ID E_Name
01 Zhang, Hua
02 Wang, Wei
03 Carter, Thomas
04 Yang, Ming

Employees_USA:

E_ID E_Name
01 Adams, John
02 Bush, George
03 Carter, Thomas
04 Gates, Bill

实例

列出所有在中国和美国的不同的雇员名:

SELECT E_Name FROM Employees_China
UNION
SELECT E_Name FROM Employees_USA

结果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Gates, Bill

注释:这个命令无法列出在中国和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION 命令只会选取不同的值。

UNION ALL

UNION ALL 命令和 UNION 命令几乎是等效的,不过 UNION ALL 命令会列出所有的值。

SQL Statement 1
UNION ALL
SQL Statement 2

使用 UNION ALL 命令

实例:

列出在中国和美国的所有的雇员:

SELECT E_Name FROM Employees_China
UNION ALL
SELECT E_Name FROM Employees_USA

结果

E_Name
Zhang, Hua
Wang, Wei
Carter, Thomas
Yang, Ming
Adams, John
Bush, George
Carter, Thomas
Gates, Bill

…偷一下懒,直接w3school复制过来了


  • SELECT INTO

    不同于update语句的是,这条语句是从一个表选取数据插入另一个表(可能相当于复制粘贴吧)

    不过它常被用来给数据备份和存档

    ①下面为mw备份一下吧

    SELECT * INTO mw2.0 FROM mw;

    啊啊啊,我去学sql注入了,以后再填坑!!!!