@artman328
2021-12-29T00:51:36.000000Z
字数 11241
阅读 930
SQL
数据库
SQL 语言由语句构成。每个 SQL 语句默认以分号(注意:是英文分号)结束。
语法:
mysql -h 服务器域名或IP地址 -P 数据库服务器端口号 -u 用户名 -p
-h 忽略默认为本机地址 127.0.0.1
-P 忽略默认为 3306
例如:
mysql -h db.gotoweb.top -u user -p
回车后会提示输入密码。输入密码后,回车,看到:
mysql>
这个提示符后,就说明已经成功登录了数据库服务器。
语法:
show databases;
show: 显示,展示
例子:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| company |
| information_schema |
+--------------------+
2 rows in set (0.19 sec)
可见当前服务器中当前用户可用的有两个数据库。其中 information_schema 是系统数据库,可暂时不理。
语法:
use 数据库名;
use: 使用
例如:
mysql> use company;
Database changed (提示:数据库已经切换,说明进入成功)
mysql>
语法:
show tables;
例如:
mysql> show tables;
+-------------------+
| Tables_in_company |
+-------------------+
| emps |
+-------------------+
1 row in set (0.18 sec)
可见数据库 company 中目前只有一张表:emps
语法:
SELECT 字段名1,字段名2, ... 字段名n FROM 表名;
select: 挑选
from: 从
或者(用 * 号表示全部字段):
SELECT * FROM 表名;
例如:
mysql> select * from emps;
+----+--------+--------+--------+------------+----------+------------+------------+----------+
| id | emp_no | name | gender | birth_date | hometown | department | emp_date | salary |
+----+--------+--------+--------+------------+----------+------------+------------+----------+
| 1 | E00001 | 李桂香 | 女 | 1988-07-03 | 广东 | 销售部 | 2018-09-29 | 10390.00 |
| 2 | E00002 | 潘梅 | 女 | 1998-01-31 | 云南 | 设计部 | 2021-05-10 | 7590.00 |
| 3 | E00003 | 王秀英 | 女 | 1986-12-30 | 云南 | 销售部 | 2017-07-09 | 10320.00 |
| 4 | E00004 | 马利 | 男 | 1970-08-10 | 云南 | 销售部 | 2020-02-23 | 8860.00 |
| 5 | E00005 | 张丽华 | 女 | 1971-05-31 | 北京 | 设计部 | 2012-04-01 | 12890.00 |
| 6 | E00006 | 赵倩 | 女 | 1967-03-21 | 北京 | 人事部 | 2018-11-23 | 5160.00 |
| 7 | E00007 | 郑英 | 女 | 1996-08-22 | 云南 | 销售部 | 2020-06-17 | 6720.00 |
| 8 | E00008 | 谭欢 | 男 | 1969-04-14 | 云南 | 销售部 | 2011-09-12 | 6060.00 |
| 9 | E00009 | 金兰英 | 女 | 1970-07-29 | 北京 | 售后部 | 2017-02-27 | 12470.00 |
......
语法:
SELECT 字段名1,字段名2, ... 字段名n FROM 表名 LIMIT [跳过的行数,] 所要的行数;
limit: 限制
或者(用 * 号表示全部字段):
SELECT * FROM 表名 LIMIT [跳过的行数,] 行数;
[]括号里的是可以省略的内容。
例如:
查看从头开始的5条数据
mysql> select id, name, gender, birth_date
-> from emps
-> limit 5;
+----+-----------+--------+------------+
| id | name | gender | birth_date |
+----+-----------+--------+------------+
| 1 | 李桂香 | 女 | 1988-07-03 |
| 2 | 潘梅 | 女 | 1998-01-31 |
| 3 | 王秀英 | 女 | 1986-12-30 |
| 4 | 马利 | 男 | 1970-08-10 |
| 5 | 张丽华 | 女 | 1971-05-31 |
+----+-----------+--------+------------+
5 rows in set (0.332 sec)
查看略过开头开始的200条数据后的5条数据
mysql> select id, name, gender, birth_date from emps limit 200,5;
+-----+-----------+--------+------------+
| id | name | gender | birth_date |
+-----+-----------+--------+------------+
| 201 | 邹凤兰 | 女 | 1976-09-05 |
| 202 | 朱明 | 男 | 1973-01-28 |
| 203 | 李宁 | 男 | 1979-09-02 |
| 204 | 胡明 | 男 | 1992-08-07 |
| 205 | 邱金凤 | 女 | 1967-03-28 |
+-----+-----------+--------+------------+
5 rows in set (0.177 sec)
语法:
SELECT DISTINCT 字段列表 FROM 表名;
distinct: 不同的
选择字段列表组合不重复的记录。
例如:
查看员工表中员工所属的部门有哪些?
mysql> select distinct department from emps;
+------------+
| department |
+------------+
| 销售部 |
| 设计部 |
| 人事部 |
| 售后部 |
| 公关部 |
+------------+
5 rows in set (0.183 sec)
语法:
SELECT 字段列表/* FROM 表名 ORDER BY 字段1 [顺序][,字段2 [顺序,]...]
order by ... : 依据 ... 排序
asc: ascending, 上升的
desc: descending, 下降的
顺序:升序为 ASC, 降序为 DESC,不写默认为升序。
中文排序需要转码:convert(字段 using gbk)
例如:
以下按部门顺序(部门相同按性别顺序,性别相同按月薪顺序降序)查看员工数据。
mysql> select id, name, gender, department,salary
-> from emps
-> order by convert(department using gbk), convert(gender using gbk), salary;
| 477 | 朱静 | 女 | 售后部 | 7310.00 |
| 295 | 何欣 | 女 | 售后部 | 6760.00 |
| 720 | 金雪 | 女 | 售后部 | 5380.00 |
| 832 | 汪凯 | 男 | 销售部 | 13000.00 |
| 324 | 石欢 | 男 | 销售部 | 12960.00 |
...
| 587 | 唐鑫 | 男 | 销售部 | 5070.00 |
| 761 | 唐林 | 男 | 销售部 | 5060.00 |
| 673 | 潘佳 | 男 | 销售部 | 5040.00 |
| 127 | 尹建 | 男 | 销售部 | 5030.00 |
| 202 | 朱明 | 男 | 销售部 | 5010.00 |
| 735 | 陈坤 | 男 | 销售部 | 5010.00 |
| 582 | 陈琴 | 女 | 销售部 | 12990.00 |
| 592 | 叶玉 | 女 | 销售部 | 12990.00 |
| 621 | 宋秀荣 | 女 | 销售部 | 12880.00 |
| 322 | 阎晶 | 女 | 销售部 | 12880.00 |
| 376 | 曾畅 | 女 | 销售部 | 12850.00 |
| 755 | 鞠桂珍 | 女 | 销售部 | 12840.00 |
...
查看跳过前100条记录后的5条数据
mysql> select id, name, gender, birth_date
-> from emps
-> limit 100,5;
+-----+-----------+--------+------------+
| id | name | gender | birth_date |
+-----+-----------+--------+------------+
| 101 | 魏志强 | 男 | 1991-04-20 |
| 102 | 蒋淑珍 | 女 | 1966-10-24 |
| 103 | 仝龙 | 男 | 1992-07-12 |
| 104 | 刘丽丽 | 女 | 1996-12-11 |
| 105 | 罗畅 | 女 | 1969-12-02 |
+-----+-----------+--------+------------+
5 rows in set (0.184 sec)
语法:
SELECT 字段名1 AS 新字段名1, 字段名2 AS 新字段名2, ... FROM 表名 ...
as: 作为
例如:
mysql> SELECT id AS 编号, name AS 姓名, birth_date AS 出生日期
-> FROM emps
-> limit 5;
+--------+-----------+--------------+
| 编号 | 姓名 | 出生日期 |
+--------+-----------+--------------+
| 1 | 李桂香 | 1988-07-03 |
| 2 | 潘梅 | 1998-01-31 |
| 3 | 王秀英 | 1986-12-30 |
| 4 | 马利 | 1970-08-10 |
| 5 | 张丽华 | 1971-05-31 |
+--------+-----------+--------------+
5 rows in set (0.187 sec)
语法:
SELECT 字段列表 或 * FROM 表名 WHERE 条件;
where: 在那里
条件由比较运算和逻辑运算构成。
序号 | 运算符 | 含义 | 举例 |
---|---|---|---|
1 | = | 等于 | name='王晓晓' |
2 | != | 不等于 | price!=800 |
3 | > | 大于 | count>1500 |
4 | >= | 大于或等于 | dateOfBirth>='1990-12-31' |
5 | < | 小于 | age<18 |
6 | <= | 小于等于 | age<=18 |
7 | between x and y | 介于 x 和 y 之间(含 x 和 y) | age between 18 and 60 |
8 | in (a,b,...) | 值等于 a,b,...中的任意一个 | loaction in ('昆明','上海','北京') |
9 | like 'xyz' | 像(匹配),% 代表零到任意多个任意字符的组合 | name like '李%' name like '%明' name like '%小%' |
序号 | 运算符 | 含义 | 举例 |
---|---|---|---|
1 | and | 并且 | a>10 and b>30(两条都要满足) |
2 | or | 或者 | a>10 or b>30(只要一条满足即可) |
3 | not | 不(否定) | name not like '%so%' id not in (1,10,12) |
4 | xor | 异或(相异为真) | age>18 xor title='' |
查看员工工资在8000到9000之间(含8000和9000)的信息。
mysql> SELECT id, name, salary
-> FROM emps
-> WHERE salary>=8000 and salary<=9000;
+-----+-----------+---------+
| id | name | salary |
+-----+-----------+---------+
| 4 | 马利 | 8860.00 |
| 11 | 王桂芝 | 8370.00 |
| 17 | 杨宇 | 8630.00 |
......
| 844 | 江杨 | 8190.00 |
+-----+-----------+---------+
116 rows in set (0.198 sec)
或者:
mysql> SELECT id, name, salary
-> FROM emps
-> WHERE salary between 8000 and 9000;
+-----+-----------+---------+
| id | name | salary |
+-----+-----------+---------+
| 4 | 马利 | 8860.00 |
| 11 | 王桂芝 | 8370.00 |
| 17 | 杨宇 | 8630.00 |
......
| 844 | 江杨 | 8190.00 |
+-----+-----------+---------+
116 rows in set (0.190 sec)
以下查找出生于1995年12月31日以后的员工,并按生日升序排序。
mysql> select id,name,gender,birth_date
-> from emps
-> where birth_date>'1995-12-31'
-> order by birth_date asc;
+-----+-----------+--------+------------+
| id | name | gender | birth_date |
+-----+-----------+--------+------------+
| 496 | 李莹 | 女 | 1996-01-18 |
| 119 | 邵艳 | 女 | 1996-01-24 |
| 753 | 李宁 | 男 | 1996-01-24 |
| 70 | 李兰英 | 女 | 1996-01-25 |
......
| 520 | 刘桂香 | 女 | 1998-11-16 |
| 334 | 胡丽娟 | 女 | 1998-11-18 |
| 802 | 叶春梅 | 女 | 1998-11-20 |
+-----+-----------+--------+------------+
71 rows in set (0.191 sec)
以下查找姓“许”的员工。
mysql> select id, name, gender
-> from emps
-> where name like '许%';
+-----+-----------+--------+
| id | name | gender |
+-----+-----------+--------+
| 145 | 许莉 | 女 |
| 316 | 许伟 | 男 |
| 479 | 许玉华 | 女 |
| 584 | 许宁 | 男 |
| 773 | 许燕 | 女 |
| 784 | 许建华 | 男 |
| 799 | 许小红 | 女 |
+-----+-----------+--------+
7 rows in set (0.187 sec)
以下查找姓名中包含“金”字的员工。
mysql> select id, name, gender
-> from emps
-> where name like '%金%';
+-----+-----------+--------+
| id | name | gender |
+-----+-----------+--------+
| 9 | 金兰英 | 女 |
| 56 | 金冬梅 | 女 |
| 122 | 董金凤 | 女 |
| 205 | 邱金凤 | 女 |
| 395 | 金刚 | 男 |
| 602 | 郑金凤 | 女 |
| 618 | 王金凤 | 女 |
| 674 | 陈金凤 | 女 |
| 720 | 金雪 | 女 |
| 795 | 邱金凤 | 女 |
| 803 | 金桂花 | 女 |
+-----+-----------+--------+
11 rows in set (0.200 sec)
以下例列出id为11,23,155,278的员工。
mysql> select id, name, gender
-> from emps
-> where id in (11,23,155,278);
+-----+-----------+--------+
| id | name | gender |
+-----+-----------+--------+
| 11 | 王桂芝 | 女 |
| 23 | 李淑英 | 女 |
| 155 | 刘琴 | 女 |
| 278 | 杨斌 | 男 |
+-----+-----------+--------+
4 rows in set (0.184 sec)
以下查找“月薪小于5000并且性别为女性;或者月薪大于8000,并且性别为男性或者出生于1995年以后”的员工。
mysql> select id,name,gender,birth_date,salary
from emps
where (salary<8000 and gender='女')
or (salary>10000 and (gender='男' or birth_date>'1995-12-31'))
order by gender, salary desc, birth_date;
+-----+-----------+--------+------------+----------+
| id | name | gender | birth_date | salary |
+-----+-----------+--------+------------+----------+
| 169 | 陈海燕 | 女 | 1997-11-14 | 12710.00 |
| 486 | 周秀梅 | 女 | 1997-01-08 | 12450.00 |
| 802 | 叶春梅 | 女 | 1998-11-20 | 12430.00 |
| 51 | 李洁 | 女 | 1998-08-07 | 12190.00 |
| 19 | 蔡柳 | 女 | 1997-10-31 | 11930.00 |
| 696 | 袁丹 | 女 | 1998-06-25 | 11890.00 |
...
| 133 | 杨欢 | 男 | 1981-03-19 | 10060.00 |
| 770 | 邱杨 | 男 | 1983-03-24 | 10060.00 |
| 340 | 何浩 | 男 | 1991-11-17 | 10050.00 |
| 106 | 单平 | 男 | 1993-05-30 | 10030.00 |
| 813 | 杨楠 | 男 | 1998-03-20 | 10030.00 |
| 504 | 王军 | 男 | 1973-12-31 | 10020.00 |
+-----+-----------+--------+------------+----------+
322 rows in set (0.209 sec)
语法:
SELECT COUNT(*) FROM 表名;
例如:
mysql> SELECT COUNT(*) AS 记录数 FROM emps;
+-----------+
| 记录数 |
+-----------+
| 852 |
+-----------+
1 row in set (0.197 sec)
mysql> SELECT COUNT(*) AS 8000元及以上员工人数
-> FROM emps
-> WHERE salary>=8000;
+------------------------------+
| 8000元及以上员工人数 |
+------------------------------+
| 545 |
+------------------------------+
1 row in set (0.313 sec)
语法:
SELECT SUM(列名), MAX(列名), MIN(列名), AVG(列名) FROM 表名 ...
sum: 总和;max: maximum, 最大值; min: minimum, 最小值; avg: average, 平均值
例如:
统计和计算emps表中月薪一列 (salary) 的总和、最大值、最小值及平均值。
mysql> SELECT SUM(salary) AS 月薪总额, MAX(salary) AS 最高月薪,
-> MIN(salary) AS 最低月薪, AVG(salary) AS 平均月薪
-> FROM emps;
+--------------+--------------+--------------+--------------+
| 月薪总额 | 最高月薪 | 最低月薪 | 平均月薪 |
+--------------+--------------+--------------+--------------+
| 7788690.00 | 13000.00 | 5010.00 | 9141.654930 |
+--------------+--------------+--------------+--------------+
1 row in set (0.186 sec)
语法:
SELECT 分组列名1,分组列名2, ..., 统计函数... FROM emps ... GROUP BY 分组列名1, 分组列名2,...;
group by ... : 依据 ... 分组
举例:
mysql> SELECT department AS 部门, count(*) AS 人数
-> FROM emps
-> GROUP BY department;
+-----------+--------+
| 部门 | 人数 |
+-----------+--------+
| 人事部 | 66 |
| 公关部 | 56 |
| 售后部 | 74 |
| 设计部 | 66 |
| 销售部 | 590 |
+-----------+--------+
5 rows in set (0.752 sec)
SELECT department AS 部门, gender AS 性别, count(*) AS 人数
-> FROM emps
-> GROUP BY department, gender;
+-----------+--------+--------+
| 部门 | 性别 | 人数 |
+-----------+--------+--------+
| 人事部 | 女 | 36 |
| 人事部 | 男 | 30 |
| 公关部 | 女 | 30 |
| 公关部 | 男 | 26 |
| 售后部 | 女 | 41 |
| 售后部 | 男 | 33 |
| 设计部 | 女 | 31 |
| 设计部 | 男 | 35 |
| 销售部 | 女 | 309 |
| 销售部 | 男 | 281 |
+-----------+--------+--------+
10 rows in set (0.187 sec)
SELECT YEAR(birth_date) AS 出生年份, COUNT(*) AS 员工人数
-> FROM emps
-> GROUP BY 出生年份;
+--------------+--------------+
| 出生年份 | 员工人数 |
+--------------+--------------+
| 1963 | 3 |
| 1964 | 23 |
| 1965 | 24 |
| 1966 | 23 |
| 1967 | 30 |
| 1968 | 31 |
...
| 1994 | 24 |
| 1995 | 21 |
| 1996 | 21 |
| 1997 | 19 |
| 1998 | 31 |
+--------------+--------------+
36 rows in set (0.187 sec)
YEAR(日期):取出日期的年份信息
GROUP BY 中的列名可用别名替代
即:收入0~999元几人,收入1000元到1999元几人,2000元到2999元几人...
SELECT FLOOR(salary/1000)*1000 AS 月薪等级, COUNT(*) AS 员工人数
-> FROM emps
-> GROUP BY 月薪等级;
+--------------+--------------+
| 月薪等级 | 员工人数 |
+--------------+--------------+
| 5000 | 86 |
| 6000 | 103 |
| 7000 | 118 |
| 8000 | 114 |
| 9000 | 93 |
| 10000 | 96 |
| 11000 | 124 |
| 12000 | 116 |
| 13000 | 2 |
+--------------+--------------+
9 rows in set (0.187 sec)
FLOOR(小数):取小数的整数部分,不四舍五入
或者:
mysql> SELECT CONCAT(FLOOR(salary/1000)*1000,'~',FLOOR(salary/1000)*1000+999) AS 月薪等级,
-> COUNT(*) 员工人数
-> FROM emps
-> GROUP BY 月薪等级
-> ORDER BY FLOOR(salary/1000)*1000;
+--------------+--------------+
| 月薪等级 | 员工人数 |
+--------------+--------------+
| 5000~5999 | 86 |
| 6000~6999 | 103 |
| 7000~7999 | 118 |
| 8000~8999 | 114 |
| 9000~9999 | 93 |
| 10000~10999 | 96 |
| 11000~11999 | 124 |
| 12000~12999 | 116 |
| 13000~13999 | 2 |
+--------------+--------------+
9 rows in set (0.205 sec)
CONCAT(值1,值2,... 值n):将所有列出来的值变成字符串并拼接进来。
1、请从 emps 表中选择出“月薪(salary)最高的5个员工,月薪相同的入职日期(emp_date)越早的排在越靠前的位置”。
2、请按此字段顺序显示50名员工信息:序号(id),姓名(name),性别(gender),出生日期(birth_date),年龄(从出生日期计算)。年龄越大越靠前。
两个日期时间之间的差值计算:
timestatmpdiff(单位,日期1,日期2)
单位:
表示 | 含义 | 举例 |
---|---|---|
YEAR | 年 | '1999-10-10'出生的人当前年龄? timestampdiff(YEAR, '1999-10-10',now()) |
MONTH | 月 | |
QUARTER | 季度 | |
DAY | 天 | 现在距2035年还有几天? timestampdiff(DAY,now(),'2035-01-01') |
WEEK | 星期 | |
HOUR | 小时 | |
MINUTE | 分 | |
SECOND | 秒 |
3、统计在公司工作超过5年的员工有几个?
4、列出在公司工作8年及以上,但月薪低于6000元的员工(列出的信息包含工龄)。
5、按部门列出最高工资、最低工资、平均工资和工资总额。
6、统计公司员工中男女员工各多少?
7、列出员工的籍贯(hometown)都有哪些(不重复)。
8、找出姓名包含“兰”字的员工。
9、找出所有90后员工,并按出生日期升序排序。
10、列出忽略前100条记录后的10条记录,按雇用日期(emp_date)升序排序。