MySQL学习笔记
一、数据类型
像C++、java等编程语言一样,MySQL中也有自己独有的数据类型,代表不同的信息类型。常用的数据类型有整数数据类型、浮点数数据类型、精确小数类型、二进制数 据类型、日期/时间数据类型、字符串数据类型。表中的每一个字段就是某种指定数据类型。
1.基础数据类型
2.日期和时间类型
表示时间值的日期和时间类型有:
3.字符串类型
4.主键
主键(Primary Key)又称主码,用于唯一地标识表中的每一条记录。可以定义表中的一列或多列为主键,主键列上既不能有两行相同的值,也不能为空值,即如果是主键,则无需声明,一定满足not null 和 unique。
二、数据库系统
数据库系统的组成
数据库系统有3个主要的组成部分
● 数据库:用于存储数据的地方。
● 数据库管理系统:用于管理数据库的软件。
● 数据库应用程序:为了提高数据库系统的处理能力所使用的管理数据库的软件补充。
三、SQL语言
SQL语言的组成
SQL语言包含以下4部分。
(1)数据定义语言(Data Definition Language DDL):DROP、CREATE、ALTER等语句。
(2)数据操作语言(Data Manipulation Language DML):INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。
(3)数据查询语言(Data Query Language DQL):SELECT语句。
(4)数据控制语言(Data Control Language DCL):GRANT、REVOKE、COMMIT、 ROLLBACK等语句。
四、数据库操作
显示所有存在的库:
show databases
创建库
我们在创建库时,使用create database 语句加上要创建的库的库名(bb1027)即可创建,创建成功后,如图会出现一个新的库(bb1027)。
create database name
cha
查看数据库的定义
当我们想要查看一个库的定义信息时,使用
show create database name
删除数据库
当我我们要删除一个数据库时,只需用drop 语句,前提是要删除的库必须存在。
drop database name
五、InnoDB表
从MySQL 8.0开始,系统表全部换成事务型的InnoDB表,默认的 MySQL实例将不包含任何MyISAM表,除非手动创建MyISAM表。
InnoDB和MyISAM的区别
- InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB
的重要原因之一; - InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
- InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因
此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,
然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而
MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引
是独立的。 - InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一
个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快; - InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致
其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成
InnoDB 的重要原因之一;
六、创建数据表
创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整 性和域完整性等)约束的过程。
数据表属于数据库,在创建数据表之前,应该使用语句“USE <数据库 名>”指定操作是在哪个数据库中进
行,如果没有选择数据库,就会抛出“No database selected”的错误。
创建数据表
创建数据表的语句为:
CREATE TABLE
语法规则如下:
CREATE TABLE TAB_NAME(
字段1 类型 约束 默认值,
字段2 类型 约束 默认值,
字段n 类型 约束 默认值
)
比如在bb1023下创建一个person表:
结果如下:
创建完以后可以通过show tables语句查看库下的表:
七、表约束
数据完整性
数据的完整性是指数据的可靠性和准确性
1.实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过索引,唯一约束,主键约束或标识列属性).
2.域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则).
3.引用完整性:在删除和输入记录时,引用完整性保持表之间已定义的关系.引用完整性确保键值在所有表中一致.这样的一致辞性要求不能引用不存在的值.如果一个键值更改了,那么在整个数据库中,对该键值的引用要进行一致的更改.
4.自定义完整性:用户自己定义的业务规则.
四种完整性约束:
实体完整性:唯一约束、主键约束、标识列
域完完整性:限制数据类型、外键约束、默认值、非空约束
引用完整性:外键
自定义完整性:过程,触发器等
约束
约束是在表上强制执行的一些数据校验规则,被插入、修改或删除的数据必须符合在相关字段上设置的这些约束条件。
五类完整性约束:
NOT NULL 非空
UNIQUE 唯一
PRIMARY KEY 主键
FOREIGN KEY 外键
CHECKED 检查(mysql不支持)
主键约束
主键,又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一地标 识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以 加快数据库查询的速度。主键和记录之间的关系如同身份证和人之间的关 系,它们之间是一一对应的。主键分为两种类型:单字段主键和多字段联合主键。
单子键约束
单子键约束就是其表的主键由一个字段组成。
定义主键的语句为:
字段名 字段类型 primary key
比如下面这个cities表:
cid为表的主键,auto_increment 语句含义为‘自增’。
自增:在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段的 主键值。可以通过为表主键添加AUTO_INCREMENT关键字来实现。默认 的,在MySQL中AUTO_INCREMENT的初始值是1,每新增一条记录,字段 值自动加1。一个表只能有一个字段使用AUTO_INCREMENT约束,且该字 段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数 类型(TINYINT、SMALLIN、INT、BIGINT等)。
除了在定义表时加上主键约束,还可以在定义完表后指定表的主键,语句如下:
alter table 表名 add constraint 主键名 primary key 字段名;
ALTER TABLE employee ADD CONSTRAINT pk_empid PRIMARY KEY(emp_id);
主键选取原则
- 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。
- 主键应该是单列的,以便提高连接和筛选操作的效率。
- 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。
- 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
- 主键应当由计算机自动生成
唯一约束
唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确
保一列或者几列不出现重复值。
字段名 数据类型 UNIQUE
非空约束
非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空 约束的字段,如果用户在添加
数据时没有指定值,数据库系统会报错。
字段名 数据类型 not null
默认值约束
默认约束(Default Constraint)指定某列的默认值。如男性同学较多, 性别就可以默认为‘男’。如果插
入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值为‘男’。
字段名 字段类型 default 默认值
比如下图的person表:
定义约束
约束可以在定义表的时候直接定义,如果定义完表后也可以给某个字段添加指定约束:
ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型 (约束字段);
ALTER TABLE employee ADD CONSTRAINT uk_phone UNIQUE (emp_phone);
删除唯一索引:
ALTER TABLE 表名 DROP INDEX 约束名;
ALTER TABLE employee DROP INDEX uk_phone;
查看表结构
定义完表后,可以通过DESCRIBE/DESC语句可以查看表的字段信息,其中包括字段名、字段 数据类型、是否为主键、是否有默认值等。语法规则如下:
DESCRIBE 表名;
//或者可以简写为DESC 表名;
查看表详细结构语句:
SHOW CREATE TABLE语句可以用来显示创建表时的CREATE TABLE 语句,语法格式如下:
SHOW CREATE TABLE person;
执行完语句后,将下方表格中的内容复制粘贴后可以便于看到创建表时候的语句。
修改表结构
修改表指的是修改数据库中已经存在的数据表的结构。MySQL使用 ALTER TABLE语句修改表。常用的修改表的操作有修改表名、修改字段数 据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。
- 修改表名
ALTER TABLE <旧表名> RENAME [TO] <新表名>;
ALTER TABLE employee RENAME TO emp;
- 修改字段的数据类型
ALTER TABLE <表名> MODIFY <字段名> <数据类型> ;
ALTER TABLE emp MODIFY emp_name VARCHAR(30);
- 修改字段名
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>;
ALTER TABLE emp CHANGE dept_id deptid INT;
- 添加字段
ALTER TABLE <表名> ADD <新字段名> <新字段类型> <约束条件>[FIRST|AFTER 已存在字段名];
ALTER TABLE emp ADD empaddr VARCHAR(20);
ALTER TABLE emp ADD empaddr VARCHAR(20) AFTER empsex;
ALTER TABLE emp ADD empnum VARCHAR(20) FIRST;
- 删除字段
LTER TABLE <表名> DROP <字段名> ;
ALTER TABLE emp DROP empno;
- 修改字段的排序位置
ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>;
ALTER TABLE emp MODIFY deptid INT AFTER empphone;
- 删除表的外键约束
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept;
- 更改表的存储引擎
ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
ALTER TABLE tb_deptment3 ENGINE=MyISAM;
- 删除数据表
DROP TABLE 表1, 表2,…表n;
八、数据的CURD操作
1.插入数据
INSERT INTO 表名 VALUES(值列表);
或
INSERT INTO 表名(表列表) VALUES(值列表);
以列表方式插入时要注意顺序必须是一一对应,数据类型也要对应。
当插入多条语句时在values后面加上多行值列表即可:
INSERT INTO 表名(col_list) VALUES(val_list1),(val_list2),(val_list3),
(val_list4);
2.备份数据表
当有数据表需要从这个表备份到另一个表时,可以用将数据插入到新表的思路进行备份
INSERT INTO emp_bak SELECT * FROM emp; # 表存在
CREATE TABLE emp_bak AS SELECT * FROM emp; # 表不存在
3.更新数据
UPDATE 表名 SET 更新的数据 WHERE 选择条件;
4.删除数据
DELETE FROM table_name WHERE 选择条件;
如果删除语句没where,此时会将数据表中的记录全部删除,类似TRUNCATE TABLE.
TRUNCATE将直接删除原来的表,并重新创建一个表,其语法结构为 TRUNCATE TABLE table_name。
TRUNCATE直接删除表而不是删除记录,因此执行速度比DELETE快。而且不能用在有主外键关系的主表中。
5.查询数据
MySQL从数据表中查询数据的基本语句为SELECT语句。SELECT语句的基本格式是:
SELECT 要选择的字段列表 FROM 表1,表2... WHERE 条件表达式 GROUP BY 字段 HAVING 条件
ORDER BY 字段 LIMIT [<offset>,] <row count>]
在使用查询语句时,可以通过结合where条件语句,添加选择条件,where语句后还可以使用IN关键字用来查询满足指定范围内的条件的记录,BETWEEN AND用来查询某个范围内的值,带LIKE的字符匹配查询,带AND的多条件查询,带OR的多条件查询,还可以使用IS NULL 或IS NOT NULL 选择时空或非空的记录,
6.对查询结果的处理
在SELECT语句中,可以使用DISTINCT关键字指示MySQL消除重复的记录值。
SELECT DISTINCT empid,empname,empsex FROM emp;
7.聚合函数
MySQL提供一些查询功能,可以对获取的数据进行分析和报告,常用的聚合函数 MAX()、MIN()、COUNT()、SUM()、AVG()。
8.分组查询
GROUP BY <字段>,该子句告诉MySQL如何显示查询出来的数据,并按照指定的字段分组。
[ORDER BY <字段>],该子句告诉MySQL按什么样的顺序显示查询出来的数据,可以进行的排序有升序(ASC)、降序(DESC)。
SELECT * FROM emp ORDER BY empid DESC ,deptid DESC;
9.使用HAVING过滤分组
GROUP BY可以和HAVING一起限定显示记录所需满足的条件,只有满足条件的分组才会被显示,相当于SELECT语句中的WHERE子句。
对于统计的每个部门的男女人数只要大于等于3的信息
SELECT deptid,empsex,COUNT(1) FROM emp GROUP BY deptid,empsex HAVING
COUNT(1)>=3 ORDER BY COUNT(1) DESC,deptid DESC;
10.LIMIT
SELECT返回所有匹配的行,有可能是表中所有的行,若仅仅需要返回 第一行或者前几行,可使用LIMIT关键字。
[LIMIT [,] ],该子句告诉MySQL每次显示查询 出来的数据条数。
链接查询和子查询
链接查询
连接就是在对数据进行查询时,可以将多个表中的数据进行关联,这样就可以查询到来自不同表的数据。
内连接查询
内连接简单来说就是将两张表中可以匹配到的数据抽取出来,形成新的表记录,而不能匹配的就不保留。
SELECT * FROM dept d INNER JOIN emp e ON d.`deptid`=e.`deptid`;
外连接查询
外连接也是将两张表中可以匹配到的数据抽取出来,其中有一个表是主表,无论能否匹配,主表中的数据都会全部保留,另一个表不匹配的记录也保留,只是值为NULL。
左外连接
以左边的表为主表
SELECT * FROM dept LEFT JOIN emp ON dept.`deptid`=emp.`deptid`
右外连接
以右边表为主表
SELECT dept.*,emp.* FROM emp RIGHT JOIN dept ON dept.`deptid`=emp.`deptid`
子查询
1.子查询
子查询就是嵌套在另一个查询中的查询。也可以叫嵌套查询
一般在子查询中,程序先运行嵌套在最内层的语句,逐层向外。
-- 查询员工信息,并展示员工所在的部门名字
SELECT emp.*, (SELECT deptname FROM dept WHERE
dept.`deptid`=emp.`deptid`)deptname
FROM emp WHERE emp.`deptid` IN (SELECT deptid FROM dept)
2.any 和 some
ANY和SOME关键字是同义词,表示满足其中任一条件,它们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。
SELECT num1 FROM tb1 WHERE num1> ANY(SELECT num2 FROM tb2);
-- 或
SELECT num1 FROM tb1 WHERE num1> SOME(SELECT num2 FROM tb2);
3.ALL
不同于any 和 some ,all必须是所有条件都满足才返回TRUE
-- 找到工资比人事部工资高的信息
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE emp.deptid=
(SELECT deptid FROM dept WHERE deptname='人事部')) ;
4.EXISTS
EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果为true,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果是false,此时外层语句将不进行查询。
NOT EXISTS 与 EXISTS相反
5.UNION
UNION:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
UNION All:对两个结果集进行并集操作,包括重复行,不进行排序;
如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
SELECT * FROM tb1
UNION -- 或 UNION ALL
SELECT * FROM tb2
6.正则查询
正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。
九、系统函数
数学函数
1.绝对值函数ABS(x)和返回圆周率的函数PI()
2.平方根函数SQRT(x)和求余函数MOD(x,y)
3.获取整数的函数CEIL(x)、CEILING(x)和FLOOR(x)
CEIL(x)和CEILING(x)的意义相同,返回不小于x的最小整数值(向上取值),返回 值转化为一个BIGINT。
FLOOR(x)返回不大于x的最大整数值(向下取整),返回值转化为一个BIGINT。
4.获取随机数的函数RAND()和RAND(x)
RAND(x)返回一个随机浮点值v,范围在0到1之间(0 ≤ v ≤ 1.0)。若已指定一个整数参数x,则它
被用作种子值,用来产生重复列。
5.函数ROUND(x)、ROUND(x,y)和TRUNCATE(x,y)
ROUND(x)返回最接近于参数x的整数,对x值进行四舍五入。
ROUND(x,y)返回最接近于参数x的数,其值保留到小数点后面y位,若y为负值,则将保留x值到小
数点左边y位。
TRUNCATE(x,y)返回被舍去至小数点后y位的数字x。若y的值为0,则结果不带有小数点或不带有小
数部分。若y设为负数,则截(归零)x小数点左起第y位开始后面所有低位的值。
6 符号函数SIGN(x)
SIGN(x)返回参数的符号,x的值为负、零或正时返回结果依次为-1、0或1。
7 幂运算函数POW(x,y)、POWER(x,y)和EXP(x)
POW(x,y)或者POWER(x,y)函数返回x的y次乘方的结果值。 EXP(x)返回e的x乘方后的值。
字符串函数
1 计算字符串字符数的函数和字符串长度的函数
CHAR_LENGTH(str)返回值为字符串str所包含的字符个数。一个多字节字符算作一个单字符。
2 合并字符串函数CONCAT(s1,s2,…)、 CONCAT_WS(x,s1,s2,…)
3 替换字符串的函数INSERT(s1,x,len,s2)
4 字母大小写转换函数 LOWER (str)或者LCASE (str)可以将字符串str中的字母字符全部转换成 小写
字母。 UPPER(str)或者UCASE(str可以将字符串str中的字母字符全部转换成大写字母。
5 获取指定长度的字符串的函数LEFT(s,n)和RIGHT(s,n)
6 填充字符串的函数LPAD(s1,len,s2)和RP
7 删除空格的函数LTRIM(s)、RTRIM(s)和TRIM(s)
8 重复生成字符串的函数REPEAT(s,n)
9 空格函数SPACE(n)和替换函数REPLACE(s,s1,s2)SPACE(n)返回一个由n个空格组成的字符串。
10 比较字符串大小的函数STRCMP(s1,s2)
11 获取子串的函数SUBSTRING(s,n,len)和MID(s,n,len)
12 匹配子串开始位置的函数
LOCATE(str1,str)、POSITION(str1 IN str)和INSTR(str, str1)3个函数的作
13. 字符串逆序的函数REVERSE(s)
REVERSE(s)将字符串s反转,返回的字符串的顺序和s字符串顺序相 反。
14. 返回指定字符串位置的函数FIELD(s,s1,s2,…,sn)
FIELD(s,s1,s2,…,sn)返回字符串s在列表s1,s2,…,sn中第一次出现的位置,在找不到s的情况下,返回
值为0。如果s为NULL,则返回值为0,原因 是NULL不能同任何值进行同等比较。
15. 返回子串位置的函数FIND_IN_SET(s1,s2)
FIND_IN_SET(s1,s2)返回字符串s1在字符串列表s2中出现的位置,字符串列表是一个由多个逗
号‘,’分开的字符串组成的列表。如果s1不在s2或s2为空字符串,则返回值为0。如果任意一个参数为
NULL,则返回值为NULL。 这个函数在第一个参数包含一个逗号‘,’时将无法正常运行。
日期和时间函数
1 系统当前时间
SELECT NOW();
SELECT SYSDATE();
SELECT CURDATE(); -- 年月日
SELECT CURRENT_DATE(); -- 年月日
SELECT CURRENT_TIME; -- 时分秒
SELECT CURTIME(); -- 时分秒
2 addXXX()加上
- adddate()加上天数
SELECT ADDDATE(NOW(),40);
SELECT ADDDATE('2020-10-19 12:32:45',INTERVAL 5 MINUTE); -- 5 分钟
SELECT ADDDATE('2020-10-19 12:32:45',5); -- 5 天
SELECT ADDDATE('2020-10-19 12:32:45',INTERVAL 5 YEAR); -- 5 年
SELECT ADDDATE('2020-10-19 12:32:45',INTERVAL 5 MONTH); -- 5 个月
-- 加上秒,最大到59
SELECT ADDTIME(NOW(),59),NOW();
3 DATEDIFF() 两个时间相差天数
SELECT DATEDIFF(NOW(),'2020-5-8');
4 DATE_FORMAT 日期格式化
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点%i分%s秒')
5 DATE_SUB(date,INTERVAL expr type) 减去多少天
SELECT DATE_SUB(NOW(),INTERVAL 45 DAY);
SELECT DATE_SUB(NOW(),INTERVAL 3 YEAR);
SELECT DATE_SUB(NOW(),INTERVAL 3 MONTH);
6 EXTRACT
EXTRACT(type FROM date)函数所使用的时间间隔类型说明符与DATE_ADD()或DATE_SUB()的相同,但它从日期中提取一部分,而不是执行日期运算
SELECT EXTRACT(DAY FROM NOW()) ;
SELECT EXTRACT(YEAR FROM NOW()) ;
SELECT EXTRACT(MONTH FROM NOW()) ;
7 MONTH(),MONTHNAME() 获取月份函数
SELECT MONTH(NOW()); -- 获取月份数字
SELECT MONTHNAME(NOW()); -- 获取月份 英文
8 DAYNAME(d)、DAYOFWEEK(d)和WEEKDAY(d)
DAYNAME(d)函数返回d对应的工作日的英文名称,例如Sunday、 Monday等
DAYOFWEEK(d)函数返回d对应的一周中的索引(位置,1表示周日,2表示周一,…,7表示周六)。
WEEKDAY(d)返回d对应的工作日索引:0表示周一,1表示周二,…,6表示周日。
- WEEK(d)和WEEKOFYEAR(d)
WEEK(d)计算日期d是一年中的第几周WEEK()的双参数形式允许指定该星期是否起始于周日或周一,以及返回值的范围是否为0~ 53或1~53。 若Mode参数被省略,则使用default_week_format系统自变量的值.
WEEKOFYEAR(d)计算某天位于一年中的第几周,范围是1~53,相当于WEEK(d,3)。
条件判断函数
1 IF(expr,v1,v2)函数
如果表达式expr是TRUE(expr <> 0 and expr <> NULL),则返回值为v1;否则返回值为v2.IF()的返回值为数字值或字符串值,具体情况视其所在语境而定。
SELECT salary, IF(salary>20000,'高工资','低工资') FROM employees;
2 IFNULL(v1,v2)函数
假如v1不为NULL,则IFNULL()的返回值为v1;否则其返回值为v2。
SELECT manager_id,IFNULL(manager_id,'无上级领导') FROM employees;
3 CASE函数
CASE expr WHEN v1 THEN r1 [WHEN v2 THEN r2]…[ELSE rn+1] END:如果expr值等于某个vn,则返回对应位置THEN后面的结果;如果与所有值都不相等,则返回ELSE后面的rn+1。
SELECT salary,
CASE salary WHEN 24000 THEN '高工资'
WHEN 17000 THEN '基本工资'
END
FROM employees;
SELECT job_id,
CASE job_id WHEN 'AD_PRES' THEN 'CEO'
WHEN 'AD_VP' THEN '经理'
WHEN 'IT_PROG' THEN 'IT'
ELSE '基本工种'
END jobtype
FROM employees;
4 系统信息函数
SELECT VERSION(); -- 版本
SELECT CONNECTION_ID(); -- 查看当前用户的链接数
-- 查看链接的详细信息
SHOW PROCESSLIST; -- 前100条
SHOW FULL PROCESSLIST; -- 所有信息
5 获取用户名函数
ELECT USER(),CURRENT_USER(),SYSTEM_USER(),SESSION_USER();
6 获取最后一个自动生成的ID的值函数
LAST_INSERT_ID()函数返回最后生成的AUTO_INCREMENT值