MySQL系列之四 SQL语法


当前第2页 返回上一页

为了练习,我们将表在扩展一下

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内容来自木庄网络博客


标签:SQL

返回前面的内容

相关阅读 >>

简单聊一聊sql注入及防止sql注入

springboot之使用springdatajpa的自定义sql方式

postgresql 实现列转行问题

sql无效字符 执行sql语句报错解决方案

sql优化经验总结

mysql闪回工具binlog2sql安装配置教程详解

sql修改表结构的操作有哪些?

sql的常用数据类型列表详解

sql常用日期查询语句及显示格式设置

sql与pl /sql之间的简单比较

更多相关阅读请进入《sql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...