8

最近刚刚开始学习Mysql,然而学习MySql必经的一个过程就是SQL语句,只有按照文档从头开始学习SQL语句。学习的过程是痛苦的,但是学完的成果是甘甜的。

SQL 语法

所有的 SQL 语句都以下列关键字之一开始:SELECT、INSERT、UPDATE、DELETE、ALTER、DROP、CREATE、USE、SHOW,并以一个分号(;)结束。

有一点需要特别注意:SQL不区分大小写,也就是说SELECTselectSQL语句中有相同的含义。然而,MySQL在表的名称方面并不遵循此规定。所以,如果你在使用MySQL的话,你需要在程序中严格按照它们在数据库中名字进行使用。

SQL语句中使用*代表通配符。

SELECT

SELECT关键字用来从数据中查询数据。

语法

SELECT 查询字段 FROM 表名;
//  在 loglists 表中查询 id,name 两个字段
SELECT id,name FROM `loglists`;
SELECT DISTINCT

SELECT DISTINCT语句用于返回唯一不同的值。

语法

SELECT DISTINCT 查询字段 FROM 表名;
//  查询 loglists 表中 content,name 全部不相同数据
SELECT DISTINCT content,name FROM `loglists`;

SELECT DISTINCT查询多个字段的话,会根据当前的这些字段中的值全部不相同的数据。在使用时需要注意的是,不要把唯一主键作为查询条件。

WHERE

WHERE子句用于提取那些满足指定标准的记录。

语法

SELECT 查询字段 FROM 表名 WHERE 查询条件;
//  查询 loglists 表中 content为111 的数据,查询字段包括 content,name,id
SELECT content,name,id FROM loglists WHERE content="111";
AND

第一个条件和第二个条件都成立,则AND运算符显示一条记录。

语法

SELECT 查询字段 FROM 表名 WHERE 条件 AND 条件;
//  查询 loglists 表中 content="111" 并且 id<=150 的数据,查询字段包括 id,content,name
SELECT id,content,name FROM loglists WHERE content="111" AND id<=150;

如果有多个条件可以连续AND查询。

OR

第一个条件和第二个条件中只要有一个成立,则OR运算符显示一条记录。

语法

SELECT 查询字段 FROM 表名 WHERE 条件 OR 条件;
//  查询 loglists 表中 content="111" 或 id<=150 的数据,查询字段包括 id,content,name
SELECT id,content,name FROM loglists WHERE content="111" OR id<=150;

如果有多个条件可以连续OR查询。

ANDOR同时使用。

//  查询 loglists 表中 content="111" 并且 id<=150 或者 name="111" 的数据,查询数据包括 id,content,name
SELECT id,content,name FROM loglists WHERE content="111" AND id<=150 OR name="111";
ORDER BY

ORDER BY关键字用于对结果集进行排序。

  1. 先将查询值这一列排序,同为CN的排前面,同属USA的排后面。
  2. 然后在同属CN的这些多行数据中,再根据alexa值的大小排列。
  3. ORDER BY排列时,不写明ASC DESC的时候,默认是ASC

ASC升序
DESC降序

语法

SELECT 字段 FROM 表名 ORDER BY 字段 ASC|DESC;
//  查询 loglists 包括字段 id,content,name
//  先将 name 升序排列,把查询的数据再按照content查询分区块,按降序排序
SELECT id,content,name FROM loglists ORDER BY name ASC,content DESC;
INSERT INTO

INSERT INTO语句用于向表中插入新记录。

语法

INSERT INTO 表名 (添加字段) VALUES (值);
//  向 loglists 中添加一条数据 字段为 name,content,text 值为 "aaron","my's aaron","haha"
INSERT INTO loglists (name,content,text) VALUES ("aaron","my's aaron","haha");

下面这种也是插入一条数据带有条件查询

//  向 loglists 中插入一条数据
//  插入的数据为 loglists 表中 content = 123 的结构
INSERT INTO loglists SELECT * FROM loglists WHERE content = "123";

上面这种写写法需要注意:

  1. 插入表中与查到的表中的主键不能相同,一旦相同则会抛出错误
  2. 若查询表中有多条数据,则会重复添加多条数据
  3. 要求表必须存在
UPDATE

UPDATE语句用于更新表中的记录。

语法

UPDATE 表明 SET 更新数据(name="liergou") WHERE 条件;
//  更新loglists表
//  name="liergou",text="eroguzi",content="ok"
//  根据 id=1 或 text="999"
//  查找数据并更新
UPDATE loglists SET name="liergou",text="eroguzi",content="ok" WHERE id=1 OR text="999";
DELETE

DELETE语句用于删除表中的记录。

语法

DELETE FROM 表名 WHERE 查询条件;
//  删除 loglists 中 id=1 或 text="angie" 的数据
DELETE FROM loglists WHERE id=1 OR text="angie";

删除所有数据:

DELETE FROM table_name;
DELETE * FROM table_name;

++友情提示:在删除记录时要格外小心!因为不能重来!++

LIMIT

截取查询数据。

语法

SELECT 字段 FROM 表名 ORDER BY 查询字段 ASC LIMIT 截取位数;
//  在 loglists 表中
//  按id升序排列,截取1-3位
SELECT * FROM loglists ORDER BY id ASC LIMIT 3;

如果LIMIT后面只有一个数则默认为1-n之间。

在看SQL语句的时候看到有个一TOP语句,但是在Mysql使用的时候,报错。

Mysql中实现类似TOP语句:

SELECT * FROM loglists ORDER BY id ASC LIMIT 1,3;
LIKE

LIKE操作符用于在WHERE子句中搜索列中的指定模式。

语法

SELECT 字段 FROM 表名 WHERE 搜索字段 LIKE 条件;
//  查询 loglists 表中 text 字段
//  text含有a字母
//  包含所有字段
SELECT * FROM loglists WHERE name LIKE "%a%";

模糊搜索规则:

  1. '%a':以a结尾的数据
  2. 'a%':以a开头的数据
  3. '%a%':含有a的数据
  4. '_a_':三位且中间字母是a
  5. '_a':两位且结尾字母是a
  6. 'a_':两位且开头字母是a
IN

IN操作符允许在WHERE子句中规定多个值。

语法

SELECT 字段 FROM 表名 WHERE 查询字段 in 查询条件;
//  在 loglists 查询 name 字段为 a 或 b的数据
SELECT * FROM loglists WHERE name in ("a","b");

若不使用IN操作符也是可以实现的:

SELECT * FROM loglists WHERE name="a" OR name="b";

这样的写法与上面是等价的。

BETWEEN

BETWEEN操作符用于选取介于两个值之间的数据范围内的值。

语法

SELECT 字段 from 表明 WHERE 条件字段 BETWEEN 条件1 AND 条件2;
//  在 loglists 表中查询 id 为 9-11之间的数据
SELECT * from loglists WHERE id BETWEEN 9 AND 11;
JOIN 与 INNER JOIN

join用于把来自两个或多个表的行结合起来。INNER JOIN1产生的结果集中,是表1和表二2的交集。

img_innerjoin.gif

语法

SELECT 字段(loglists.id) FROM 表1 INNER JOIN 表2 ON 条件;

//  查询 loglists 与 children 表
//  loglists.id 与 children.cid 相同的数据
//  查询字段为 
//  loglists.id,
//  loglists.name,
//  children.age,
//  loglists.content,
//  loglists.text 
SELECT 
    l.id,
    l.name,
    c.age,
    l.content,
    l.text 
FROM
    loglists AS l
INNER JOIN 
    children AS c
ON 
    l.id = c.cid;
LEFT JOIN

LEFT JOIN关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为NULL

img_leftjoin.gif

语法

SELECT 字段 FROM 表1 LEFT JOIN 表二 ON 条件;

//  查询 loglists 与 children 表
//  loglists.id 与 children.cid 相同的数据
//  查询字段为 
//  loglists.id,
//  loglists.name,
//  children.age,
//  loglists.content,
//  loglists.text 
SELECT
    l.id,
    l.`name`,
    c.age,
    l.text,
    l.content
FROM
    loglists AS l 
LEFT JOIN
    children AS c 
ON
    l.id = c.age;

查询数据如下:

id name age text content
12 aaron 12 简介 什么都没有
13 angie null 简介 有点东西
RIGHT JOIN

RIGHT JOIN关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为NULL

img_rightjoin.gif

语法

SELECT 字段 FROM 表1 RIGHT JOIN 表二 ON 条件;

//  查询 loglists 与 children 表
//  loglists.id 与 children.cid 相同的数据
//  查询字段为 
//  loglists.id,
//  loglists.name,
//  children.age,
//  loglists.content,
//  loglists.text 
SELECT 
    l.id,
    c.age,
    l.`name`,
    l.text,
    l.content
FROM
    loglists AS l
RIGHT JOIN
    children AS c
ON
    l.id=c.age;

查询数据如下:

id name age text content
12 aaron 12 简介 什么都没有
null null 55 null null
null null 77 null null

总结

简单的做了一些笔记,虽然很基础个人觉得很实用,如果哪里有错误,请在下方留言指正,我会尽快做出修改。


Aaron
4k 声望6.1k 粉丝

Easy life, happy elimination of bugs.