1. 预备阶段
索引的概念不是很难,但是想要建立高效的索引还是需要经验的,然后再进行下面的学习的时候先回顾了数据库索引、mysql索引知识点汇总、DSAA补充之B树、B+树。以下引用来自runoob。
2. LIKE
- like 匹配/模糊匹配,会与 % 和 _ 结合使用。
- SQL原语:SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern;
- like后面没有与%或者_结合时,效果和=一样
'%a' //以a结尾的数据
'a%' //以a开头的数据
'%a%' //含有a的数据
'_a_' //三位且中间字母是a的
'_a' //两位且结尾字母是a的
'a_' //两位且开头字母是a的
根据昨天的学习迅速建立一个数据表,并实践上面的结论:
MariaDB [dh]> CREATE TABLE dh_tl( id INT AUTO_INCREMENT, name VARCHAR(255) NOT NULL, goal INT NOT NULL, PRIMARY KEY(id));
Query OK, 0 rows affected (0.14 sec)
MariaDB [dh]> INSERT INTO dh_tl (name,goal) VALUES ('abc',100),('bcd',99),('cdf',98);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [dh]> SELECT * FROM dh_tl;
+----+------+------+
| id | name | goal |
+----+------+------+
| 1 | abc | 100 |
| 2 | bcd | 99 |
| 3 | cdf | 98 |
+----+------+------+
3 rows in set (0.00 sec)
MariaDB [dh]> SELECT * FROM dh_tl WHERE name LIKE '%c';
+----+------+------+
| id | name | goal |
+----+------+------+
| 1 | abc | 100 |
+----+------+------+
1 row in set (0.00 sec)
MariaDB [dh]> SELECT * FROM dh_tl WHERE name LIKE 'c%';
+----+------+------+
| id | name | goal |
+----+------+------+
| 3 | cdf | 98 |
+----+------+------+
1 row in set (0.00 sec)
MariaDB [dh]> SELECT * FROM dh_tl WHERE name LIKE 'c_';
Empty set (0.00 sec)
MariaDB [dh]> SELECT * FROM dh_tl WHERE name LIKE '_c_';
+----+------+------+
| id | name | goal |
+----+------+------+
| 2 | bcd | 99 |
+----+------+------+
1 row in set (0.00 sec)
MariaDB [dh]>
3. ORDER BY
- SQL原语:SELECT column_name,column_name FROM table_name ORDER BY column_name,column_name ASC|DESC;
默认升序
以上面的例子,进行练习:
MariaDB [dh]> SELECT * FROM dh_tl ORDER BY goal;
+----+------+------+
| id | name | goal |
+----+------+------+
| 3 | cdf | 98 |
| 2 | bcd | 99 |
| 1 | abc | 100 |
+----+------+------+
3 rows in set (0.00 sec)
MariaDB [dh]>
4. UNION
- SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;不含重复数据
- SELECT column_name(s) FROM table1
UNION ALL
SELECT column_name(s) FROM table2;含有重复数据
- 请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
创建一个新表,并结合使用上面的例子,练习如下:
//这里说明必须union联合的select语句必须有相同的column数
MariaDB [dh]> SELECT id,goal FROM dh_tl UNION SELECT same_name FROM by_tl ORDER BY id;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
//虽然输出了结果,但是数据结果毫无意义,所以union联合的select语句应该选择相同的列
MariaDB [dh]> SELECT id,goal FROM dh_tl UNION SELECT id,same_name FROM by_tl ORDER BY id;
+----+------+
| id | goal |
+----+------+
| 1 | 100 |
| 1 | qwe |
| 2 | 99 |
| 2 | rty |
| 3 | 98 |
| 3 | uio |
+----+------+
6 rows in set (0.01 sec)
//虽然id有重复,但是因为goal没有重复,所以还是输出了所有的结果
MariaDB [dh]> SELECT id,goal FROM dh_tl UNION SELECT id,goal FROM by_tl ORDER BY id;
+----+------+
| id | goal |
+----+------+
| 1 | 100 |
| 1 | 97 |
| 2 | 99 |
| 2 | 96 |
| 3 | 98 |
| 3 | 95 |
+----+------+
6 rows in set (0.00 sec)
//与上面形成对比
MariaDB [dh]> SELECT id FROM dh_tl UNION SELECT id FROM by_tl ORDER BY id;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
+----+
3 rows in set (0.00 sec)
MariaDB [dh]> SELECT id FROM dh_tl UNION ALL SELECT id FROM by_tl ORDER BY id;
+----+
| id |
+----+
| 1 |
| 1 |
| 2 |
| 2 |
| 3 |
| 3 |
+----+
6 rows in set (0.00 sec)
MariaDB [dh]>
5. JOIN
- JOIN 按照功能大致分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
实践是理解概念的好方法:
---两个表的id相同的记录。
MariaDB [dh]> SELECT dh_tl.id,dh_tl.name,by_tl.goal FROM dh_tl LEFT JOIN by_tl ON by_tl.id = dh_tl.id;
+----+------+------+
| id | name | goal |
+----+------+------+
| 1 | abc | 97 |
| 2 | bcd | 96 |
| 3 | cdf | 95 |
+----+------+------+
3 rows in set (0.00 sec)
---dh_tl插入第四行
MariaDB [dh]> INSERT INTO dh_tl (name,goal)VALUES('bnm',70);
Query OK, 1 row affected (0.02 sec)
---LEFT join
MariaDB [dh]> SELECT dh_tl.id,dh_tl.name,by_tl.goal FROM dh_tl LEFT JOIN by_tl ON by_tl.id = dh_tl.id;
+----+------+------+
| id | name | goal |
+----+------+------+
| 1 | abc | 97 |
| 2 | bcd | 96 |
| 3 | cdf | 95 |
| 4 | bnm | NULL |
+----+------+------+
4 rows in set (0.00 sec)
---by_tl插入第四行
MariaDB [dh]> INSERT INTO by_tl (same_name,goal)VALUES('jkl',60);
Query OK, 1 row affected (0.00 sec)
---RIGHT JOIN
MariaDB [dh]> SELECT dh_tl.id,dh_tl.name,by_tl.goal FROM dh_tl RIGHT JOIN by_tl ON by_tl.id = dh_tl.id;
+------+------+------+
| id | name | goal |
+------+------+------+
| 1 | abc | 97 |
| 2 | bcd | 96 |
| 3 | cdf | 95 |
| 4 | bnm | 60 |
+------+------+------+
4 rows in set (0.00 sec)
---RIGHT JOIN第二个例子
MariaDB [dh]> SELECT dh_tl.id,dh_tl.name,by_tl.goal FROM dh_tl RIGHT JOIN by_tl ON by_tl.same_name = dh_tl.name;
+------+------+------+
| id | name | goal |
+------+------+------+
| NULL | NULL | 97 |
| NULL | NULL | 96 |
| NULL | NULL | 95 |
| NULL | NULL | 60 |
+------+------+------+
4 rows in set (0.00 sec)
---JOIN的例子
MariaDB [dh]> SELECT dh_tl.id,dh_tl.name,by_tl.goal FROM dh_tl JOIN by_tl ON by_tl.same_name = dh_tl.name;
Empty set (0.00 sec)
MariaDB [dh]>
上述结果可以使用下面三个图理解,图片来自runoob比较简单:
6. 小结
索引部分推迟到明天,今天学习了LIKE、JOIN、UNION、ORDER BY
的使用,并且接触了SQL脚本
的概念,其和shell
脚本和shell
命令的关系类似,如果有后者的基础,上手也会非常快。