SQL常用命令
SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。
SQL分类
根据SQL指令完成的数据库操作的不同,可以将SQL指令分为四类:
DDL
Data Definition Language 数据定义语⾔(对数据库对象(数据库、数据表、视图、索引等)的创建、删除、修改)DML
Data Manipulation Language 数据操作/操纵语⾔(对数据表中的数据的添加、删除、修改操作)DQL
Data Query Language 数据查询语⾔(将数据表中的数据查询出来)DCL
Data Control Language 数据控制语⾔(完成事务管理等控制性操作)
SQL语言的规则与规范
基本规则
- SQL 可以写在一行或者多行。为了提高可读性,各子句分行写,必要时使用缩进
- 每条命令以
;
或\g
或\G
结束 - 关键字不能被缩写也不能分行
- 关于标点符号
- 必须保证所有的
()
、单引号
、双引号
是成对结束的 - 必须使用英文状态下的半角输入方式
- 字符串型和日期时间类型的数据可以使用单引号
' '
表示 - 列的别名,尽量使用双引号
" "
,而且不建议省略as
- 必须保证所有的
SQL大小写规范 (建议遵守)
- MySQL 在 Windows 环境下是大小写不敏感的
- MySQL 在 Linux 环境下是大小写敏感的
- 数据库名、表名、表的别名、变量名是严格区分大小写的
- 关键字、函数名、列名(或字段名)、列的别名(字段的别名) 是忽略大小写的。
- 推荐采用统一的书写规范:
- 数据库名、表名、表别名、字段名、字段别名等都小写
- SQL 关键字、函数名、绑定变量等都大写
SQL注释写法
1 | 单行注释:#注释文字(MySQL特有的方式) |
更多参考:阿里巴巴Java开发手册——MySQ部分
相关概念
MySQL管理工具
命令行
登录
1 | mysql -hlocalhost -P3306 -uroot -p |
成功登录后修改密码
1 | ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'; |
图形化工具
- MySQL Workbench MySQL官方提供的工具
- SQLyog 经典工具
- Navicat 界面好看,对于新手来说易学易用
- dbeaver 比大多数的SQL管理工具要轻量
DDL 数据定义语⾔
使⽤DDL语句可以创建数据库、查询数据库、修改数据库、删除数据库
DDL-数据库操作
查询数据库
1 | -- 显示当前mysql中的数据库列表(有一个S,代表多个数据库) |
创建数据库
1 | -- 创建数据库 dbName表示创建的数据库名称,可以⾃定义 |
修改数据库编码格式为utf8
1 | ALTER DATABASE <dbName> CHARACTER SET utf8; |
删除数据库
注意:删除数据库时会删除当前数据库中所有的数据表以及数据表中的数据
1 | -- 删除指定的数据库 |
使⽤/切换数据库
1 | USE <dbName> |
DDL-数据表操作
创建数据表
数据表实际就是⼀个⼆维的表格,⼀个表格是由多列组成,表格中的每⼀类称之为表格
的⼀个字段
1 | CREATE TABLE [if not exists] <tableName>( |
示例
1 | CREATE TABLE students( |
查询数据表
1 | --查询有哪些表 |
查询表结构
1 | DESC <tableName>; |
删除数据表
1 | --删除数据表 |
修改数据表
1 | --修改表名 |
DML 数据操纵语⾔
⽤于完成对数据表中数据的插⼊、删除、修改操作
添加数据
语法
1 | INSERT INTO <tableName>(<columnName>,<columnName>....) |
- 字段或值之间用英文逗号隔开
- ‘ 字段1,字段2…’ 该部分可省略,但添加的值务必与表结构,数据列,顺序相对应,且数量一致
- 可同时插入多条数据,
VALUES
后用英文逗号隔开
示例
1 | INSERT INTO students(学号,姓名,年龄,性别,专业) VALUES |
WHERE⼦句
在删除、修改及查询的语句后都可以添加where⼦句(条件),⽤于筛选满⾜特定的添
加的数据进⾏删除、修改和查询操作。
条件关系运算符
1 | --等于( = ) |
删除数据
从数据表中删除满⾜特定条件(所有)的记录
delete
语法
1 | DELETE FROM <tableName> [WHERE <conditions>]; |
注意:
示例
1 | -- 删除学号为20210102的学⽣信息 |
turncate
TRUNCATE命令用于完全清空表数据 , 但表结构 , 索引 , 约束等不变
1 | TRUNCATE <tableName>; |
delete和turncate命令区别
- 相同 : 都能删除数据 , 不删除表结构 , 但TRUNCATE速度更快
- 不同
- 使用TRUNCATE TABLE 重新设置AUTO_INCREMENT计数器
- 使用TRUNCATE TABLE不会对事务有影响 (事务后面会说)
修改数据
对数据表中已经添加的记录进⾏修改
语法
1 | --如果update语句没有where⼦句,则表示修改当前表中所有⾏(记录) |
示例
1 | --将学号为20210105的学⽣姓名修改为“孙七”(只修改⼀列) |
DQL 数据查询语⾔
DQL( Data Query Language 数据查询语言 )
- 查询数据库数据 , 如SELECT语句
- 简单的单表查询或多表的复杂查询和嵌套查询
- 是数据库语言中最核心,最重要的语句
- 使用频率最高的语句
查询基础语法
1 | SELECT colnumName1[,colnumName2,colnumName3...] FROM <tableName> [WHERE conditions]; |
条件查询(WHERE)
在删除、修改及查询的语句后都可以添加where⼦句(条件),⽤于筛选满⾜特定的添加的数据进⾏删除、修改和查询操作。
1 | DELETE FROM tableName WHERE conditions; |
关系运算符
1 | --等于( = ) |
逻辑操作符
1 | -- and 并且 筛选多个条件同时满足 |
LIKE模糊查询
在where⼦句的条件中,我们可以使⽤like关键字来实现模糊查询
语法
1 | SELECT * FROM <tableName> WHERE <columnName> like 'reg'; |
- 在like关键字后的reg表达式中
-%
表示任意多个字符 【%o%
包含字⺟o】
-_
表示任意⼀个字符 【_o%
第⼆个字⺟为o】
示例
1 | -- 查询学⽣姓名包含字⺟o的学⽣信息 |
IN范围查询
1 | -- 使用IN范围查询学号为161228001,161228002,161228003的学生信息 |
NULL空值查询
1 | -- IS NULL 空值查询,查询出生日期没有填写的同学 |
分组查询(GROUP BY)
分组——就是将数据表中的记录按照指定的类进⾏分组
语法
1 | SELECT 分组字段/聚合函数 |
分⻚查询(LIMIT)
当数据表中的记录⽐较多的时候,如果⼀次性全部查询出来显示给⽤户,⽤户的可读性/体验性就不太好,因此我们可以将这些数据分⻚进⾏展示
语法
1 | SELECT ... |
- param1 int , 表示获取查询语句的结果中的第⼀条数据的索引(索引从0开始)
- param2 int, 表示获取的查询记录的条数(如果剩下的数据条数<param2,则返回剩下的所有记录)
案例
对数据表中的学⽣信息进⾏分⻚显示,总共有10条数据,我们每⻚显示3条
总记录数 count 10
每⻚显示 pageSize 3
总⻚数: pageCount = count%pageSize==0 ? count/pageSize : count/pageSize +1;
1 | # 查询SELECT * FROM students [WHERE ...] LIMIT 0,3; (1-1)*3 |
聚合函数
SQL中提供了⼀些可以对查询的记录的列进⾏计算的函数——聚合函数
count()
统计函数,统计满⾜条件的指定字段值的个数(记录数)max()
计算最⼤值,查询满⾜条件的记录中指定列的最⼤值min()
计算最⼩值,查询满⾜条件的记录中指定列的最⼩值sum()
计算和,查询满⾜条件的记录中 指定的列的值的总和avg()
求平均值,查询满⾜条件的记录中 计算指定列的平均值
示例
1 | -- 统计学⽣表中学⽣总数 |
⽇期函数 和 字符串函数
⽇期函数
当我们向⽇期类型的列添加数据时,可以通过字符串类型赋值(字符串的格式必须为
yyyy-MM-dd hh:mm:ss)
如果我们想要获取当前系统时间添加到⽇期类型的列,可以使⽤now()
或者sysdate()
字符串函数
就是通过SQL指令对字符串进⾏处理
示例
1 | # concat(colnum1,colunm2,...) SELECT concat(姓名,'-',性别) FROM students; |
对查询结果的处理
设置查询的列
声明显示查询结果的指定列
1 | SELECT colnumName1,columnName2,... FROM students WHERE 年龄>20; |
字段取别名(AS)
我们可以为查询结果的列名 去⼀个语义性更强的别名 (如下案例中 as 关键字也可以省略
1 | SELECT 姓名,2021-年龄 as stu_birth_year FROM students; |
计算列
对从数据表中查询的记录的列进⾏⼀定的运算之后显示出来
1 | # 出⽣年份 = 当前年份 SELECT 姓名,2021-年龄 FROM students; |
distinct 消除重复⾏
从查询的结果中将重复的记录消除 distinct
1 | SELECT 年龄 FROM students; |
其它
数据导入指令
1 | source d:\mysqldb.sql |