为了练习,我们将表在扩展一下
MariaDB [testdb]> DELETE FROM students WHERE id BETWEEN 7 AND 12; MariaDB [testdb]> CREATE TABLE score (id TINYINT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,score TINYINT(3)); MariaDB [testdb]> ALTER TABLE students ADD sid TINYINT(2); MariaDB [testdb]> UPDATE students SET sid=6 WHERE id=6; MariaDB [testdb]> INSERT score SET score=87; MariaDB [testdb]> SELECT * FROM students; +----+---------------+------+--------+---------+------+ | id | name | ages | gender | address | sid | +----+---------------+------+--------+---------+------+ | 1 | tom | 26 | M | NULL | 1 | | 2 | jerry | 19 | M | NULL | 2 | | 3 | maria | 19 | F | NULL | 3 | | 4 | xiaolongnv | 18 | F | NULL | 4 | | 5 | dongfangbubai | 28 | F | NULL | 5 | | 6 | ouyangfeng | 56 | M | NULL | 6 | +----+---------------+------+--------+---------+------+ MariaDB [testdb]> SELECT * FROM score; +----+-------+ | id | score | +----+-------+ | 1 | 99 | | 2 | 98 | | 3 | 88 | | 4 | 68 | | 5 | 78 | | 6 | 87 | +----+-------+
JOIN ON:交叉连接
INNER JOIN ON:内连接
LEFT OUTER JOIN ON:左外连接
RIGHT OUTER JOIN ON:右外连接
UNION ON:完全外连接
MariaDB [testdb]> SELECT * FROM students AS s,score AS o WHERE s.sid=o.id; #俩张表取交集
1、交叉连接
MariaDB [testdb]> SELECT * FROM students JOIN score;
2、内连接
MariaDB [testdb]> SELECT t.name,s.score FROM students AS t INNER JOIN score AS s ON t.sid=s.id; +---------------+-------+ | name | score | +---------------+-------+ | tom | 99 | | jerry | 98 | | maria | 88 | | xiaolongnv | 68 | | dongfangbubai | 78 | | ouyangfeng | 87 | +---------------+-------+
3、外连接
MariaDB [testdb]> SELECT t.name,s.score FROM students AS t LEFT JOIN score AS s ON t.sid=s.id; #左外连接 +---------------+-------+ | name | score | +---------------+-------+ | tom | 99 | | jerry | 98 | | maria | 88 | | xiaolongnv | 68 | | dongfangbubai | 78 | | ouyangfeng | 87 | +---------------+-------+
MariaDB [testdb]> SELECT * FROM students AS t RIGHT JOIN score AS s ON t.sid=s.id; #右外连接
4、完全外连接
MariaDB [testdb]> SELECT name,address FROM students -> UNION -> SELECT user,host FROM mysql.user; +---------------+-----------+ | name | address | +---------------+-----------+ | tom | NULL | | jerry | NULL | | maria | NULL | | xiaolongnv | NULL | | dongfangbubai | NULL | | ouyangfeng | NULL | | root | 127.0.0.1 | | root | ::1 | | | centos7 | | root | centos7 | | | localhost | | root | localhost | +---------------+-----------+
5、自连接
MariaDB [testdb]> ALTER TABLE students ADD tid TINYINT(2); #再加一个tid字段 MariaDB [testdb]> SELECT * FROM students; +----+---------------+------+--------+---------+------+------+ | id | name | ages | gender | address | sid | tid | +----+---------------+------+--------+---------+------+------+ | 1 | tom | 26 | M | NULL | 1 | 2 | | 2 | jerry | 19 | M | NULL | 2 | 1 | | 3 | maria | 19 | F | NULL | 3 | 4 | | 4 | xiaolongnv | 18 | F | NULL | 4 | 5 | | 5 | dongfangbubai | 28 | F | NULL | 5 | 4 | | 6 | ouyangfeng | 56 | M | NULL | 6 | 4 | +----+---------------+------+--------+---------+------+------+
MariaDB [testdb]> SELECT s1.name AS studentname,s2.name AS teachername FROM students AS s1 INNER JOIN students AS s2 ON s1.id=s2.tid; +---------------+---------------+ | studentname | teachername | +---------------+---------------+ | jerry | tom | | tom | jerry | | xiaolongnv | maria | | dongfangbubai | xiaolongnv | | xiaolongnv | dongfangbubai | | xiaolongnv | ouyangfeng | +---------------+---------------+
七、子查询
子查询:在查询语句嵌套着查询语句,性能较差,基于某语句的查询结果再次进行的查询
1、用在WHERE子句中的子查询
用于比较表达式中的子查询;子查询仅能返回单个值
MariaDB [testdb]> SELECT name,ages FROM students WHERE ages > (SELECT AVG(ages) FROM students); #查询大于平均年龄的同学
用于IN中的子查询:子查询应该单键查询并返回一个或多个值从构成列表
2、用于FROM子句中的子查询
SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
八、数据类型
选择正确的数据类型对于获得高性能至关重要,三大原则:
- 更小的通常更好,尽量使用可正确存储数据的最小数据类型
- 简单就好,简单数据类型的操作通常需要更少的CPU周期
- 尽量避免NULL,包含为NULL的列,对MySQL更难优化
1、数值型
精确数值
- INT
- TINYINT 微整型 1
- SMALLINT 小整型 2
- MEDIUMINT 中整型 3
- INT 整型 4
- BIGINT 大整型 8
- DECIMAL 精确定点型
近似数值
- FLOAT 单精度浮点型 4
- DOUBLE 双精度浮点型 8
- REAL
- BIT
2、字符型
定长
- CHAR(不区分大小写)255
- BINARY(区分大小写)
变长
- VARCHAR(不区分大小写)65,535
- VARBINNARY(区分大小写)
TEXT(不区分大小写)
- TINYTEXT 255
- TEXT 65,535
- MEDIUMTEXT 16,777,215
- LONGTEXT 4,294,967,295
BLOB(区分大小写)
- TINYBLOB 微二进制大对象 255
- BLOB 二进制大对象 64K
- MEDIUMBLOB 中二进制大对象 16M
- LONGBLOB 长二进制大对象 4G
ENUM 枚举 65535种变化
SET 集合 1-64个字符串,可以随意组合
3、日期时间型
- DATE 3
- TIME 3
- DATETIME 8
- TIMESTAMP 4
- YEAR{2|4} 1
4、布尔型
- BOOL,BOOLEAN:布尔型,是TINYINT(1)的同义词。zero值被视为假。非zero值视为真。
参考官方文档:https://dev.mysql.com/doc/refman/5.5/en/data-types.html
总结
到此这篇关于SQL语法的文章就介绍到这了,更多相关SQL语法内容请搜索
更多SQL内容来自木庄网络博客