SQL学习笔记(1)

这篇博客介绍了SQL的基础知识,从登录MySQL、显示和操作数据库开始,讲解了如何检索、排序和过滤数据,重点包括WHERE子句、ORDER BY、通配符过滤和计算字段的操作。
摘要由CSDN通过智能技术生成

1. 登录mysql

$ mysql -u root -p
  root

2. 显示所有数据库

SHOW DATABASES;

3. 创建数据库

CREATE DATABASE test_db; -- 创建数据库test_db

4. 使用数据库

USE test_db;

5. 显示数据库中所有的表table

SHOW TABLES;

6. 数据库的行和列

6.1 列

表是由一个或多个列组成的。

每个列都有相应的数据类型。

6.2 行

表中的一条记录。行=记录

7. 主键

表中每一行都应该有一列(或几列)可以唯一标识自己。

虽然不是必须要主键,但是还是建议定义主键。

表中任意列都可以作为主键,只要满足一下条件:

  • 任意两行不具有相同的主键值(唯一性)
  • 每一行都必须具有一个主键值(主键列不允许控制NULL)
  • 主键列中的值不允许修改和更新
  • 主键值不能重用(如果某行从表中删除,它的主键不能赋给以后的新行)

注意,可以使用多列作为主键。在使用多列时,以上规则适用于所有的列。所有列值得组合必须是唯一的(主键列中的单个列的值可以不唯一,但是这些列的组合必须唯一)

8. 检索数据

8.1 检索单个列
 SELECT username FROM user;  -- 从表user中检索username列

注意多条SQL语句以分号;分隔。建议在单挑SQL语句后总是写上分号。

SQL不区分大小写,但是建议对于关键字使用大写,其他如列名表名使用小写。

8.2 检索多个列

列名用逗号隔开

 SELECT username, password FROM user; -- 从表user中检索username和password列
8.3 检索所有列

使用通配符*标识所有的列

 SELECT * FROM user; -- 从表user中检索所有列
8.4 检索不同的值DISTINCE

使用distinct只返回不同的值,需要放在列名前面

 SELECT DISTINCT username FROM user;

注意,DISTINCT不能用于部分列,而是用于所有的列。即为DISTINCT返回的是多个列的唯一组合。

8.5 限制结果

MYSQL通过LIMIT来限制返回结果

 SELECT username FROM user LIMIT 3,4; -- 从第3条结果开始返回四条结果 SELECT username FROM user LIMIT 4 OFFSET 3; -- 与上面的结果相同。需要注意limit后面的数字与上面是反的

注意表中的行是从第0行开始的而不是第1行

9. 注释

  • 单行注释:

    -- 这是单行注释# 这是单行注释
    
  • 多行注释

    /*这是多行注释*/
    

10. 排序检索数据 ORDER BY

10.1 按单个列排序
SELECT username FROM user ORDER BY username; -- 根据行的username对结果进行排序SELECT username FROM user ORDER BY password; -- 根据行的password对结果进行排序

必须保证ORDER BY出现在SELECT语句最后。如果不是最后,就会出错。

需要注意,ORBER BY作为排序依据的列可以不是SELECT检索的列(如上面的第二个例子)

10.2 按多个列排序

用逗号分隔开即可

SELECT username FROM user ORDER BY username,password; -- 根据行的username对结果进行排序,然后在此结果上根据password进行排序

上面的例子中,仅当多个行的username值相同时才根据password进行排序。如果所有行的username都唯一,那么就不会根据password排序

10.3 按列位置排序
SELECT username,password FROM user ORDER BY 1,2; -- 先根据SELECT的第一个列排序,然后在此基础上根据SELECT的第二个列排序

需要注意这里ORDER BY后面的列数是SELECT后面跟的要检索的列的顺序。如上面例子中username的顺序就是1,password的顺序就是2

10.4 指定排序方向:升序降序

默认是用升序排列的。

如果要用降序,需要指定DESC(DESCENDING)关键字

DESC关键字只应用到它前面的一个列名。如

SELECT username,password FROM user ORDER BY username DESC,password; -- 先按照username进行降序排列,在此基础上按照password进行升序排列

如果要想在多个列上进行降序排列,那么每个列都要指定DESC关键字

ELECT username,password FROM user ORDER BY username DESC,password DESC; -- 先按照username进行降序排列,在此基础上按照password进行降序排列

与DESC相对的是ASC(ASCENDING升序排列),ASC基本没用处,因为默认就是升序排列

11. 过滤数据 WHERE子句

在SELECT语句中,数据根据WHERE子句中指定的过滤条件进行过滤。WHERE在FROM子句之后给出。

如果同时也有order by子句,那么要保证order by在最后。

SELECT username FROM user WHERE username > 'a'; -- 过滤username列大于'a'的结果

WHERE子句操作符

操作符说明
=等于
<> !=不等于
<小于
<=小于等于
!<不小于
>大于
>=大于等于
!>不大于
BETWEEN AND在指定两个值之间,如BETWEEN 5 AND 10
IS NULL为NULL值

注意,当比较的值是字符串时,需要用单引号包裹住。如果是数值的话则不用

SELECT username FROM user WHERE username > 'aaa'; -- 过滤username列大于字符串'aaa'的结果SELECT price FROM user WHERE price > 10; -- 过滤price列大于数值10的结果

范围值检查

使用BETWEEN AND操作符来检查某个范围的值

SELECT price FROM user WHERE price BETWEEN 5 AND 10; -- 过滤price在5-10的结果(包括5和10)

空值检查

NULL:无值。可以通过IS NULL来检查是否是NULL

SELECT username FROM userwhere username IS NULL; -- 过滤username是NULL的结果

12. 高级过滤:逻辑操作符、IN、NOT

12.1 逻辑操作符:

通过AND(与)和OR(或)来对WHERE子句进行组合

AND与

SELECT username FROM userWHERE username > 'a' AND username < 'z'; -- 过滤username大于'a'且小于'z'的结果

OR或

SELECT username FROM userWHERE username > 'a' OR password > '0'; -- 过滤username大于'a'或者password大于'0'的结果

需要注意当WHERE子句中同时出现AND和OR时,由于AND的优先级较高,因此先处理AND后处理OR。因此建议使用括号()来对操作符进行明确优先级分组,避免混乱

SELECT username FROM userWHERE (username = 'wudi' OR username = '111') AND password > '0';-- 过滤出username为'wudi'或'111'且password大于'0'的结果
12.2 IN操作符

IN用来指定范围,IN取一组逗号分隔、括在圆括号中的合法值

SELECT username FROM userWHERE username IN ('wudi','111');-- 过滤username为'wudi'或'111'

OR也可以实现IN相同的功能,但是IN更加清晰直观,且IN比OR执行的更快。

并且IN最大的优点是可以包含其他select子句

12.3 NOT操作符

否定其后所跟的任何条件

SELECT username FROM userWHERE NOT username = '111';-- 过滤username不为'111'的结果

13. 通配符过滤

在where子句中使用LIKE操作符配合通配符进行过滤,且通配符过滤只能用于字符串类型的列,非字符串类型的列不能用通配符过滤。

通配符:用来匹配值的一部分得特殊字符

13.1 百分号%通配符

%表示任何字符出现任何次数(包括0次)

%不匹配NULL

SELECT username FROM userWHERE username LIKE 'wu%'; -- 过滤以'wu'开头的username列
SELECT username FROM userWHERE username LIKE '%wu%'; -- 过滤'wu'出现在任何位置的username列
SELECT username FROM userWHERE username LIKE 'w%i'; -- 过滤以'w'开头'i'结尾的username列

注意有些DBMS使用空格来填补字段内容。例如某列有10个字符,而某行的该列值为’abc’,那么为了填满该列,需要在’abc’文本后面填充7个空格。这时使用’%c’匹配以’c’结尾的字段就会失败,这时的解决方法是用’%c%'来匹配’c’字符之后的空格,但是最好的方法是先用函数去掉多余的空格再进行通配符匹配。

13.2 下划线_通配符

只匹配单个字符,不能多也不能少

SELECT username FROM userWHERE username LIKE '__di'; -- 过滤'**di'这种字段+----------+| username |+----------+| wudi     || wudi     |+----------+2 rows in set (0.00 sec)
13.3 方括号[]通配符,MYSQL不支持

用来指定一个字符集,只匹配单个字符

SELECT username FROM userWHERE username LIKE '[abw]%';-- 过滤以'a'或'b'或'w'开头的字段

可以用’^'符号来否定字符集,NOT能获得一致结果

SELECT username FROM userWHERE username LIKE '[^abw]%';-- 过滤不以'a'或'b'或'w'开头的字段SELECT username FROM userWHERE NOT username LIKE '[abw]%';-- 结果一致
13.4 使用通配符的建议
  • 不要过度使用通配符,如果其他操作符能达到目的就用其他操作符
  • 尽量不要把通配符放于开始处,这样搜索起来是最慢的。

14. 计算字段

计算字段不存在于数据库表中,而是在SELECT语句中创建的。

有时我们需要从数据库中直接获取转换、计算、格式化后的数据,而不是检索出数据后由客户端应用程序进行处理,这时就需要用到计算字段。因为在数据库服务器上完成这些操作比在客户端中完成要快得多。

14.1 拼接字段

MYSQL中使用CONCAT函数将值连接在一起

SELECT CONCAT(username, ',', password) FROM user;-- 将username列,','字符,password列拼接起来形成一个拼接字段(可以理解为一个新的列)

其他的某些DBMS使用+和||进行拼接字段

SELECT username + ',' + password FROM user;
SELECT username || ',' || password FROM user;

去除字段左右空格

注意有些DBMS使用空格来填补字段内容,因此在拼接后会出现空格。因此可以先通过函数去除多余空格再进行拼接

TRIM()  -- 去掉字段左右空格RTRIM() -- 去掉字段右边空格LTRIM() -- 去掉字段左边空格

实例:将两个列字段去除多余空格后拼接

SELECT CONCAT(TRIM(username),',',TRIM(password))FROM user;
14.2 使用别名AS

可以发现上面的拼接字段的新列没有名字,因此可以使用AS关键字给列起别名

SELECT CONCAT(TRIM(username),',',TRIM(password)) AS user_passFROM user ORDER BY user_pass;-- 将拼接字段的新列起别名为user_pass
14.3 计算字段

对于数值类型的列,可以进行数值计算(+、-、*、/)。并且可以通过圆括号()确定计算的优先级关系

SELECT price * num AS sum_priceFROM user;-- 检索出的sum_price列是一个计算字段,结果是price列*num列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值