所需要用到的創(chuàng)建表格的代碼如下:
create table dept
(
deptno numeric(2),
dname varchar(14),
loc varchar(13),
constraint pk_dept primary key(deptno)
);
create table emp
(
empno numeric(4),
ename varchar(10),
job varchar(9),
mgr numeric(4),
hiredate date,
sal numeric(7,2),
comm numeric(7,2),
deptno numeric(2),
constraint pk_emp primary key(empno),
constraint fk_deptno foreign key(deptno) references dept(deptno)
);
insert into dept values(10,'ACCOUNTING','NEW YORK');
insert into dept values (20,'RESEARCH','DALLAS');
insert into dept values (30,'SALES','CHICAGO');
insert into dept values (40,'OPERATIONS','BOSTON');
insert into emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
insert into emp values (7499,'ALLEN','SALESMAN',7698,'1981-02-02',1600,300,30);
insert into emp values (7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
insert into emp values (7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
insert into emp values (7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
insert into emp values (7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
insert into emp values (7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
insert into emp
values (7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
insert into emp values (7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
insert into emp values (7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
insert into emp values (7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
insert into emp values (7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
表視圖:
emp表結(jié)構(gòu)
emp表視圖
dept表結(jié)構(gòu)
dept表視圖
Mysql簡單select句子
列出管理MySQL數(shù)據(jù)庫服務的常用命令:
Systemctl start/stop/status/restart mysql
#用root用戶連接數(shù)據(jù)庫,查詢當前有哪些數(shù)據(jù)庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
#創(chuàng)建db數(shù)據(jù)庫,執(zhí)行scott.sql腳本文件,創(chuàng)建測試表emp和dept
mysql> create database db;
Query OK, 1 row affected (0.07 sec)
mysql> use db
Database changed
mysql> source scott.sql
#連接db數(shù)據(jù)庫,查詢db數(shù)據(jù)庫中有哪些表
mysql> show tables;
+--------------+
| Tables_in_db |
+--------------+
| dept |
| emp |
+--------------+
2 rows in set (0.00 sec)
#查看emp和dept表的結(jié)構(gòu)。
mysql> desc dept;(查詢表dept結(jié)構(gòu))
+--------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| deptno | decimal(2,0) | NO | PRI | NULL | |
| dname | varchar(14) | YES | | NULL | |
| loc | varchar(13) | YES | | NULL | |
+--------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> desc emp;(查詢表emp結(jié)構(gòu))
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| empno | decimal(4,0) | NO | PRI | NULL | |
| ename | varchar(10) | YES | | NULL | |
| job | varchar(9) | YES | | NULL | |
| mgr | decimal(4,0) | YES | | NULL | |
| hiredate | datetime | YES | | NULL | |
| sal | decimal(7,2) | YES | | NULL | |
| comm | decimal(7,2) | YES | | NULL | |
| deptno | decimal(2,0) | YES | MUL | NULL | |
+----------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
#連接db數(shù)據(jù)庫,查詢emp表中的所有人的姓名。
mysql> select ename from emp;
+--------+
| ename |
+--------+
| SMITH |
| ALLEN |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| KING |
| TURNER |
| JAMES |
| FORD |
| MILLER |
+--------+
12 rows in set (0.00 sec)
#用別名把上面查詢結(jié)果中的列名ename改為漢字:員工名稱。
mysql> select ename as 員工名稱;
-> from emp;
+-----------------+
| 員工名稱; |
+-----------------+
| SMITH |
| ALLEN |
| WARD |
| JONES |
| MARTIN |
| BLAKE |
| CLARK |
| KING |
| TURNER |
| JAMES |
| FORD |
| MILLER |
+-----------------+
12 rows in set (0.00 sec)
#查詢emp表中的不重復的部門號。
mysql> select distinct deptno from emp;
+--------+
| deptno |
+--------+
| 10 |
| 20 |
| 30 |
+--------+
3 rows in set (0.00 sec)
#查詢emp表中,工資額大于2000的員工的姓名及其工資額。
mysql> select ename,sal from emp where sal > 2000;
+-------+---------+
| ename | sal |
+-------+---------+
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+-------+---------+
#查詢emp表中,工資額界于2000與3000之間的員工姓名及其工資額。
方法一:
mysql> select ename,sal from emp where sal >= 2000 and sal <= 3000;
+-------+---------+
| ename | sal |
+-------+---------+
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| FORD | 3000.00 |
+-------+---------+
4 rows in set (0.00 sec)
方法二:
mysql> select ename,sal from emp where sal between 2000 and 3000;
+-------+---------+
| ename | sal |
+-------+---------+
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| FORD | 3000.00 |
+-------+---------+
4 rows in set (0.00 sec)
#查詢emp表中,ename列以字母A開頭的員工的姓名。
mysql> select ename,sal from emp where ename like 'A%';
+-------+---------+
| ename | sal |
+-------+---------+
| ALLEN | 1600.00 |
+-------+---------+
1 row in set (0.00 sec)
#查詢emp表中,ename列含有字母A的員工的姓名。
mysql> select ename,sal from emp where ename like '%A%';
+--------+---------+
| ename | sal |
+--------+---------+
| ALLEN | 1600.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| JAMES | 950.00 |
+--------+---------+
6 rows in set (0.00 sec)
#查詢emp表中,ename列第三個字母為A、第五個字母為R的員工的姓名。
mysql> select ename,sal from emp where ename like '__A_R%';
Empty set (0.00 sec)
#查詢emp表中,姓名及工資額,要求工資按照降序排序。
mysql> select ename,sal(從低到高)
-> from emp
-> order by sal;
+--------+---------+
| ename | sal |
+--------+---------+
| SMITH | 800.00 |
| JAMES | 950.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| MILLER | 1300.00 |
| TURNER | 1500.00 |
| ALLEN | 1600.00 |
| CLARK | 2450.00 |
| BLAKE | 2850.00 |
| JONES | 2975.00 |
| FORD | 3000.00 |
| KING | 5000.00 |
+--------+---------+
12 rows in set (0.00 sec)
mysql> select ename,sal from emp order by sal desc;(叢高到低)
+--------+---------+
| ename | sal |
+--------+---------+
| KING | 5000.00 |
| FORD | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| ALLEN | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
| WARD | 1250.00 |
| MARTIN | 1250.00 |
| JAMES | 950.00 |
| SMITH | 800.00 |
+--------+---------+
12 rows in set (0.00 sec)
#查詢emp表中,comm列為NULL的員工的姓名。
mysql> select ename from emp where comm is null;
+--------+
| ename |
+--------+
| SMITH |
| JONES |
| BLAKE |
| CLARK |
| KING |
| JAMES |
| FORD |
| MILLER |
+--------+
8 rows in set (0.00 sec)
mysql> select ename from emp where comm is not null;
+--------+
| ename |
+--------+
| ALLEN |
| WARD |
| MARTIN |
| TURNER |
+--------+
4 rows in set (0.00 sec)
匯總函數(shù)
#查詢每個部門的最高工資,要求列出部門編號及其最高工資額。
mysql> select deptno,max(sal) from emp group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
| 10 | 5000.00 |
| 20 | 3000.00 |
| 30 | 2850.00 |
+--------+----------+
3 rows in set (0.00 sec)
#查詢各個工種的人數(shù)。
mysql> select job 工種,count(empno) 員工人數(shù) from emp group by job;
+-----------+--------------+
| 工種 | 員工人數(shù) |
+-----------+--------------+
| CLERK | 3 |
| SALESMAN | 4 |
| MANAGER | 3 |
| PRESIDENT | 1 |
| ANALYST | 1 |
+-----------+--------------+
5 rows in set (0.00 sec)
#查詢sal列上有無重復值,給出判斷語句及判斷結(jié)果。
方法一:
mysql> select sal,count(sal) from emp group by sal having count(sal);
+---------+------------+
| sal | count(sal) |
+---------+------------+
| 800.00 | 1 |
| 1600.00 | 1 |
| 1250.00 | 2 |
| 2975.00 | 1 |
| 2850.00 | 1 |
| 2450.00 | 1 |
| 5000.00 | 1 |
| 1500.00 | 1 |
| 950.00 | 1 |
| 3000.00 | 1 |
| 1300.00 | 1 |
+---------+------------+
11 rows in set (0.00 sec)
方法二:
mysql> select sal,count(*) from emp group by sal having count(sal)>1;
+---------+----------+
| sal | count(*) |
+---------+----------+
| 1250.00 | 2 |
+---------+----------+
1 row in set (0.00 sec)
#查詢每個員工工資與emp表的平均工資之間的差距。
mysql> select ename,sal - (select avg(sal) from emp) from emp;
+--------+----------------------------------+
| ename | sal - (select avg(sal) from emp) |
+--------+----------------------------------+
| SMITH | -1277.083333 |
| ALLEN | -477.083333 |
| WARD | -827.083333 |
| JONES | 897.916667 |
| MARTIN | -827.083333 |
| BLAKE | 772.916667 |
| CLARK | 372.916667 |
| KING | 2922.916667 |
| TURNER | -577.083333 |
| JAMES | -1127.083333 |
| FORD | 922.916667 |
| MILLER | -777.083333 |
+--------+----------------------------------+
12 rows in set (0.00 sec)
mysql> select sal,count(*) from emp group by sal having count(sal)>1;
+---------+----------+
| sal | count(*) |
+---------+----------+
| 1250.00 | 2 |
+---------+----------+
1 row in set (0.00 sec)
#查詢emp表最高工資與平均工資的差距。
mysql> select max(sal) - (select avg(sal) from emp) from emp;
+---------------------------------------+
| max(sal) - (select avg(sal) from emp) |
+---------------------------------------+
| 2922.916667 |
+---------------------------------------+
1 row in set (0.00 sec)
#查詢每個員工的名稱及其工種的名稱。
mysql> select ename,job from emp;
+--------+-----------+
| ename | job |
+--------+-----------+
| SMITH | CLERK |
| ALLEN | SALESMAN |
| WARD | SALESMAN |
| JONES | MANAGER |
| MARTIN | SALESMAN |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| KING | PRESIDENT |
| TURNER | SALESMAN |
| JAMES | CLERK |
| FORD | ANALYST |
| MILLER | CLERK |
+--------+-----------+
12 rows in set (0.00 sec)
#查詢哪個工種的人數(shù)最多,要求列出這種工種的完整名稱及其人數(shù)。
方法一:
mysql> select job,count(1) from emp group by job;
+-----------+----------+
| job | count(1) |
+-----------+----------+
| CLERK | 3 |
| SALESMAN | 4 |
| MANAGER | 3 |
| PRESIDENT | 1 |
| ANALYST | 1 |
+-----------+----------+
5 rows in set (0.00 sec)
方法二:
mysql> select job,count(*) from emp group by job order by count(*) desc limit 1;
+----------+----------+
| job | count(*) |
+----------+----------+
| SALESMAN | 4 |
+----------+----------+
1 row in set (0.00 sec)
#查詢哪個部門的員工個數(shù)最多,要求列出此部門編號及其員工個數(shù)。
mysql> select deptno,count(*) from emp group by deptno order by count(*) desc limit 1;
+--------+----------+
| deptno | count(*) |
+--------+----------+
| 30 | 6 |
+--------+----------+
1 row in set (0.01 sec)
#查詢每年的入職人數(shù),要求列出相應年份及入職人數(shù),查詢結(jié)果以年份排序。
mysql> select year(hiredate),count(*) from emp group by year(hiredate) order
by year(hiredate) asc;
+----------------+----------+
| year(hiredate) | count(*) |
+----------------+----------+
| 1980 | 1 |
| 1981 | 10 |
| 1982 | 1 |
+----------------+----------+
3 rows in set (0.00 sec)
#查詢哪個部門的平均工資最高,要求列出部門名稱及其平均工資額。
mysql> select deptno,avg(sal) from emp group by deptno;
+--------+-------------+
| deptno | avg(sal) |
+--------+-------------+
| 10 | 2916.666667 |
| 20 | 2258.333333 |
| 30 | 1566.666667 |
+--------+-------------+
3 rows in set (0.00 sec
#查詢哪些工種的平均工資高于2000,要求列出工種名稱及其平均工資額。
mysql> select avg(sal),job from emp group by job having avg(sal)>2000;
+-------------+-----------+
| avg(sal) | job |
+-------------+-----------+
| 2758.333333 | MANAGER |
| 5000.000000 | PRESIDENT |
| 3000.000000 | ANALYST |
+-------------+-----------+
3 rows in set (0.00 sec)
#利用find命令(或其他命令),查詢mysql和mysqld在哪個目錄下。
Mysql:
[root@law ~]# find / -iname mysql
/etc/logrotate.d/mysql
/etc/selinux/targeted/active/modules/100/mysql
/var/lib/mysql
/var/lib/mysql/mysql
/usr/bin/mysql
/usr/lib64/mysql
Mysqld:
[root@law ~]# find / -iname mysqld
/run/mysqld
/usr/sbin/mysqld
查詢
# 查詢每個部門分別是哪個員工獲得了其所在部門的最高工資,要求列出其名稱、部門名稱及其工資額。
select e.ename,dept.dname,a.max_sal
from
emp e,
dept,
(select deptno,max(sal) as max_sal from emp group by deptno) a
where
e.deptno = dept.deptno
and
a.deptno = e.deptno
and
a.max_sal = e.sal
結(jié)果:
+-------+------------+---------+
| ename | dname | max_sal |
+-------+------------+---------+
| KING | ACCOUNTING | 5000.00 |
| FORD | RESEARCH | 3000.00 |
| BLAKE | SALES | 2850.00 |
+-------+------------+---------+
3 rows in set (0.00 sec)
#查詢工資超過平均工資的員工個數(shù)
mysql> select count(sal) from emp where sal>(select avg(sal) from emp); +------------+
| count(sal) |
+------------+
| 5 |
+------------+
1 row in set (0.00 sec)
#查詢每個部門中,超過部門平均工資的員工姓名。
select deptno,ename from emp
where
sal>(select avg(sal) from emp where emp.deptno = deptno)
結(jié)果:
+--------+-------+
| deptno | ename |
+--------+-------+
| 20 | JONES |
| 30 | BLAKE |
| 10 | CLARK |
| 10 | KING |
| 20 | FORD |
+--------+-------+
5 rows in set (0.00 sec)
索引
#在emp表的ename列創(chuàng)建索引idx_ename,確認索引已創(chuàng)建。
mysql> create index idx_ename on emp(ename);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index from emp\G;
*************************** 1. row ***************************
Table: emp
Non_unique: 1
Key_name: idx_ename
Seq_in_index: 1
Column_name: ename
Collation: A
Cardinality: 12
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
1 row in set (0.00 sec)
ERROR:
No query specified
#執(zhí)行下面命令對emp表添加一行記錄:
mysql> insert into emp(empno, ename, sal, deptno)
-> values(9999, 'MIKE', 3000.00, 10);
重新執(zhí)行show index from emp,查看索引的Cardinality是否變化,說明了什么問題。執(zhí)行下面命令對emp表重新計算統(tǒng)計信息,再次查詢其Cardinality是否變化。
mysql> analyze table emp;
重新分析
#查看下面查詢的執(zhí)行計劃,確認其是否使用了idx_ename索引。
#select * from emp where ename = 'SMITH'
mysql> explain select * from emp where ename = 'SMITH'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: emp
partitions: NULL
type: ref
possible_keys: idx_ename
key: idx_ename
key_len: 43
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
ERROR:
No query specified
#select * from emp where ename like 'S%'
mysql> explain select * from emp where ename like 'S%'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: emp
partitions: NULL
type: range
possible_keys: idx_ename
key: idx_ename
key_len: 43
ref: NULL
rows: 1
filtered: 100.00
Extra: Using index condition
1 row in set, 1 warning (0.04 sec)
ERROR:
No query specified
#select * from emp where ename like '%S'
mysql> explain select * from emp where ename like '%S'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: emp
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 13
filtered: 11.11
Extra: Using where
1 row in set, 1 warning (0.00 sec)
ERROR:
No query specified
#刪除idx_ename索引。
mysql> drop index idx_ename on emp;
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
#執(zhí)行下面命令在ename和sal列上創(chuàng)建復合索引idx_ename_sal,確認索引已創(chuàng)建。
mysql> create index idx_ename_sal on emp(ename, sal);
#下面哪個查詢會使用以上idx_ename_sal。
select * from emp where ename = 'SMITH'
select * from emp where sal = 1000
select * from emp where ename = 'SMITH' and sal = 1000
select * from emp where sal = 1000 and ename = 'SMITH'
#下面命令,查看表連接的執(zhí)行計劃。
mysql> explain
-> select e.ename, d.dname
-> from emp e, dept d
-> where e.deptno = d.deptno
-> \G
#創(chuàng)建big_table存儲過程后,執(zhí)行call big_table(100000),創(chuàng)建big_table表,并對其添加10萬行記錄,在id列上創(chuàng)建索引idx_id,下面查詢是否會用到此索引:
mysql>select big_table from t where id = 1000
#執(zhí)行下面update命令:
mysql>update big_table set id = 1000 where id >= 1001;
#執(zhí)行下面命令重新計算big_table的統(tǒng)計信息:
mysql> analyze table big_table;
#再次查看下面命令是否使用了idx_id索引:
mysql>select * from big_table where id = 1000
#執(zhí)行下面命令統(tǒng)計id列的直方圖后,以上查詢是否會使用索引
mysql> analyze table big_table update histogram on length with 1000 buckets;
邏輯備份
#執(zhí)行select into outfile導出dept表,清空dept表后由邏輯備份執(zhí)行l(wèi)oad data導入數(shù)據(jù)。
mysql> select * from dept into outfile '/var/lib/mysql-files/dept.ckp'
-> ;
Query OK, 4 rows affected (0.00 sec)
mysql> truncate table dept;
Query OK, 0 rows affected (0.06 sec)
mysql> select * from dept;
Empty set (0.00 sec)
mysql> edit
-> \p
--------------
load data infile '/var/lib/mysql-files/dept.ckp'
into table dept
--------------
-> ;
Query OK, 4 rows affected (0.10 sec)
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from dept;
+--------+------------+----------+
| deptno | dname | loc |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
4 rows in set (0.00 sec)
[root@law mysql-files]# ls
dept_bak.CSV dept.bkp dept.ckp dept.sql dept.txt
[root@law mysql-files]# cat dept.ckp
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
歡迎技術(shù)交流
WeChat......