一、SQL语言的简介和规范

一种特定目的程序语言,用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。

  • 20世纪70年代,IBM开发出SQL,用于DB2
  • 1981年,IBM推出SQL/DS数据库
  • 业内标准微软和Sybase的T-SQL,Oracle的PL/SQL
  • SQL作为关系型数据库所使用的标准语言,最初是基于IBM的实现在1986年被批准的。1987年,“国际标准化组织(ISO)”把ANSI(美国国家标准化组织) SQL作为国际标准。
  • SQL:ANSI SQL ——SQL-86, SQL-89, SQL-92, SQL-99, SQL-03

SQL语言的规范

  1. 在数据库系统中,SQL语句不区分大小写(建议用大写)

  2. 但字符串常量区分大小写

  3. SQL语句可单行或多行书写,以“;”结尾

  4. 关键词不能跨多行或简写

  5. 用空格和缩进来提高语句的可读性

  6. 子句通常位于独立行,便于编辑,提高可读性

  7. 注释:

    • SQL标准:

      • /* 注释内容 */ 多行注释
      • -- 注释内容 单行注释,注意有空格
    • MySQL注释: #
  • 数据库对象的命名规则

    1. - 必须以字母开头
    2. - 可包括数字和三个特殊字符(# _ $
    3. - 不要使用MySQL的保留字
    4. - 同一database(Schema)下的对象不能同名

SQL语句的分类

  • DDL: Data Defination Language 数据定义语言

    1. - CREATE, DROP, ALTER
  • DML: Data Manipulation Language 数据操作语言

    1. - INSERT, DELETE, UPDATE
  • DCL:Data Control Language 数据控制语言

    1. - GRANT, REVOKE
  • DQL:Data Query Language 数据查询语言

    1. - SELECT

二、数据库操作

1、创建库

CREATE DATABASE [IF NOT EXISTS] db_name; 创建数据库

CHARACTER SET 'character set name' 设置字符集类型

COLLATE 'collate name' 设置排序规则

查看支持所有字符集:SHOW CHARACTER SET;

查看支持所有排序规则:SHOW COLLATION;

  1. MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS testdb;

2、删除库

​ 我不会

3、查看数据库列表

SHOW DATABASES;

三、表操作

1、创建表

  • 方法一: 直接创建

CREATE TABLE [IF NOT EXISTS] tbl_name (create_definition,...)

  1. MariaDB [testdb]> CREATE TABLE IF NOT EXISTS students (id TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,name VARCHAR(30) NOT NULL,phone CHAR(11),gender ENUM('M','F'));
  • 方法二: 通过查询现存表创建;新表会被直接插入查询而来的数据

CREATE TABLE [IF NOT EXISTS] tbl_name select_statement

  1. MariaDB [testdb]> CREATE TABLE user SELECT user,host,password FROM mysql.user;

如果只想模仿查询旧表创建一个无记录的表我们可以加入条件 WHERE 0=1;

  1. MariaDB [testdb]> CREATE TABLE user2 SELECT user,host,password FROM mysql.user WHERE 0=1;
  • 方法三: 通过复制现存的表的表结构创建,但不复制数据

CREATE TABLE [IF NOT EXISTS] tbl_name LIKE old_tbl_name

  1. MariaDB [testdb]> CREATE TABLE user3 LIKE mysql.user;

2、修改表

ALTER TABLE tbl_name [alter_specification [, alter_specification] ...]

  • 增加属性 ADD
  1. MariaDB [testdb]> ALTER TABLE students ADD age TINYINT AFTER name;
  • 删除属性 DROP
  1. MariaDB [testdb]> ALTER TABLE students DROP phone;
  • 修改属性 CHANGE, MODIFY
  1. MariaDB [testdb]> ALTER TABLE students CHANGE age ages TINYINT(2) NOT NULL;
  1. MariaDB [testdb]> ALTER TABLE students MODIFY gender ENUM('M','F');

3、删除表

  1. MariaDB [testdb]> DROP TABLE user3;

4、查看表

SHOW TABLES; 列出库中所有的表

DESC [db_name.]tb_name; 查看表结构

SHOW CREATE TABLE tbl_name; 查看创建表的命令

SHOW TABLE STATUS LIKE 'tbl_name'; 查看表状态

SHOW TABLE STATUS FROM db_name; 查看指定库中所有表状态

SHOW ENGINES; 查看所有存储引擎

四、DML: 数据操作语言

  1. MariaDB [testdb]> DESC students; #示例表
  2. +--------+---------------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +--------+---------------------+------+-----+---------+----------------+
  5. | id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
  6. | name | varchar(30) | NO | | NULL | |
  7. | ages | tinyint(2) | NO | | NULL | |
  8. | gender | enum('M','F') | YES | | NULL | |
  9. +--------+---------------------+------+-----+---------+----------------+

1、INSERT 插入数据

  • 单条记录插入

INSERT INTO tb_name (col1,col2,...) VALUES (val1,val2,...);

  1. MariaDB [testdb]> INSERT students(id,name,ages,gender) VALUES (1,'tom',26,'M');
  2. MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('jerry',19,'M');
  3. MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('maria',19,'M');
  4. MariaDB [testdb]> INSERT students SET name='ouyangfeng',ages=56,gender='M';
  • 多条记录插入

INSERT INTO tb_name (col1,col2,...) VALUES (val1,val2,...)[,(val1,val2,...),...];

  1. MariaDB [testdb]> INSERT students(name,ages,gender) VALUES ('xiaolongnv',18,'F'),('dongfangbubai',28,'F');
  1. MariaDB [testdb]> SELECT * FROM students;
  2. +----+---------------+------+--------+
  3. | id | name | ages | gender |
  4. +----+---------------+------+--------+
  5. | 1 | tom | 26 | M |
  6. | 2 | jerry | 19 | M |
  7. | 3 | maria | 19 | M |
  8. | 4 | xiaolongnv | 18 | F |
  9. | 5 | dongfangbubai | 28 | F |
  10. | 6 | ouyangfeng | 56 | M |
  11. +----+---------------+------+--------+
  • 从其他表查询数据保存到此表中
  1. MariaDB [testdb]> ALTER TABLE students ADD address TEXT; #加个字段做测试用
  1. MariaDB [testdb]> INSERT students(name,address) SELECT user,host FROM mysql.user;
  1. MariaDB [testdb]> SELECT * FROM students;
  2. +----+---------------+------+--------+-----------+
  3. | id | name | ages | gender | address |
  4. +----+---------------+------+--------+-----------+
  5. | 1 | tom | 26 | M | NULL |
  6. | 2 | jerry | 19 | M | NULL |
  7. | 3 | maria | 19 | M | NULL |
  8. | 4 | xiaolongnv | 18 | F | NULL |
  9. | 5 | dongfangbubai | 28 | F | NULL |
  10. | 6 | ouyangfeng | 56 | M | NULL |
  11. | 7 | root | 0 | NULL | 127.0.0.1 |
  12. | 8 | root | 0 | NULL | ::1 |
  13. | 9 | | 0 | NULL | centos7 |
  14. | 10 | root | 0 | NULL | centos7 |
  15. | 11 | | 0 | NULL | localhost |
  16. | 12 | root | 0 | NULL | localhost |
  17. +----+---------------+------+--------+-----------+

2、UPDATE 修改数据

UPDATE tbl_name SET col1=value1,col2=value2,... WHERE col=value;

  1. MariaDB [testdb]> UPDATE students SET gender='F' WHERE id=3;

3、DELETE 删除数据

  1. MariaDB [testdb]> DELETE FROM students WHERE name=''; #删除名字为空的记录
  2. MariaDB [testdb]> TRUNCATE TABLE user; #情况表记录

注意:一定要有限制条件(WHERE | LIMIT),否则将修改所有行的指定字段

五、SELECT:数据查询

  • AS:别名
  • WHERE:指明过滤条件以实现“选择”的功能
    • +, -, *, /, %:算术操作符
    • =, !=, <>, >, <, >=, <=:比较操作符
    • BETWEEN min_num AND max_num:在min_num和max_mun之间
    • IN (element1,element2,...):在element...中的
    • IS NULL:为空
    • IS NOT NULL:不为空
    • LIKE:做匹配,像。。。
      • %:任意长度的任意字符
      • _:单个任意字符
    • RLIKE:正则表达式,不建议用
    • REGEXP:同上
    • NOT, AND, OR, XOR:逻辑操作符
  • GROUP BY:根据指定的条件把查询结果进行“分组”以用于做“聚合”运算
    • AVG() 平均数
    • MAX() 最大数
    • MIN() 最小数
    • COUNT() 统计
    • SUM() 求和
    • HAVING :对分组聚合运算后的结果指定过滤条件。类似WHERE的作用,但只能在分组中使用
  • ORDER BY:排序
    • ASC:正序,默认
    • DESC:倒序
    • -KEYWORD:在排序时在关键字前加-可以避免把NULL排在前边
  • LIMIT [[offset,]row_count]:对查询的结果进行输出行数数量限制

1、选择

  1. MariaDB [testdb]> SELECT * FROM students WHERE name='maria'; #查询maria的信息
  2. MariaDB [testdb]> SELECT * FROM students WHERE id BETWEEN 2 AND 5; #查询2到5号学生的信息
  3. MariaDB [testdb]> SELECT * FROM students WHERE name IN ('jerry','xiaolongnv'); #查询jerry和xiaolongnv的信息
  4. MariaDB [testdb]> SELECT * FROM students WHERE gender IS NOT NULL; #查询年龄不为空的信息
  5. MariaDB [testdb]> SELECT * FROM students WHERE name LIKE '%o%'; #查询姓名中包含'o'的信息

2、投影

  1. MariaDB [testdb]> SELECT user AS 用户,host AS 主机,password AS 密码 FROM mysql.user;

3、分组

  1. MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender; #查询男生、女生年龄的平均值
  2. MariaDB [testdb]> SELECT gender,AVG(ages) FROM students GROUP BY gender HAVING gender='M'; #只显示男生的平均年龄信息

4、排序

  1. MariaDB [testdb]> SELECT * FROM students ORDER BY ages DESC; #按年龄排序,倒序显示
  2. MariaDB [testdb]> SELECT * FROM students WHERE ages > 0 ORDER BY ages LIMIT 3; #按年龄排序,过滤年龄大于0的,正序排序,取前三条记录

六、多表查询

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

  1. MariaDB [testdb]> DELETE FROM students WHERE id BETWEEN 7 AND 12;
  2. MariaDB [testdb]> CREATE TABLE score (id TINYINT(2) UNSIGNED AUTO_INCREMENT PRIMARY KEY,score TINYINT(3));
  3. MariaDB [testdb]> ALTER TABLE students ADD sid TINYINT(2);
  4. MariaDB [testdb]> UPDATE students SET sid=6 WHERE id=6;
  5. MariaDB [testdb]> INSERT score SET score=87;
  6. MariaDB [testdb]> SELECT * FROM students;
  7. +----+---------------+------+--------+---------+------+
  8. | id | name | ages | gender | address | sid |
  9. +----+---------------+------+--------+---------+------+
  10. | 1 | tom | 26 | M | NULL | 1 |
  11. | 2 | jerry | 19 | M | NULL | 2 |
  12. | 3 | maria | 19 | F | NULL | 3 |
  13. | 4 | xiaolongnv | 18 | F | NULL | 4 |
  14. | 5 | dongfangbubai | 28 | F | NULL | 5 |
  15. | 6 | ouyangfeng | 56 | M | NULL | 6 |
  16. +----+---------------+------+--------+---------+------+
  17. MariaDB [testdb]> SELECT * FROM score;
  18. +----+-------+
  19. | id | score |
  20. +----+-------+
  21. | 1 | 99 |
  22. | 2 | 98 |
  23. | 3 | 88 |
  24. | 4 | 68 |
  25. | 5 | 78 |
  26. | 6 | 87 |
  27. +----+-------+

JOIN ON:交叉连接

INNER JOIN ON:内连接

LEFT OUTER JOIN ON:左外连接

RIGHT OUTER JOIN ON:右外连接

UNION ON:完全外连接

  1. MariaDB [testdb]> SELECT * FROM students AS s,score AS o WHERE s.sid=o.id; #俩张表取交集

1、交叉连接

  1. MariaDB [testdb]> SELECT * FROM students JOIN score;

2、内连接

  1. MariaDB [testdb]> SELECT t.name,s.score FROM students AS t INNER JOIN score AS s ON t.sid=s.id;
  2. +---------------+-------+
  3. | name | score |
  4. +---------------+-------+
  5. | tom | 99 |
  6. | jerry | 98 |
  7. | maria | 88 |
  8. | xiaolongnv | 68 |
  9. | dongfangbubai | 78 |
  10. | ouyangfeng | 87 |
  11. +---------------+-------+

3、外连接

  1. MariaDB [testdb]> SELECT t.name,s.score FROM students AS t LEFT JOIN score AS s ON t.sid=s.id; #左外连接
  2. +---------------+-------+
  3. | name | score |
  4. +---------------+-------+
  5. | tom | 99 |
  6. | jerry | 98 |
  7. | maria | 88 |
  8. | xiaolongnv | 68 |
  9. | dongfangbubai | 78 |
  10. | ouyangfeng | 87 |
  11. +---------------+-------+
  1. MariaDB [testdb]> SELECT * FROM students AS t RIGHT JOIN score AS s ON t.sid=s.id; #右外连接

6、完全外连接

  1. MariaDB [testdb]> SELECT name,address FROM students
  2. -> UNION
  3. -> SELECT user,host FROM mysql.user;
  4. +---------------+-----------+
  5. | name | address |
  6. +---------------+-----------+
  7. | tom | NULL |
  8. | jerry | NULL |
  9. | maria | NULL |
  10. | xiaolongnv | NULL |
  11. | dongfangbubai | NULL |
  12. | ouyangfeng | NULL |
  13. | root | 127.0.0.1 |
  14. | root | ::1 |
  15. | | centos7 |
  16. | root | centos7 |
  17. | | localhost |
  18. | root | localhost |
  19. +---------------+-----------+

5、自连接

  1. MariaDB [testdb]> ALTER TABLE students ADD tid TINYINT(2); #再加一个tid字段
  2. MariaDB [testdb]> SELECT * FROM students;
  3. +----+---------------+------+--------+---------+------+------+
  4. | id | name | ages | gender | address | sid | tid |
  5. +----+---------------+------+--------+---------+------+------+
  6. | 1 | tom | 26 | M | NULL | 1 | 2 |
  7. | 2 | jerry | 19 | M | NULL | 2 | 1 |
  8. | 3 | maria | 19 | F | NULL | 3 | 4 |
  9. | 4 | xiaolongnv | 18 | F | NULL | 4 | 5 |
  10. | 5 | dongfangbubai | 28 | F | NULL | 5 | 4 |
  11. | 6 | ouyangfeng | 56 | M | NULL | 6 | 4 |
  12. +----+---------------+------+--------+---------+------+------+
  1. 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;
  2. +---------------+---------------+
  3. | studentname | teachername |
  4. +---------------+---------------+
  5. | jerry | tom |
  6. | tom | jerry |
  7. | xiaolongnv | maria |
  8. | dongfangbubai | xiaolongnv |
  9. | xiaolongnv | dongfangbubai |
  10. | xiaolongnv | ouyangfeng |
  11. +---------------+---------------+

七、子查询

子查询:在查询语句嵌套着查询语句,性能较差,基于某语句的查询结果再次进行的查询

1、用在WHERE子句中的子查询

  • 用于比较表达式中的子查询;子查询仅能返回单个值
  1. 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、字符型

  • 定长

    1. - CHAR(不区分大小写)255
    2. - 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

@_@ 2018.06.07 13:37

SQL语法:MySQL系列之四的更多相关文章

  1. Sql Server来龙去脉系列之四 数据库和文件

        在讨论数据库之前我们先要明白一个问题:什么是数据库?     数据库是若干对象的集合,这些对象用来控制和维护数据.一个经典的数据库实例仅仅包含少量的数据库,但用户一般也不会在一个实例上创建太多 ...

  2. SQL Server 学习系列之四(SQL 内幕)

    SQL Server 学习系列之四(SQL 内幕) SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL ...

  3. Sql语法高级应用之四:使用视图实现多表联合数据明细

    之前章节我们讲到:如果某个表的数据是多个表的联合,并且存在列与列的合并组成新列,用视图是最好的方案. 下面我分享两个个真实的SQL语句案例 USE Wot_Inventory GO FROM sys. ...

  4. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

  5. Sql Server来龙去脉系列之三 查询过程跟踪

    我们在读写数据库文件时,当文件被读.写或者出现错误时,这些过程活动都会触发一些运行时事件.从一个用户角度来看,有些时候会关注这些事件,特别是我们调试.审核.服务维护.例如,当数据库错误出现.列数据被更 ...

  6. Sql Server来龙去脉系列之二 框架和配置

    本节主要讲维持数据的元数据,以及数据库框架结构.内存管理.系统配置等.这些技术点在我们使用数据库时很少接触到,但如果要深入学习Sql Server这一章节也是不得不看.本人能力有限不能把所有核心的知识 ...

  7. Sql Server来龙去脉系列之一 目录篇

    从工作一直到现在都没怎么花功夫深入学习下Sql Server数据库,在使用Sql Server时90%的时间基本上都是在接触T-SQL,所以数据库这块基本上属于菜鸟级别.至于数据库的底层框架以及运行机 ...

  8. SQL Server 学习系列之六

    SQL Server 学习系列之六 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL 关键字) SQ ...

  9. SQL Server 学习系列之五

    SQL Server 学习系列之五 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL 关键字) SQ ...

随机推荐

  1. 一个类的类类型是Class类的实例,即类的字节码

    new 是静态加载类,编译时期加载.一遍功能性的类 需要动态加载

  2. linux命令学习笔记(60):scp命令

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行 拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务 ...

  3. 如何实现1080P延迟低于500ms的实时超清直播传输技术

    再来当一次技术搬运工,内容来自高可用框架,学霸君工程师袁荣喜的如何实现1080P延迟低于500ms的实时超清直播传输技术. 导语:视频直播是很多技术团队及架构师关注的问题,在实时性方面,大部分直播是准 ...

  4. 2017-2018-1 20179215《Linux内核原理与分析》第九周作业

    实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 一.实验要求  (1)理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判 ...

  5. python mysql 查询返回字典结构

    cur = self.conn.cursor(MySQLdb.cursors.DictCursor)加上MySQLdb.cursors.DictCursor可以返回字典结构 {列名:值} class ...

  6. nginx与apache 限制ip连接数和带宽方法

    今天有个人问我,nginx怎么限制ip连接数,突然想不起来了,年龄大了,脑子不怎么好使了.还要看一下配置才想起了.那个人又问我,你测试过的吗?一下子把我问蒙了,我真没测试过了,也不知道启作用了没有. ...

  7. PAT1106(BFS)

    PAT 1106 思路 BFS用在tree上,这一个题里主要关注的是用vector去保存每一个节点所连接的子节点,当BFS 时,一旦发现该节点下面没有子节点,这一层一定是最短的路径,然后用当前的层数去 ...

  8. 转载:PLSQL Developer使用技巧整理

    Shortcut(快捷方式): Edit/Undo     Ctrl+Z Edit/Redo     Shift+Ctrl+Z Edit/PL/SQL Beautifier  Ctrl+W   (自定 ...

  9. sql 基础总结

  10. Mac For Mongodb安装启动、停止及启动授权

    1.到Mongodb官网下载相应的安装包 地址:https://www.mongodb.com/download-center?jmp=nav#community 2.Mac Mongodb安装过程 ...