当前位置:首页 > 休闲

sql语句菜鸟教程

```html

写SQL最怕的句菜就是一上来就背语法。我见过太多人抱着“21天精通SQL”的鸟教书啃,结果连一个带WHERE条件的句菜查询都写不利索。其实你只要记住三件事:从哪张表拿数据、鸟教拿哪些列、句菜有什么条件。鸟教剩下的句菜都是在这个骨架上添肉。

先看最基础的鸟教。假设你有一张叫users的句菜表,里面有id、鸟教name、句菜age、鸟教city四个字段。句菜想看看所有人的鸟教名字和年龄,就这么写:

SELECT name,句菜 age FROM users;

星号*是偷懒写法,代表所有列。但我不建议你老用它——尤其是表里字段多的时候,拉一堆用不上的数据回来,看着就烦。明确写出列名,代码可读性会好很多。

接下来加条件。比如只想看北京的用户:

SELECT name, age FROM users WHERE city = '北京';

字符串要用单引号包起来,数字不用。这个坑新手经常踩。还有WHERE age > 18、WHERE age BETWEEN 18 AND 30、WHERE city IN ('北京', '上海'),都是很顺手的写法。LIKE用来模糊匹配,WHERE name LIKE '张%'能找出所有姓张的。百分号代表任意多个字符。

排序和限制条数也常用。按年龄从大到小排,只看前10条:

SELECT name, age FROM users WHERE city = '北京' ORDER BY age DESC LIMIT 10;

DESC是降序,ASC是升序(默认就是升序,不写也行)。LIMIT在MySQL和PostgreSQL里都这么用,SQL Server得换成TOP,这个差异知道就好。

数据多了就得聚合。COUNT、SUM、AVG、MAX、MIN这五个函数能解决大部分统计需求。比如算一下北京用户的平均年龄:

SELECT AVG(age) FROM users WHERE city = '北京';

想按城市分组看每个城市的平均年龄,就得用GROUP BY:

SELECT city, AVG(age) FROM users GROUP BY city;

注意了,SELECT后面除了聚合函数,其他列都必须出现在GROUP BY里。这条规则很多人栽过跟头。分组之后还想过滤,不能用WHERE,得用HAVING。比如只看平均年龄大于25的城市:

SELECT city, AVG(age) FROM users GROUP BY city HAVING AVG(age) > 25;

为什么WHERE不行?因为WHERE在分组前过滤行,HAVING在分组后过滤组。执行顺序是FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT。记住这个顺序,写复杂查询时脑子不乱。

多表查询是绕不过去的坎。假设还有一张orders表,字段是id、user_id、amount。想查每个用户的名字和订单金额:

SELECT users.name, orders.amount FROM users JOIN orders ON users.id = orders.user_id;

JOIN默认是INNER JOIN,只返回两边都匹配上的行。如果想让没有订单的用户也显示出来,就用LEFT JOIN,右边没匹配的字段会填NULL。这个区别在报表里特别重要——漏掉没下单的用户,老板能跟你急。

插入、更新、删除也顺手说一下。插入一行:

INSERT INTO users (name, age, city) VALUES ('李四', 28, '广州');

更新:

UPDATE users SET age = 29 WHERE name = '李四';

删掉:

DELETE FROM users WHERE name = '李四';

跑UPDATE和DELETE之前,先用同样的WHERE条件写个SELECT看看会影响到哪些行。这个习惯能救你的命。我就干过忘了写WHERE,把整张表的age全改成18的蠢事。

最后提一嘴索引。WHERE和JOIN里用到的列,加上索引查询会快很多。但别瞎加——索引占空间,写操作也会变慢。一般给主键、外键、经常用来过滤的字段加就行。用EXPLAIN命令看看查询计划,能帮你判断索引有没有生效。

SQL这东西,看十遍不如自己建张表敲一遍。找个在线的SQL练习网站,把上面这些语句挨个跑通,比看什么教程都管用。

```

分享到: