一、标准SQL语句分类
DDL: Data Define Language 定义数据结构 CREATE/DROP/ALTER DML: Data Munipulate Language 操作数据 INSERT/DELETE/UPDATE DQL:Data Query Language 查询数据 SELECT DCL:Data Control Language 控制用户权限 GRANT(授权)/REVOKE(收权) |
二、计算机存储字符
(1)如何存储英文字符
ASCII: 总共有128个,对所有的英文字符及标点符号进行了编码。 Hello -> 72102108108111
Latin-1: 总共有256个,兼容ASCII码,同时对欧洲符号进行了编码。MySQL默认就使用这种编码。
(2)如何存储中文字符
GB2312: 对常用的6千多汉字进行了编码,兼容ASCII编码
GBK: 对2万多个汉字进行了编码,兼容GB2312
BIG5: 台湾繁体字编码,兼容ASCII
Unicode: 对世界上主流的语言常用的字符进行了编码,兼容ASCII,不兼容GBK,GB2312,BIG5等系列。具体分为UTF-8、UTF-16、UTF-32等存储方案。
(3)解决MySQL存储中文乱码
sql脚本文件存储的编码utf8
客户端连接服务器端使用的编码为utf8
服务器端创建数据库存储使用的编码为utf8
三、MySQL中的列类型
创建数据表的时候,指定的列可以存储的数据类型。
CREATE TABLE book( bid 列类型);
(1)数值类型——引号可加可不加
TINYINT 微整型,占1个字节 范围-128~127
SMALLINT 小整型,占2个字节 范围-32768~32767
INT 整型,占4个字节
范围 -2147483648~2147483647
BIGINT 大整型,占8个字节
FLOAT 单精度浮点型,占4个字节,范围3.4e38,范围比INT大的多,可能产生计算误差。
DOUBLE 双精度浮点型,占8个字节,范围比BIGINT大的多
DECIMAL(M,D) 定点小数,不会产生计算误差,M代表总的有效位数,D代表小数点后的有效位数
BOOL 布尔型,只有两个结果TRUE/1、FALSE/0,TRUE和FALSE不能添加引号;真正存储数据的时候,会使用TINYINT。
(2)日期时间类型——必须添加引号
DATE 日期型 '2018-12-31'
TIME 时间型 '14:22:30'
DATETIME 日期时间型 '2018-12-31 14:22:30'
(3)字符串类型——必须添加引号
VARCHAR(M) 变长字符串,不会产生空间浪费,操作速度相对较慢,M最大值是65535
CHAR(M) 定长字符串,可能产生空间浪费,操作速度较快,M最大值是255;用于存储手机号码,身份证号等固定长度的字符。
TEXT(M) 大型变长字符串,最多存2G
|
CHAR(5) |
VARCHAR(5) |
a |
a\0\0\0\0 |
a\0 |
ab |
ab\0\0\0 |
ab\0 |
abc |
abc\0\0 |
abc\0 |
例:CREATE TABLE t1(
id SMALLINT,
age TINYINT,
commentCount INT,
price DECIMAL(6,2),
phone CHAR(11),
article VARCHAR(8000),
pubTime DATE
);
四、列约束
MySQL可以对插入的数据进行特定的验证,只有满足条件才允许插入到数据表中,否则被认为是非法的插入。
例如:一个人的性别只能是男或者女,一个人的年龄0~100之间。
(1)主键约束——PRIMARY KEY
声明了主键列上的值不能出现重复,表中查询的记录会按照主键由小到大排序——加快查找的速度;通常主键添加到编号列中。
注意:一个表中只能有一个主键
(2)唯一约束——UNIQUE
声明了唯一约束的列上不能插入重复的值,允许插入NULL,而且允许插入多个NULL
NULL表示空,在插入数据时,无法确定要保存的数据。例如:无法确定员工的姓名、工资。 |
(3)非空约束——NOT NULL
声明了非空约束的列上不能插入NULL
(4)默认值约束——DEFAULT
可以使用DEFAULT关键字声明默认值,有两种方式可以应用默认值
INSERT INTO xz_laptop_family VALUES(40,'苹果',DEFAULT);
INSERT INTO xz_laptop_family(fid,fname) VALUES(50,'华硕');
(5)检查约束——CHECK
检查约束可以对插入的数据进行检验
CREATE TABLE student(
age TINYINT CHECK(age>=18 AND age<=60 )
);
MySQL不支持检查约束,会降低数据的插入速度。
(6)外键约束——FOREIGN KEY
声明了外键约束的列,取值必须在另一个表的主键列上出现过,列类型要保持一致,取值可以是NULL
FOREIGN KEY(familyId)
REFERENCES xz_laptop_family(fid)
四、MySQL中的自增列
AUTO_INCREMENT: 自动增长,假入一个列声明了自增列,无需手动赋值,直接设置为NULL,会获取当前的最大值,然后加1插入。
注意:
自增列允许手动赋值
只适用于整数型的主键列上
#设置客户端连接服务器编码为UTF8 SET NAMES UTF8; #丢弃数据库tedu_04如果存在的话 DROP DATABASE IF EXISTS tedu_04; #创建数据库tedu_04存储设置为UTF8 CREATE DATABASE tedu_04 CHARSET=UTF8; #进入该数据库 USE tedu_04; #创建数据表dept CREATE TABLE dept( did SMALLINT PRIMARY KEY AUTO_INCREMENT, dname VARCHAR(3) UNIQUE ); #插入数据 INSERT INTO dept VALUES (10,'研发部'), (20,'市场部'), (30,'运营部'), (40,'测试部'); #创建员工表emp CREATE TABLE emp( eid SMALLINT PRIMARY KEY AUTO_INCREMENT, ename VARCHAR(10) , sex BOOL, brithday DATE, salary DECIMAL(8,2), #999999.99 deptld SMALLINT, FOREIGN KEY(deptld) REFERENCES dept(did) ); #插入数据 INSERT INTO emp VALUES(NULL,'Tom',1,'1990-5-5',6000,20); INSERT INTO emp VALUES(NULL,'Jerry',0,'1991-8-20',7000,10); INSERT INTO emp VALUES(NULL,'David',1,'1995-10-20',3000,30); INSERT INTO emp VALUES(NULL,'Maria',0,'1992-3-20',5000,10); INSERT INTO emp VALUES(NULL,'Leo',1,'1993-12-3',8000,20); INSERT INTO emp VALUES(NULL,'Black',1,'1991-1-3',4000,10); INSERT INTO emp VALUES(NULL,'Peter',1,'1990-12-3',10000,10); INSERT INTO emp VALUES(NULL,'Franc',1,'1994-12-3',6000,30); INSERT INTO emp VALUES(NULL,'Tacy',1,'1991-12-3',9000,10); INSERT INTO emp VALUES(NULL,'Lucy',0,'1995-12-3',10000,20); INSERT INTO emp VALUES(NULL,'Jone',1,'1993-12-3',8000,30); INSERT INTO emp VALUES(NULL,'Lily',0,'1992-12-3',12000,10); INSERT INTO emp VALUES(NULL,'Lisa',0,'1989-12-3',8000,10); INSERT INTO emp VALUES(NULL,'King',1,'1988-12-3',10000,10); INSERT INTO emp VALUES(NULL,'Brown',1,'1993-12-3',22000,NULL);
五、简单查询
(1)查询特定的列
示例:查询所有员工的姓名、工资、生日
MariaDB [tedu_04]> SELECT ename,salary,birthday FROM emp; +-------+----------+------------+ | ename | salary | birthday | +-------+----------+------------+ | Tom | 6000.00 | 0000-00-00 | | Jerry | 7000.00 | 0000-00-00 | | David | 3000.00 | 0000-00-00 | | Maria | 5000.00 | 0000-00-00 | | Leo | 8000.00 | 0000-00-00 | | Black | 4000.00 | 0000-00-00 | | Peter | 10000.00 | 0000-00-00 | | Franc | 6000.00 | 0000-00-00 | | Tacy | 9000.00 | 0000-00-00 | | Lucy | 10000.00 | 0000-00-00 | | Jone | 8000.00 | 0000-00-00 | | Lily | 12000.00 | 0000-00-00 | | Lisa | 8000.00 | 0000-00-00 | | King | 10000.00 | 0000-00-00 | | Brown | 22000.00 | 0000-00-00 | +-------+----------+------------+ 15 rows in set (0.00 sec)
示例:查询所有员工的编号,姓名,性别,所属部门编号
MariaDB [tedu_04]> SELECT eid,ename,sex,deptld FROM emp; +-----+-------+------+--------+ | eid | ename | sex | deptld | +-----+-------+------+--------+ | 1 | Tom | 1 | 20 | | 2 | Jerry | 0 | 10 | | 3 | David | 1 | 30 | | 4 | Maria | 0 | 10 | | 5 | Leo | 1 | 20 | | 6 | Black | 1 | 10 | | 7 | Peter | 1 | 10 | | 8 | Franc | 1 | 30 | | 9 | Tacy | 1 | 10 | | 10 | Lucy | 0 | 20 | | 11 | Jone | 1 | 30 | | 12 | Lily | 0 | 10 | | 13 | Lisa | 0 | 10 | | 14 | King | 1 | 10 | | 15 | Brown | 1 | NULL | +-----+-------+------+--------+ 15 rows in set (0.00 sec)
(2)查询所有的列
SELECT * FROM emp;
SELECT eid,ename,sex,birthday,salary,deptId FROM emp;
MariaDB [tedu_04]> SELECT * FROM emp; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 2 | Jerry | 0 | 0000-00-00 | 7000.00 | 10 | | 3 | David | 1 | 0000-00-00 | 3000.00 | 30 | | 4 | Maria | 0 | 0000-00-00 | 5000.00 | 10 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 6 | Black | 1 | 0000-00-00 | 4000.00 | 10 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 12 | Lily | 0 | 0000-00-00 | 12000.00 | 10 | | 13 | Lisa | 0 | 0000-00-00 | 8000.00 | 10 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 15 rows in set (0.00 sec)
(3)给列起别名
示例:查询所有员工的姓名和工资,使用汉字的别名显示
MariaDB [tedu_04]> SELECT ename AS 姓名,salary AS 工资 FROM emp; +-------+----------+ | 姓名 | 工资 | +-------+----------+ | Tom | 6000.00 | | Jerry | 7000.00 | | David | 3000.00 | | Maria | 5000.00 | | Leo | 8000.00 | | Black | 4000.00 | | Peter | 10000.00 | | Franc | 6000.00 | | Tacy | 9000.00 | | Lucy | 10000.00 | | Jone | 8000.00 | | Lily | 12000.00 | | Lisa | 8000.00 | | King | 10000.00 | | Brown | 22000.00 | +-------+----------+ 15 rows in set (0.00 sec)
示例:查询所有员工的编号,姓名,性别,生日,用中文别名
MariaDB [tedu_04]> SELECT eid AS 编号,ename AS 姓名,sex AS 性别,birthday AS 生日 FROM emp; +------+-------+------+------------+ | 编号 | 姓名 | 性别 | 生日 | +------+-------+------+------------+ | 1 | Tom | 1 | 0000-00-00 | | 2 | Jerry | 0 | 0000-00-00 | | 3 | David | 1 | 0000-00-00 | | 4 | Maria | 0 | 0000-00-00 | | 5 | Leo | 1 | 0000-00-00 | | 6 | Black | 1 | 0000-00-00 | | 7 | Peter | 1 | 0000-00-00 | | 8 | Franc | 1 | 0000-00-00 | | 9 | Tacy | 1 | 0000-00-00 | | 10 | Lucy | 0 | 0000-00-00 | | 11 | Jone | 1 | 0000-00-00 | | 12 | Lily | 0 | 0000-00-00 | | 13 | Lisa | 0 | 0000-00-00 | | 14 | King | 1 | 0000-00-00 | | 15 | Brown | 1 | 0000-00-00 | +------+-------+------+------------+ 15 rows in set (0.00 sec)
示例:查询所有员工的编号,姓名,使用1个英文字母别名 (注意:AS关键字是可以省略的,但要保留空格。)
MariaDB [tedu_04]> SELECT eid a,ename b FROM emp; +----+-------+ | a | b | +----+-------+ | 1 | Tom | | 2 | Jerry | | 3 | David | | 4 | Maria | | 5 | Leo | | 6 | Black | | 7 | Peter | | 8 | Franc | | 9 | Tacy | | 10 | Lucy | | 11 | Jone | | 12 | Lily | | 13 | Lisa | | 14 | King | | 15 | Brown | +----+-------+ 15 rows in set (0.00 sec)
(4)只显示不同的记录/合并相同的记录(distinct)
示例:查询出员工都在哪些部门(显示不同的记录)
MariaDB [tedu_04]> SELECT DISTINCT deptid FROM emp; +--------+ | deptid | +--------+ | NULL | | 10 | | 20 | | 30 | +--------+ 4 rows in set (0.00 sec)
*示例:修改列名
MariaDB [tedu_04]> alter table emp change deptld deptid smallint; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
示例:查询出都有哪些性别的员工
MariaDB [tedu_04]> SELECT DISTINCT sex FROM emp; +------+ | sex | +------+ | 1 | | 0 | +------+ 2 rows in set (0.00 sec)
(5)在查询时执行计算
示例:计算2*33/47-8+10
MariaDB [tedu_04]> SELECT 2*33/47-8+10; +--------------+ | 2*33/47-8+10 | +--------------+ | 3.4043 | +--------------+ 1 row in set (0.00 sec)
示例:查询出所有员工的姓名及其年薪
MariaDB [tedu_04]> SELECT ename,salary*12 FROM emp; +-------+-----------+ | ename | salary*12 | +-------+-----------+ | Tom | 72000.00 | | Jerry | 84000.00 | | David | 36000.00 | | Maria | 60000.00 | | Leo | 96000.00 | | Black | 48000.00 | | Peter | 120000.00 | | Franc | 72000.00 | | Tacy | 108000.00 | | Lucy | 120000.00 | | Jone | 96000.00 | | Lily | 144000.00 | | Lisa | 96000.00 | | King | 120000.00 | | Brown | 264000.00 | +-------+-----------+ 15 rows in set (0.00 sec)
示例:假设每个员工工资增加500元,年终奖5000元,查询所有员工的姓名及其年薪,要给列起别名
MariaDB [tedu_04]> SELECT ename AS 姓名,(salary+500)*12+5000 AS 年薪 FROM emp; +-------+-----------+ | 姓名 | 年薪 | +-------+-----------+ | Tom | 83000.00 | | Jerry | 95000.00 | | David | 47000.00 | | Maria | 71000.00 | | Leo | 107000.00 | | Black | 59000.00 | | Peter | 131000.00 | | Franc | 83000.00 | | Tacy | 119000.00 | | Lucy | 131000.00 | | Jone | 107000.00 | | Lily | 155000.00 | | Lisa | 107000.00 | | King | 131000.00 | | Brown | 275000.00 | +-------+-----------+ 15 rows in set (0.00 sec
(6)查询结果集的排序(ORDER BY 可以按照数值、日期/时间、字符串来排序 默认按照ASC升序排序)
示例:查询所有的部门,结果按照部门编号升序排序
MariaDB [tedu_04]> SELECT * FROM dept ORDER BY did ASC; #ascendant +-----+--------+ | did | dname | +-----+--------+ | 10 | 研发部 | | 20 | 市场部 | | 30 | 运营部 | | 40 | 测试部 | +-----+--------+ 4 rows in set (0.00 sec)
示例:查询所有的部门,结果按照部门编号降序排序
MariaDB [tedu_04]> SELECT * FROM dept ORDER BY did DESC; #descendant +-----+--------+ | did | dname | +-----+--------+ | 40 | 测试部 | | 30 | 运营部 | | 20 | 市场部 | | 10 | 研发部 | +-----+--------+ 4 rows in set (0.00 sec)
示例:查询所有员工信息,结果按照工资由大到小排序
MariaDB [tedu_04]> SELECT * FROM emp ORDER BY salary DESC; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | | 12 | Lily | 0 | 0000-00-00 | 12000.00 | 10 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 13 | Lisa | 0 | 0000-00-00 | 8000.00 | 10 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 2 | Jerry | 0 | 0000-00-00 | 7000.00 | 10 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 4 | Maria | 0 | 0000-00-00 | 5000.00 | 10 | | 6 | Black | 1 | 0000-00-00 | 4000.00 | 10 | | 3 | David | 1 | 0000-00-00 | 3000.00 | 30 | +-----+-------+------+------------+----------+--------+ 15 rows in set (0.00 sec)
示例:查询所有员工,结果按照年龄由大到小排序
MariaDB [tedu_04]> SELECT * FROM emp ORDER BY birthday ASC; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 13 | Lisa | 0 | 0000-00-00 | 8000.00 | 10 | | 12 | Lily | 0 | 0000-00-00 | 12000.00 | 10 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 6 | Black | 1 | 0000-00-00 | 4000.00 | 10 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 4 | Maria | 0 | 0000-00-00 | 5000.00 | 10 | | 3 | David | 1 | 0000-00-00 | 3000.00 | 30 | | 2 | Jerry | 0 | 0000-00-00 | 7000.00 | 10 | | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 15 rows in set (0.00 sec)
示例:查询所有员工,结果按照年龄由小到大排序
MariaDB [tedu_04]> SELECT * FROM emp ORDER BY birthday DESC; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 13 | Lisa | 0 | 0000-00-00 | 8000.00 | 10 | | 12 | Lily | 0 | 0000-00-00 | 12000.00 | 10 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 6 | Black | 1 | 0000-00-00 | 4000.00 | 10 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 4 | Maria | 0 | 0000-00-00 | 5000.00 | 10 | | 3 | David | 1 | 0000-00-00 | 3000.00 | 30 | | 2 | Jerry | 0 | 0000-00-00 | 7000.00 | 10 | | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 15 rows in set (0.00 sec)
示例:查询所有员工,结果按照姓名的升序排序
MariaDB [tedu_04]> SELECT * FROM emp ORDER BY ename; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 6 | Black | 1 | 0000-00-00 | 4000.00 | 10 | | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | | 3 | David | 1 | 0000-00-00 | 3000.00 | 30 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 2 | Jerry | 0 | 0000-00-00 | 7000.00 | 10 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 12 | Lily | 0 | 0000-00-00 | 12000.00 | 10 | | 13 | Lisa | 0 | 0000-00-00 | 8000.00 | 10 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | | 4 | Maria | 0 | 0000-00-00 | 5000.00 | 10 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | +-----+-------+------+------------+----------+--------+ 15 rows in set (0.00 sec)
示例:查询所有员工,结果按照工资降序排序,如果工资相同,按照姓名排序
MariaDB [tedu_04]> SELECT * FROM emp ORDER BY salary DESC,ename; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | | 12 | Lily | 0 | 0000-00-00 | 12000.00 | 10 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 13 | Lisa | 0 | 0000-00-00 | 8000.00 | 10 | | 2 | Jerry | 0 | 0000-00-00 | 7000.00 | 10 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 4 | Maria | 0 | 0000-00-00 | 5000.00 | 10 | | 6 | Black | 1 | 0000-00-00 | 4000.00 | 10 | | 3 | David | 1 | 0000-00-00 | 3000.00 | 30 | +-----+-------+------+------------+----------+--------+ 15 rows in set (0.00 sec)
示例:查询所有员工,结果按照性别排序,如果性别相同,按照工资的升序排序
MariaDB [tedu_04]> SELECT * FROM emp ORDER BY sex,salary; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 4 | Maria | 0 | 0000-00-00 | 5000.00 | 10 | | 2 | Jerry | 0 | 0000-00-00 | 7000.00 | 10 | | 13 | Lisa | 0 | 0000-00-00 | 8000.00 | 10 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | | 12 | Lily | 0 | 0000-00-00 | 12000.00 | 10 | | 3 | David | 1 | 0000-00-00 | 3000.00 | 30 | | 6 | Black | 1 | 0000-00-00 | 4000.00 | 10 | | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 15 rows in set (0.00 sec)
(7)条件查询
示例:查询出编号为5的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE eid=5; +-----+-------+------+------------+---------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+---------+--------+ | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | +-----+-------+------+------------+---------+--------+ 1 row in set (0.00 sec)
示例:查询出姓名为king的员工的编号,工资,生日。
MariaDB [tedu_04]> SELECT eid,salary,birthday FROM emp WHERE ename='king'; +-----+----------+------------+ | eid | salary | birthday | +-----+----------+------------+ | 14 | 10000.00 | 0000-00-00 | +-----+----------+------------+ 1 row in set (0.00 sec)
示例:查询出20号部门下所有员工信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE deptId=20; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | +-----+-------+------+------------+----------+--------+ 3 rows in set (0.00 sec)
示例:查询出男员工的所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE sex=1; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 3 | David | 1 | 0000-00-00 | 3000.00 | 30 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 6 | Black | 1 | 0000-00-00 | 4000.00 | 10 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 10 rows in set (0.00 sec)
示例:查询出工资大于等于5000的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE salary>=5000; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 0000-00-00 | 6000.00 | 20 | | 2 | Jerry | 0 | 0000-00-00 | 7000.00 | 10 | | 4 | Maria | 0 | 0000-00-00 | 5000.00 | 10 | | 5 | Leo | 1 | 0000-00-00 | 8000.00 | 20 | | 7 | Peter | 1 | 0000-00-00 | 10000.00 | 10 | | 8 | Franc | 1 | 0000-00-00 | 6000.00 | 30 | | 9 | Tacy | 1 | 0000-00-00 | 9000.00 | 10 | | 10 | Lucy | 0 | 0000-00-00 | 10000.00 | 20 | | 11 | Jone | 1 | 0000-00-00 | 8000.00 | 30 | | 12 | Lily | 0 | 0000-00-00 | 12000.00 | 10 | | 13 | Lisa | 0 | 0000-00-00 | 8000.00 | 10 | | 14 | King | 1 | 0000-00-00 | 10000.00 | 10 | | 15 | Brown | 1 | 0000-00-00 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 13 rows in set (0.00 sec)
* >= <= > < = !=(不等于) |
示例:查询出1991-1-1后出生的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE birthday>'1991-1-1'; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 3 | David | 1 | 1995-10-20 | 3000.00 | 30 | | 4 | Maria | 0 | 1992-03-20 | 5000.00 | 10 | | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 6 | Black | 1 | 1991-01-03 | 4000.00 | 10 | | 8 | Franc | 1 | 1994-12-03 | 6000.00 | 30 | | 9 | Tacy | 1 | 1991-12-03 | 9000.00 | 10 | | 10 | Lucy | 0 | 1995-12-03 | 10000.00 | 20 | | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | | 12 | Lily | 0 | 1992-12-03 | 12000.00 | 10 | | 15 | Brown | 1 | 1993-12-03 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 11 rows in set (0.00 sec)
示例:查询出不在10号部门的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE deptld!=10; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 1990-05-05 | 6000.00 | 20 | | 3 | David | 1 | 1995-10-20 | 3000.00 | 30 | | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 8 | Franc | 1 | 1994-12-03 | 6000.00 | 30 | | 10 | Lucy | 0 | 1995-12-03 | 10000.00 | 20 | | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | +-----+-------+------+------------+----------+--------+ 6 rows in set (0.00 sec)
示例:查询出没有明确部门的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE deptld IS NULL; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 15 | Brown | 1 | 1993-12-03 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 1 row in set (0.00 sec)
示例:查询出有明确部门的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE deptld IS NOT NULL; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 1990-05-05 | 6000.00 | 20 | | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 3 | David | 1 | 1995-10-20 | 3000.00 | 30 | | 4 | Maria | 0 | 1992-03-20 | 5000.00 | 10 | | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 6 | Black | 1 | 1991-01-03 | 4000.00 | 10 | | 7 | Peter | 1 | 1990-12-03 | 10000.00 | 10 | | 8 | Franc | 1 | 1994-12-03 | 6000.00 | 30 | | 9 | Tacy | 1 | 1991-12-03 | 9000.00 | 10 | | 10 | Lucy | 0 | 1995-12-03 | 10000.00 | 20 | | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | | 12 | Lily | 0 | 1992-12-03 | 12000.00 | 10 | | 13 | Lisa | 0 | 1989-12-03 | 8000.00 | 10 | | 14 | King | 1 | 1988-12-03 | 10000.00 | 10 | +-----+-------+------+------------+----------+--------+ 14 rows in set (0.00 sec)
示例:查询出工资大于6000的女员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE salary>6000 AND sex=0; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 10 | Lucy | 0 | 1995-12-03 | 10000.00 | 20 | | 12 | Lily | 0 | 1992-12-03 | 12000.00 | 10 | | 13 | Lisa | 0 | 1989-12-03 | 8000.00 | 10 | +-----+-------+------+------------+----------+--------+ 4 rows in set (0.00 sec)
示例:查询出工资在5000~7000之间的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE salary>=5000 AND salary<=7000; +-----+-------+------+------------+---------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+---------+--------+ | 1 | Tom | 1 | 1990-05-05 | 6000.00 | 20 | | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 4 | Maria | 0 | 1992-03-20 | 5000.00 | 10 | | 8 | Franc | 1 | 1994-12-03 | 6000.00 | 30 | +-----+-------+------+------------+---------+--------+ 4 rows in set (0.00 sec)
或者: SELECT * FROM emp WHERE salary BETWEEN 5000 AND 700
示例:查询出工资为5000以下,7000以上的员工所有信息。
SELECT * FROM emp WHERE salary<5000 OR salary>7000;
SELECT * FROM emp WHERE salary NOT BETWEEN 5000 AND 7000;
MariaDB [tedu_04]> SELECT * FROM emp WHERE salary<5000 OR salary>7000; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 3 | David | 1 | 1995-10-20 | 3000.00 | 30 | | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 6 | Black | 1 | 1991-01-03 | 4000.00 | 10 | | 7 | Peter | 1 | 1990-12-03 | 10000.00 | 10 | | 9 | Tacy | 1 | 1991-12-03 | 9000.00 | 10 | | 10 | Lucy | 0 | 1995-12-03 | 10000.00 | 20 | | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | | 12 | Lily | 0 | 1992-12-03 | 12000.00 | 10 | | 13 | Lisa | 0 | 1989-12-03 | 8000.00 | 10 | | 14 | King | 1 | 1988-12-03 | 10000.00 | 10 | | 15 | Brown | 1 | 1993-12-03 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 11 rows in set (0.00 sec)
示例:查询出1990之前和1993以后出生的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE birthday<'1990-1-1' OR birthday>'1993-12-31'; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 3 | David | 1 | 1995-10-20 | 3000.00 | 30 | | 8 | Franc | 1 | 1994-12-03 | 6000.00 | 30 | | 10 | Lucy | 0 | 1995-12-03 | 10000.00 | 20 | | 13 | Lisa | 0 | 1989-12-03 | 8000.00 | 10 | | 14 | King | 1 | 1988-12-03 | 10000.00 | 10 | +-----+-------+------+------------+----------+--------+ 5 rows in set (0.00 sec)
示例:查询出1993年出生的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE birthday>='1993-1-1' AND birthday<='1993-12-31'; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | | 15 | Brown | 1 | 1993-12-03 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 3 rows in set (0.00 sec)
示例:查询出10号部门和30号部门员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE deptld=10 OR deptld=30; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 3 | David | 1 | 1995-10-20 | 3000.00 | 30 | | 4 | Maria | 0 | 1992-03-20 | 5000.00 | 10 | | 6 | Black | 1 | 1991-01-03 | 4000.00 | 10 | | 7 | Peter | 1 | 1990-12-03 | 10000.00 | 10 | | 8 | Franc | 1 | 1994-12-03 | 6000.00 | 30 | | 9 | Tacy | 1 | 1991-12-03 | 9000.00 | 10 | | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | | 12 | Lily | 0 | 1992-12-03 | 12000.00 | 10 | | 13 | Lisa | 0 | 1989-12-03 | 8000.00 | 10 | | 14 | King | 1 | 1988-12-03 | 10000.00 | 10 | +-----+-------+------+------------+----------+--------+ 11 rows in set (0.00 sec)
或者:SELECT * FROM emp WHERE deptId IN(10,30);
示例:查询出不在10号和30号部门员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE deptld NOT IN(10,30); +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 1990-05-05 | 6000.00 | 20 | | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 10 | Lucy | 0 | 1995-12-03 | 10000.00 | 20 | +-----+-------+------+------------+----------+--------+ 3 rows in set (0.00 sec)
IS NULL / IS NOT NULL AND / OR BETWEEN...AND.../NOT BETWEEN...AND... IN() / NOT IN() |
注意:删除、更改、查询都可以结合条件查询。
示例:查询出工资为8000以上的女员工的姓名、性别、生日,结果集按照工资降序排序,取前3个人。
MariaDB [tedu_04]> SELECT ename,sex,birthday,salary FROM emp -> WHERE salary>=8000 AND sex=0 -> ORDER BY salary DESC -> LIMIT 0,3; +-------+------+------------+----------+ | ename | sex | birthday | salary | +-------+------+------------+----------+ | Lily | 0 | 1992-12-03 | 12000.00 | | Lucy | 0 | 1995-12-03 | 10000.00 | | Lisa | 0 | 1989-12-03 | 8000.00 | +-------+------+------------+----------+ 3 rows in set (0.01 sec)
(8)模糊条件条件
示例:查询出姓名含有字母e的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE ename LIKE '%e%'; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 7 | Peter | 1 | 1990-12-03 | 10000.00 | 10 | | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | +-----+-------+------+------------+----------+--------+ 4 rows in set (0.00 sec)
示例:查询出姓名中以e结尾的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE ename LIKE '%e'; +-----+-------+------+------------+---------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+---------+--------+ | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | +-----+-------+------+------------+---------+--------+ 1 row in set (0.00 sec)
示例:查询出姓名中倒数第2个字符为e的员工所有信息
MariaDB [tedu_04]> SELECT * FROM emp WHERE ename LIKE '%e_'; +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptld | +-----+-------+------+------------+----------+--------+ | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 7 | Peter | 1 | 1990-12-03 | 10000.00 | 10 | +-----+-------+------+------------+----------+--------+ 2 rows in set (0.00 sec)
SQL中提供了两个模糊查询的字符 % 可以匹配任意多个字符 >=0 _ 可以匹配任意一个字符 =1 注意:以上两个匹配不能和=使用,必须使用LIKE关键字 |
(9)分页查询
假如查询的结果集中有太多的数据,一次显示不完,可以分页显示。
需要有两个条件:当前的页码、每页的数据量
SELECT * FROM emp LIMIT start,count;
start: 是一个数字,从结果集中的哪1条开始读取,第1条称为0.
count: 是一个数字,最多读取的行数
每页开始的算法 start=(页码-1)*count |
假设每一页显示5条记录
第1页:SELECT * FROM emp LIMIT 0,5;
第2页:SELECT * FROM emp LIMIT 5,5;
第3页:SELECT * FROM emp LIMIT 10,5;
第4页:SELECT * FROM emp LIMIT 15,5;
假设每一页显示6条记录
第1页:SELECT * FROM emp LIMIT 0,6;
第2页:SELECT * FROM emp LIMIT 6,6;
(10)复杂查询——聚合查询/分组查询
示例:查询出所有员工的数量
MariaDB [tedu_04]> SELECT COUNT(eid) FROM emp; #15 +------------+ | COUNT(eid) | +------------+ | 15 | +------------+ 1 row in set (0.01 sec)
示例:使用员工的姓名获取员工数量
MariaDB [tedu_04]> SELECT COUNT(ename) FROM emp;#14 +--------------+ | COUNT(ename) | +--------------+ | 15 | +--------------+ 1 row in set (0.00 sec)
示例:使用员工部门编号获取员工数量
MariaDB [tedu_04]> SELECT COUNT(*) FROM emp;#15 +----------+ | COUNT(*) | +----------+ | 15 | +----------+ 1 row in set (0.00 sec)
SELECT COUNT(deptId) FROM emp;#14
SELECT COUNT(*) FROM emp;#15 推荐写法
函数:功能体,接收若干个数据,返回特定的结果 —饺子机 |
聚合函数 COUNT()/SUM()/AVG()/MAX()/MIN() |
查询出所有员工工资的总和
MariaDB [tedu_04]> SELECT SUM(salary) FROM emp; +-------------+ | SUM(salary) | +-------------+ | 128000.00 | +-------------+ 1 row in set (0.00 sec)
查询出所有男员工的平均工资
MariaDB [tedu_04]> SELECT AVG(salary) FROM emp WHERE sex=1; +-------------+ | AVG(salary) | +-------------+ | 8600.000000 | +-------------+ 1 row in set (0.00 sec)
SELECT SUM(salary)/COUNT(*) FROM emp WHERE sex=1;
SELECT AVG(salary) FROM emp WHERE sex=1;
查询出工资最高的员工的工资
MariaDB [tedu_04]> SELECT MAX(salary) FROM emp; +-------------+ | MAX(salary) | +-------------+ | 22000.00 | +-------------+
查询出工资最低的员工的工资
MariaDB [tedu_04]> SELECT MIN(salary) FROM emp; +-------------+ | MIN(salary) | +-------------+ | 3000.00 | +-------------+ 1 row in set (0.00 sec)
查询年龄最大的员工的生日
MariaDB [tedu_04]> SELECT MIN(birthday) FROM emp; +---------------+ | MIN(birthday) | +---------------+ | 1988-12-03 | +---------------+ 1 row in set (0.00 sec)
*分组查询:只能查询分组条件和聚合函数
查询出每个部门员工的最高工资
MariaDB [tedu_04]> SELECT deptId,MAX(salary) FROM emp GROUP BY deptId; +--------+-------------+ | deptId | MAX(salary) | +--------+-------------+ | NULL | 22000.00 | | 10 | 12000.00 | | 20 | 10000.00 | | 30 | 8000.00 | +--------+-------------+ 4 rows in set (0.00 sec)
查询出男女员工的平均工资,最高工资,最低工资
MariaDB [tedu_04]> SELECT sex,AVG(salary),MAX(salary),MIN(salary) FROM emp GROUP BY sex; +------+-------------+-------------+-------------+ | sex | AVG(salary) | MAX(salary) | MIN(salary) | +------+-------------+-------------+-------------+ | 0 | 8400.000000 | 12000.00 | 5000.00 | | 1 | 8600.000000 | 22000.00 | 3000.00 | +------+-------------+-------------+-------------+ 2 rows in set (0.00 sec)
YEAR() 获取日期中的年份 MONTH() 获取日期中的月份 |
查询1991年出生的员工
MariaDB [tedu_04]> SELECT * FROM emp WHERE YEAR(birthday)='1991'; +-----+-------+------+------------+---------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+---------+--------+ | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 6 | Black | 1 | 1991-01-03 | 4000.00 | 10 | | 9 | Tacy | 1 | 1991-12-03 | 9000.00 | 10 | +-----+-------+------+------------+---------+--------+ 3 rows in set (0.01 sec)
查询3月份出生的员工
MariaDB [tedu_04]> SELECT * FROM emp WHERE MONTH(birthday)='3'; +-----+-------+------+------------+---------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+---------+--------+ | 4 | Maria | 0 | 1992-03-20 | 5000.00 | 10 | +-----+-------+------+------------+---------+--------+ 1 row in set (0.00 sec)
复杂查询——子查询
本质上就是一个SQL语句的查询结果作为另一个SQL语句的查询条件
示例:查询出研发部员工的所有信息
步骤1:查询研发部的部门编号
SELECT did FROM dept WHERE dname='研发部';#10
步骤2:使用部门编号查询员工——10
SELECT * FROM emp WHERE deptId=10;
综合:
SELECT * FROM emp WHERE deptId=(
SELECT did FROM dept WHERE dname='研发部'
);
MariaDB [tedu_04]> SELECT * FROM emp WHERE deptId=( -> SELECT did FROM dept WHERE dname='研发部' -> ); +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 4 | Maria | 0 | 1992-03-20 | 5000.00 | 10 | | 6 | Black | 1 | 1991-01-03 | 4000.00 | 10 | | 7 | Peter | 1 | 1990-12-03 | 10000.00 | 10 | | 9 | Tacy | 1 | 1991-12-03 | 9000.00 | 10 | | 12 | Lily | 0 | 1992-12-03 | 12000.00 | 10 | | 13 | Lisa | 0 | 1989-12-03 | 8000.00 | 10 | | 14 | King | 1 | 1988-12-03 | 10000.00 | 10 | +-----+-------+------+------------+----------+--------+ 8 rows in set (0.01 sec)
查询比tom工资高的员工所有信息
步骤1:查询tom的工资
SELECT salary FROM emp WHERE ename='tom'; #6000
步骤2:查询工资比6000高的员工
SELECT * FROM emp WHERE salary>6000;
综合:
SELECT * FROM emp WHERE salary>(
SELECT salary FROM emp WHERE ename='tom'
);
MariaDB [tedu_04]> SELECT * FROM emp WHERE salary>( -> SELECT salary FROM emp WHERE ename='tom' -> ); +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 2 | Jerry | 0 | 1991-08-20 | 7000.00 | 10 | | 5 | Leo | 1 | 1993-12-03 | 8000.00 | 20 | | 7 | Peter | 1 | 1990-12-03 | 10000.00 | 10 | | 9 | Tacy | 1 | 1991-12-03 | 9000.00 | 10 | | 10 | Lucy | 0 | 1995-12-03 | 10000.00 | 20 | | 11 | Jone | 1 | 1993-12-03 | 8000.00 | 30 | | 12 | Lily | 0 | 1992-12-03 | 12000.00 | 10 | | 13 | Lisa | 0 | 1989-12-03 | 8000.00 | 10 | | 14 | King | 1 | 1988-12-03 | 10000.00 | 10 | | 15 | Brown | 1 | 1993-12-03 | 22000.00 | NULL | +-----+-------+------+------------+----------+--------+ 10 rows in set (0.00 sec)
查询出和tom同一年出生的员工所有信息
步骤1:查询tom的生日的年份 ——1990
SELECT YEAR(birthday) FROM emp WHERE ename='tom';
步骤2:查询出1990年出生的员工
SELECT * FROM emp WHERE YEAR(birthday)=1990;
综合:
SELECT * FROM emp WHERE YEAR(birthday)=(
SELECT YEAR(birthday) FROM emp WHERE ename='tom'
);
MariaDB [tedu_04]> SELECT * FROM emp WHERE YEAR(birthday)=( -> SELECT YEAR(birthday) FROM emp WHERE ename='tom' -> ); +-----+-------+------+------------+----------+--------+ | eid | ename | sex | birthday | salary | deptid | +-----+-------+------+------------+----------+--------+ | 1 | Tom | 1 | 1990-05-05 | 6000.00 | 20 | | 7 | Peter | 1 | 1990-12-03 | 10000.00 | 10 | +-----+-------+------+------------+----------+--------+ 2 rows in set (0.00 sec)
复杂查询——多表查询
示例:查询出所有员工的姓名及其所在部门名称
SELECT ename,dname FROM emp,dept;
MariaDB [tedu_04]> SELECT ename,dname FROM emp,dept; +-------+--------+ | ename | dname | +-------+--------+ | Tom | 市场部 | | Tom | 测试部 | | Tom | 研发部 | | Tom | 运营部 | | Jerry | 市场部 | | Jerry | 测试部 | | Jerry | 研发部 | | Jerry | 运营部 | | David | 市场部 | | David | 测试部 | | David | 研发部 | | David | 运营部 | | Maria | 市场部 | | Maria | 测试部 | | Maria | 研发部 | | Maria | 运营部 | | Leo | 市场部 | | Leo | 测试部 | | Leo | 研发部 | | Leo | 运营部 | | Black | 市场部 | | Black | 测试部 | | Black | 研发部 | | Black | 运营部 | | Peter | 市场部 | | Peter | 测试部 | | Peter | 研发部 | | Peter | 运营部 | | Franc | 市场部 | | Franc | 测试部 | | Franc | 研发部 | | Franc | 运营部 | | Tacy | 市场部 | | Tacy | 测试部 | | Tacy | 研发部 | | Tacy | 运营部 | | Lucy | 市场部 | | Lucy | 测试部 | | Lucy | 研发部 | | Lucy | 运营部 | | Jone | 市场部 | | Jone | 测试部 | | Jone | 研发部 | | Jone | 运营部 | | Lily | 市场部 | | Lily | 测试部 | | Lily | 研发部 | | Lily | 运营部 | | Lisa | 市场部 | | Lisa | 测试部 | | Lisa | 研发部 | | Lisa | 运营部 | | King | 市场部 | | King | 测试部 | | King | 研发部 | | King | 运营部 | | Brown | 市场部 | | Brown | 测试部 | | Brown | 研发部 | | Brown | 运营部 | +-------+--------+ 60 rows in set (0.00 sec)
会出现笛卡尔积!(左边的一个数据会和右边的每一个数据都复合)
如何避免笛卡尔积,为多表查询添加条件。
SELECT ename,dname FROM emp,dept WHERE deptId=did;
MariaDB [tedu_04]> SELECT ename,dname FROM emp,dept WHERE deptId=did; +-------+--------+ | ename | dname | +-------+--------+ | Tom | 市场部 | | Leo | 市场部 | | Lucy | 市场部 | | Jerry | 研发部 | | Maria | 研发部 | | Black | 研发部 | | Peter | 研发部 | | Tacy | 研发部 | | Lily | 研发部 | | Lisa | 研发部 | | King | 研发部 | | David | 运营部 | | Franc | 运营部 | | Jone | 运营部 | +-------+--------+ 14 rows in set (0.01 sec)
*会出现的bug上述语法无法查询出没有部门的员工,也不能查询没有员工的部门
(1)内连接 INNER JOIN ... ON ——和之前的结果一样
MariaDB [tedu_04]> SELECT ename,dname FROM emp INNER JOIN dept ON deptId=did; +-------+--------+ | ename | dname | +-------+--------+ | Tom | 市场部 | | Leo | 市场部 | | Lucy | 市场部 | | Jerry | 研发部 | | Maria | 研发部 | | Black | 研发部 | | Peter | 研发部 | | Tacy | 研发部 | | Lily | 研发部 | | Lisa | 研发部 | | King | 研发部 | | David | 运营部 | | Franc | 运营部 | | Jone | 运营部 | +-------+--------+ 14 rows in set (0.00 sec)
(2)左外连接 LEFT OUTER JOIN...ON (查询结果是左侧表中所有的记录,即使右侧没有对应的记录。)
OUTER可以省略
MariaDB [tedu_04]> SELECT ename,dname FROM emp LEFT OUTER JOIN dept ON deptId=did; +-------+--------+ | ename | dname | +-------+--------+ | Tom | 市场部 | | Jerry | 研发部 | | David | 运营部 | | Maria | 研发部 | | Leo | 市场部 | | Black | 研发部 | | Peter | 研发部 | | Franc | 运营部 | | Tacy | 研发部 | | Lucy | 市场部 | | Jone | 运营部 | | Lily | 研发部 | | Lisa | 研发部 | | King | 研发部 | | Brown | NULL | +-------+--------+ 15 rows in set (0.00 sec)
(3)右外连接 RIGHT OUTER JOIN...ON
显示右侧表中所有的记录,OUTER可以省略
MariaDB [tedu_04]> SELECT ename,dname FROM emp RIGHT OUTER JOIN dept ON deptId=did; +-------+--------+ | ename | dname | +-------+--------+ | Tom | 市场部 | | Leo | 市场部 | | Lucy | 市场部 | | NULL | 测试部 | | Jerry | 研发部 | | Maria | 研发部 | | Black | 研发部 | | Peter | 研发部 | | Tacy | 研发部 | | Lily | 研发部 | | Lisa | 研发部 | | King | 研发部 | | David | 运营部 | | Franc | 运营部 | | Jone | 运营部 | +-------+--------+ 15 rows in set (0.00 sec)
(4)全连接 FULL JOIN
显示左侧和右侧表中所有的记录——MySQL不支持
(SELECT ename FROM emp_bj)
UNION
(SELECT ename FROM emp_sh);
MySQL中的全连接
(SELECT ename,dname FROM emp LEFT JOIN dept ON deptId=did)
UNION
(SELECT ename,dname FROM emp RIGHT JOIN dept ON deptId=did);
UNION合并相同的记录
UNION ALL 不合并相同的记录
MariaDB [tedu_04]> (SELECT ename,dname FROM emp LEFT JOIN dept ON deptId=did) -> UNION -> (SELECT ename,dname FROM emp RIGHT JOIN dept ON deptId=did); +-------+--------+ | ename | dname | +-------+--------+ | Tom | 市场部 | | Jerry | 研发部 | | David | 运营部 | | Maria | 研发部 | | Leo | 市场部 | | Black | 研发部 | | Peter | 研发部 | | Franc | 运营部 | | Tacy | 研发部 | | Lucy | 市场部 | | Jone | 运营部 | | Lily | 研发部 | | Lisa | 研发部 | | King | 研发部 | | Brown | NULL | | NULL | 测试部 | +-------+--------+ 16 rows in set (0.00 sec)
4.项目中如何保存日期、时间
2018-12-6 14:40:30
2018年12月6月 2018/12/6 12/6/2018
存储的是距离计算机元年(1970-1-1)的毫秒数
48*365*24*60*60*1000
1513728000000 使用BIGINT的列类型