从零开始数据库阶段一(二)

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命令的关系类似,如果有后者的基础,上手也会非常快。

猜你喜欢

转载自blog.csdn.net/lovestackover/article/details/80960680
今日推荐