把查询结果去除重复记录(distinct)

注意:(1)原表数据不会改变

​ (2)只能出现在所有字段之前

​ (3)若其后有多个字段,则是把两个字段联合起来去除重复记录

mysql> select distinct job from emp;
+-----------+
| job       |
+-----------+
| CLERK     |
| SALESMAN  |
| MANAGER   |
| ANALYST   |
| PRESIDENT |
+-----------+
5 rows in set (0.00 sec)

连接查询

从一张表中单独查询称为单表查询。

多张表联合起来查询数据称为连接查询。

分类

按语法的年代

  • SQL92 1992年出现的语法
  • SQL99 1999年出现的语法

按表连接的方式

  • 内连接:表之间为平等关系,没有主次之分

    • 等值连接
    • 非等值连接
    • 自连接
  • 外连接:表之间有主次关系
    • 左外连接(左连接)
    • 右外连接(右连接)
  • 全连接(几乎不用)

笛卡儿积现象

​ 当两张表进行连接查询时,如果没有任何条件限制,最终查询结果的条数为两张表条数的积。

如何避免?

​ 连接时添加条件,满足这个条件的记录才会被筛选出来。

​ 值得注意的是,尽管显示结果的条数减少了,但匹配的次数并没有减少。因此,连接的表越多,程序执行效率越低。我们应尽量减少表的连接次数。

mysql> select ename,dname from emp,dept where emp.deptno=dept.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
+--------+------------+
14 rows in set (0.00 sec)

​ 上述代码虽然执行正确,但由于ename,dname仍需要分别与emp,dept进行匹配,效率会比较低。

mysql> select emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
+--------+------------+
14 rows in set (0.00 sec)

还可以更高效

mysql> select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
+--------+------------+
14 rows in set (0.00 sec)

因此,(在from中)给表起表名很重要。

内连接之等值连接

​ 例:查询每个员工所在部门的名称,显示员工名和部门名。

​ SQL92:

mysql> select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
+--------+------------+
14 rows in set (0.00 sec)

缺点:结构不清晰,表的连接条件和后期进一步筛选的条件都放到了where后面。

​ SQL99:

mysql> select e.ename,d.dname from emp e join dept d on e.deptno=d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
+--------+------------+
14 rows in set (0.00 sec)

优点:表连接的条件是独立的,连接之后如果需要进一步筛选,再往后继续添加where。

内连接语法

​ select

​ …

​ from

​ A

​ (inner) join

​ B

​ on

​ a和b连接的条件

​ where

​ 筛选条件

其中inner可省略。但加上inner之后可读性更好。

内连接之非等值连接

条件不是一个定量关系,称为非等值连接。

​ 例:找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级?

mysql>  select e.ename,e.sal,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal;
+--------+---------+-------+
| ename  | sal     | grade |
+--------+---------+-------+
| SMITH  |  800.00 |     1 |
| ALLEN  | 1600.00 |     3 |
| WARD   | 1250.00 |     2 |
| JONES  | 2975.00 |     4 |
| MARTIN | 1250.00 |     2 |
| BLAKE  | 2850.00 |     4 |
| CLARK  | 2450.00 |     4 |
| SCOTT  | 3000.00 |     4 |
| KING   | 5000.00 |     5 |
| TURNER | 1500.00 |     3 |
| ADAMS  | 1100.00 |     1 |
| JAMES  |  950.00 |     1 |
| FORD   | 3000.00 |     4 |
| MILLER | 1300.00 |     2 |
+--------+---------+-------+
14 rows in set (0.00 sec)

内连接之自连接

​ 例:查询员工的上级领导,显示员工名和相应的领导名。

​ 技巧:一张表看成两张表

mysql> select a.ename 'emplyee',b.ename 'leader' from emp a join emp b on a.mgr=b.empno;
+---------+--------+
| emplyee | leader |
+---------+--------+
| SMITH   | FORD   |
| ALLEN   | BLAKE  |
| WARD    | BLAKE  |
| JONES   | KING   |
| MARTIN  | BLAKE  |
| BLAKE   | KING   |
| CLARK   | KING   |
| SCOTT   | JONES  |
| TURNER  | BLAKE  |
| ADAMS   | SCOTT  |
| JAMES   | BLAKE  |
| FORD    | JONES  |
| MILLER  | CLARK  |
+---------+--------+
13 rows in set (0.00 sec)mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)
//mgr为领导编号,empno为个人的员工号

外连接之右外连接(right)

​ 例:查询员工对应的岗位,并且没有找到员工的岗位也要显示出。

mysql> select e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
| NULL   | OPERATIONS |
+--------+------------+
15 rows in set (0.00 sec)

其中,right表示关键字右边的表为主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表。

在right(在左连接中为left)和join之间有一个outer,outer可省略,但带着可读性强。

外连接之左外连接(left)

例1:查询员工对应的岗位,并且没有找到员工的岗位也要显示出。

mysql> select e.ename,d.dname from dept d left join emp e on e.deptno=d.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| CLARK  | ACCOUNTING |
| KING   | ACCOUNTING |
| MILLER | ACCOUNTING |
| SMITH  | RESEARCH   |
| JONES  | RESEARCH   |
| SCOTT  | RESEARCH   |
| ADAMS  | RESEARCH   |
| FORD   | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| TURNER | SALES      |
| JAMES  | SALES      |
| NULL   | OPERATIONS |
+--------+------------+
15 rows in set (0.00 sec)

左、右连接可以相互转换。

外连接的查询结果条数>=内连接的查询结果条数

例2:查询每个员工的上级领导编号,要求显示所有员工的名字及领导名。

mysql> select a.ename as emplyee,b.ename as leader from emp a left join emp b on a.mgr=b.empno;
+---------+--------+
| emplyee | leader |
+---------+--------+
| SMITH   | FORD   |
| ALLEN   | BLAKE  |
| WARD    | BLAKE  |
| JONES   | KING   |
| MARTIN  | BLAKE  |
| BLAKE   | KING   |
| CLARK   | KING   |
| SCOTT   | JONES  |
| KING    | NULL   |
| TURNER  | BLAKE  |
| ADAMS   | SCOTT  |
| JAMES   | BLAKE  |
| FORD    | JONES  |
| MILLER  | CLARK  |
+---------+--------+
14 rows in set (0.00 sec)

​ tip:员工名为主,故a为主表。

多张表的连接

语法:select

​ …

​ from

​ A

​ left join

​ B

​ on

​ A和B的连接条件

​ join

​ C

​ on

​ A和C的连接条件

​ right join

​ D

​ on

​ A和D的连接条件

​ …

一条SQL中,内连接与外连接可以混合使用。

​ 例1:找出每个员工的部门名和工资等级,要求显示员工名、部门名、薪资、薪资等级。

//已知
mysql> select * from emp;
+-------+--------+-----------+------+------------+---------+---------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL     | COMM    | DEPTNO |
+-------+--------+-----------+------+------------+---------+---------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |    NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |    NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |    NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |    NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 | 3000.00 |    NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000.00 |    NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-05-23 | 1100.00 |    NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |    NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |    NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |    NULL |     10 |
+-------+--------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)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)mysql> select * from salgrade;
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
|     1 |   700 |  1200 |
|     2 |  1201 |  1400 |
|     3 |  1401 |  2000 |
|     4 |  2001 |  3000 |
|     5 |  3001 |  9999 |
+-------+-------+-------+
5 rows in set (0.00 sec)//可得
mysql> select a.ename,d.deptno,a.sal,s.grade from emp a join dept d on a.deptno=d.deptno join salgrade s on a.sal>=s.losal and a.sal<=s.hisal;
+--------+--------+---------+-------+
| ename  | deptno | sal     | grade |
+--------+--------+---------+-------+
| SMITH  |     20 |  800.00 |     1 |
| ALLEN  |     30 | 1600.00 |     3 |
| WARD   |     30 | 1250.00 |     2 |
| JONES  |     20 | 2975.00 |     4 |
| MARTIN |     30 | 1250.00 |     2 |
| BLAKE  |     30 | 2850.00 |     4 |
| CLARK  |     10 | 2450.00 |     4 |
| SCOTT  |     20 | 3000.00 |     4 |
| KING   |     10 | 5000.00 |     5 |
| TURNER |     30 | 1500.00 |     3 |
| ADAMS  |     20 | 1100.00 |     1 |
| JAMES  |     30 |  950.00 |     1 |
| FORD   |     20 | 3000.00 |     4 |
| MILLER |     10 | 1300.00 |     2 |
+--------+--------+---------+-------+
14 rows in set (0.00 sec)

例2:找出每个员工的部门名、工资等级及上级领导,要求显示员工名、领导名、部门名、薪资、薪资等级。

mysql> select a.ename emplyee,b.ename leader,d.deptno partment,a.sal,s.grade from emp a left join emp b on a.mgr=b.empno join dept d on a.deptno=d.deptno join salgrade s on a.sal>=losal and a.sal<=hisal;
+---------+--------+----------+---------+-------+
| emplyee | leader | partment | sal     | grade |
+---------+--------+----------+---------+-------+
| SMITH   | FORD   |       20 |  800.00 |     1 |
| ALLEN   | BLAKE  |       30 | 1600.00 |     3 |
| WARD    | BLAKE  |       30 | 1250.00 |     2 |
| JONES   | KING   |       20 | 2975.00 |     4 |
| MARTIN  | BLAKE  |       30 | 1250.00 |     2 |
| BLAKE   | KING   |       30 | 2850.00 |     4 |
| CLARK   | KING   |       10 | 2450.00 |     4 |
| SCOTT   | JONES  |       20 | 3000.00 |     4 |
| KING    | NULL   |       10 | 5000.00 |     5 |
| TURNER  | BLAKE  |       30 | 1500.00 |     3 |
| ADAMS   | SCOTT  |       20 | 1100.00 |     1 |
| JAMES   | BLAKE  |       30 |  950.00 |     1 |
| FORD    | JONES  |       20 | 3000.00 |     4 |
| MILLER  | CLARK  |       10 | 1300.00 |     2 |
+---------+--------+----------+---------+-------+
14 rows in set (0.00 sec)

子查询

select语句中嵌套select语句,被嵌套的select语句被称为子查询。

子查询出现的地方

  • select
  • from
  • where

where子句中的子查询

​ 例:找出比最低工资高的员工姓名及工资。

mysql> select ename,sal from emp where sal>(select min(sal) from emp);
+--------+---------+
| ename  | sal     |
+--------+---------+
| ALLEN  | 1600.00 |
| WARD   | 1250.00 |
| JONES  | 2975.00 |
| MARTIN | 1250.00 |
| BLAKE  | 2850.00 |
| CLARK  | 2450.00 |
| SCOTT  | 3000.00 |
| KING   | 5000.00 |
| TURNER | 1500.00 |
| ADAMS  | 1100.00 |
| JAMES  |  950.00 |
| FORD   | 3000.00 |
| MILLER | 1300.00 |
+--------+---------+
13 rows in set (0.00 sec)

注意:子查询应用括号括起来,否则会报错。

from子句中的子查询

技巧:from后的子查询的查询结果可看成一张临时表

​ 例:找出每个岗位的平均工资的薪资等级。

mysql> select t.*,s.grade from (select job,avg(sal) avgsal from emp group by job) t join salgrade s on t.avgsal between s.losal and s.hisal;
+-----------+-------------+-------+
| job       | avgsal      | grade |
+-----------+-------------+-------+
| CLERK     | 1037.500000 |     1 |
| SALESMAN  | 1400.000000 |     2 |
| ANALYST   | 3000.000000 |     4 |
| MANAGER   | 2758.333333 |     4 |
| PRESIDENT | 5000.000000 |     5 |
+-----------+-------------+-------+
5 rows in set (0.00 sec)

select后的子查询(了解即可)

​ 例:找出每个员工的部门名称,要求显示员工名和部门名。

mysql> select e.ename,(select d.dname from dept d where e.deptno=d.deptno) dname from emp e;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

注意:对于select后的子查询,一次只能返回一条结果,多于一条就会报错。

合并查询结果集(union)

​ 例:查询工作岗位为MANAGER和SALESMAN的。

mysql> select ename,job from emp where job in ('manager','salesman');
+--------+----------+
| ename  | job      |
+--------+----------+
| ALLEN  | SALESMAN |
| WARD   | SALESMAN |
| JONES  | MANAGER  |
| MARTIN | SALESMAN |
| BLAKE  | MANAGER  |
| CLARK  | MANAGER  |
| TURNER | SALESMAN |
+--------+----------+
7 rows in set (0.01 sec)mysql> select ename,job from emp where job='manager' union select ename,job from emp where job='salesman';
+--------+----------+
| ename  | job      |
+--------+----------+
| JONES  | MANAGER  |
| BLAKE  | MANAGER  |
| CLARK  | MANAGER  |
| ALLEN  | SALESMAN |
| WARD   | SALESMAN |
| MARTIN | SALESMAN |
| TURNER | SALESMAN |
+--------+----------+
7 rows in set (0.00 sec)

​ union的效率要高一些,对于表连接来说,每连接一次新表,则匹配次数满足笛卡儿积。但union可以减少匹配的次数,在减少匹配次数的基础上还可以完成两个结果集的拼接。

​ 即,假设有a,b,c,其中各有10条记录。

​ 以表连接方式,a连接b连接c,则匹配次数为10*10*10=1000次。

​ 以union方式,a连接b union a连接c,则匹配结果为10*10+10*10=200次。

​ union把乘法变成了加法。

使用union的注意事项

  1. 两个结果集的列数相同。
  2. 结果集合并时列和列的数据类型也要相同。(MySQL可以,但Oracle语法严格,不行。)

limit

limit是将查询结果集的一部分取出来,通常用于分页查询中。

​ 分页的作用:提高用户体验,一次性全部查出,用户的体验感差,因此一页一页翻页看。如百度,一页显示10条记录。

​ 例:按照薪资降序排列,取出前五名员工。

mysql> select ename,sal from emp order by sal desc limit 5;
+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
| SCOTT | 3000.00 |
| FORD  | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
+-------+---------+
5 rows in set (0.00 sec)

用法

  1. 完整用法:limit startIndex,length //startIndex为起始下标,length为长度

  2. 缺省用法:limit n; //取前n个

    注意:(1)下标从0开始

    ​ (2)limit在order by之后执行

​ 例:取出工资排名在5-9名的员工。

mysql> select ename,sal from emp order by sal desc limit 4,5;
+--------+---------+
| ename  | sal     |
+--------+---------+
| BLAKE  | 2850.00 |
| CLARK  | 2450.00 |
| ALLEN  | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
+--------+---------+
5 rows in set (0.00 sec)

分页

技巧:对于每页显示pageSize条记录,有第pageNo页:limit (select pageNo-1)*pageSize,pageSize .

DQL语句大总结

语句

​ select

​ …

​ from

​ …

​ where

​ …

​ group by

​ …

​ order

​ …

​ limit

​ …

执行顺序

​ from—>where—>group by—>having—>select—>order by—>limit

表的创建(create table)

语法格式(DDL语句)

creat table 表名(字段名1 数据类型,字段2 数据类型,字段3 数据类型);

​ 表名:建议以t_或tbl_开始,可读性强。见名知意

​ 字段名:见名知意

​ 表名和字段名都属于标识符。

MySQL中常见的数据类型

  • varchar (最长255) 可变长度的字符串

    ​ 智能,节省空间,会根据实际的数据长度动态分配空间。

    ​ 优点:节省空间

    ​ 缺点:需要动态分配空间,速度慢

  • char (最长255) 定长字符串

    ​ 不论实际的数据长度是多少,只会分配固定长度的空间去存储数据。使用不当时会导致空间的浪费。

    ​ 优点:不需要动态分配空间,速度快

    ​ 缺点:使用不当会导致空间的浪费

​ varchar和char该如何选择?

​ 性别字段:固定长度,char

​ 姓名字段:长度不同,varchar

  • int (最长11) 数字中的整数型,等同于Java中的int

  • bigint 数字中的长整型,相当于Java中的long

  • float 单精度浮点型

  • double 双精度浮点型

  • date 短日期类型

  • datetime 长日期类型

  • clob 字符大对象,最多可存储4G的字符串。

    ​ 如存储一篇文章、存储一个说明等。

    ​ 超过255个字符的都要采用clob来存储。

  • blob 二进制大对象

    ​ 专门用来存储图片、声音、视频等流媒体数据。

    ​ 往blob类型的字段上插入数据时,如图片、视频等,需要使用IO流才可。

mysql>  create table t_student(num int,name varchar(32),sex char(1),age int(3),email varchar(255));
Query OK, 0 rows affected (0.01 sec)

表的删除(drop table)

drop table t_student;
Query OK, 0 rows affected (0.00 sec)mysql>  drop table if exists t_student;
Query OK, 0 rows affected (0.00 sec)

​ 对于第一种方法,若表不存在则回报错。而第二种即使表不存在也不会报错,故推荐使用第二种方法删除表。

往表中插入数据(insert)

DML语句

语法格式:insert into 表名(字段名1,字段名2,字段名3…) values(值1,值2,值3…);

​ 注意:字段名和值要一一对应,即数量和数据类型均要对应。

mysql> insert into t_student (num,name,sex,age,email) values ('20220615','zhangsan','m','56','zhangsan.163.com');
Query OK, 1 row affected (0.00 sec)mysql> select * from t_student;
+----------+----------+------+------+------------------+
| num      | name     | sex  | age  | email            |
+----------+----------+------+------+------------------+
| 20220615 | zhangsan | m    |   56 | zhangsan.163.com |
+----------+----------+------+------+------------------+
1 row in set (0.00 sec)

注意:

​ (1)插入的数据不能出现中文,否则会出现“?”

mysql> insert into t_student (num,name,sex,age,email) values ('20220615','张三','男','56','zhangsan.163.com');
Query OK, 1 row affected, 4 warnings (0.00 sec)mysql> select * from t_student;
+----------+------+------+------+------------------+
| num      | name | sex  | age  | email            |
+----------+------+------+------+------------------+
| 20220615 | ???? | ?    |   56 | zhangsan.163.com |
+----------+------+------+------+------------------+
1 row in set (0.00 sec)

​ (2)insert语句但凡是执行成功,那么必然会多出一条记录。如果没有给字段指定值,则默认为null。

​ (3)insert语句中的字段名可省略,但值要全部写上。但可读性差,不建议这样写。

指定默认值(default)

mysql>  create table t_student(num int,name varchar(32),sex char(1),age int(3),email varchar(255));
Query OK, 0 rows affected (0.01 sec)mysql> desc t_student;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| num   | int(11)      | YES  |     | NULL    |       |
| name  | varchar(32)  | YES  |     | NULL    |       |
| sex   | char(1)      | YES  |     | NULL    |       |
| age   | int(3)       | YES  |     | NULL    |       |
| email | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)mysql>  create table t_student(num int,name varchar(32),sex char(1) default 'm',age int(3),email varchar(255));
Query OK, 0 rows affected (0.01 sec)mysql> desc t_student;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| num   | int(11)      | YES  |     | NULL    |       |
| name  | varchar(32)  | YES  |     | NULL    |       |
| sex   | char(1)      | YES  |     | m       |       |
| age   | int(3)       | YES  |     | NULL    |       |
| email | varchar(255) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

数字格式化(format)

format(数字,’格式‘)

mysql> select ename,format(sal,'$999.999') as sal from emp;
+--------+-------+
| ename  | sal   |
+--------+-------+
| SMITH  | 800   |
| ALLEN  | 1,600 |
| WARD   | 1,250 |
| JONES  | 2,975 |
| MARTIN | 1,250 |
| BLAKE  | 2,850 |
| CLARK  | 2,450 |
| SCOTT  | 3,000 |
| KING   | 5,000 |
| TURNER | 1,500 |
| ADAMS  | 1,100 |
| JAMES  | 950   |
| FORD   | 3,000 |
| MILLER | 1,300 |
+--------+-------+
14 rows in set, 14 warnings (0.01 sec)

日期、字符串的相互转换

  1. str_to_date 将varchar类型的字符串转换成date类型

    语法格式:str_to date(’字符串日期‘,’日期格式‘)

    MySQL日期格式:

    ​ %Y 年

    ​ %m 月

    ​ %d 日

    ​ %h 时

    ​ %i 分

    ​ %s 秒

    mysql>  create table t_user(id int(8),name varchar(32),time date);
    Query OK, 0 rows affected (0.01 sec)mysql> insert into t_user(id,name,time) values(20220616,'zhangsan','2022-06-16');
    Query OK, 1 row affected (0.00 sec)mysql> select * from t_user;
    +----------+----------+------------+
    | id       | name     | time       |
    +----------+----------+------------+
    | 20220616 | zhangsan | 2022-06-16 |
    +----------+----------+------------+
    1 row in set (0.00 sec)mysql>  insert into t_user(id,name,time) values(20220509,'lisi',str_to_date('09-05-2022','%d-%m-%Y'));
    Query OK, 1 row affected (0.00 sec)mysql> select * from t_user;
    +----------+----------+------------+
    | id       | name     | time       |
    +----------+----------+------------+
    | 20220616 | zhangsan | 2022-06-16 |
    | 20220509 | lisi     | 2022-05-09 |
    +----------+----------+------------+
    2 rows in set (0.00 sec)
    

    ​ str_to_date函数可以把字符串vaechar转换成日期date类型数据,通常用于insert方面,因为插入时需要一个日期类型的数据,可通过该函数将字符串转换成date。

    注意:(1)若提供的日期字符串格式为“%Y-%m-%d”,则不需要str_to_date函数。

    ​ (2)以上语句进行了默认的日期格式化,即“%Y-%m-%d”。

    ​ (3)date及datetime不能指定长度。

  2. date_format 将date类型转换成具有一定格式的varchar字符串类型

    这个函数通常用于查询日期方面,可设置展示的日期格式。

    语法格式:date_format(’日期‘,’日期格式‘)

    mysql> select id,name,date_format(time,'%Y/%m/%d') as time from t_user;
    +----------+----------+------------+
    | id       | name     | time       |
    +----------+----------+------------+
    | 20220616 | zhangsan | 2022/06/16 |
    | 20220509 | lisi     | 2022/05/09 |
    +----------+----------+------------+
    2 rows in set (0.00 sec)
    

注意:数据库中有一条命名规范——所有标识符都是小写,单词与单词之间使用下划线进行分割

date和datetime的区别

date是短日期,只包括年月日信息; 默认:%Y-%m-%d

datetime是长日期,包括年月日时分秒信息。 默认:%Y-%m-%d %h:%i:%s

mysql>  create table t_user(id int(8),name varchar(32),birth date,creat_time datetime);
Query OK, 0 rows affected (0.01 sec)mysql>  insert into t_user (id,name,birth,creat_time) values (20251132,'wanwu','2025-11-23','2025-11-23 15:23:19');
Query OK, 1 row affected (0.00 sec)mysql>  insert into t_user (id,name,birth,creat_time) values (20251228,'zhaoliu','2025-12-28','2025-12-28 09:49:56');
Query OK, 1 row affected (0.00 sec)mysql>  insert into t_user (id,name,birth,creat_time) values (20220616,'liqi','2022-06-16',now());
Query OK, 1 row affected (0.00 sec)mysql>  select * from t_user;
+----------+---------+------------+---------------------+
| id       | name    | birth      | creat_time          |
+----------+---------+------------+---------------------+
| 20251132 | wanwu   | 2025-11-23 | 2025-11-23 15:23:19 |
| 20251228 | zhaoliu | 2025-12-28 | 2025-12-28 09:49:56 |
| 20220616 | liqi    | 2022-06-16 | 2022-06-16 15:58:29 |
+----------+---------+------------+---------------------+
3 rows in set (0.00 sec)

​ 在mysql中,可利用now()函数来获取系统的当前时间。并且其获取的时间带有年月日时分秒信息。

修改(update)

DML语句

语法格式:update 表名 set 字段名1=值1,字段名2=值2,字段名3=值3… where 条件;

​ 注意:没有条件限制会导致所有数据全部更新。

mysql>  select * from t_user;
+----------+---------+------------+---------------------+
| id       | name    | birth      | creat_time          |
+----------+---------+------------+---------------------+
| 20251132 | wanwu   | 2025-11-23 | 2025-11-23 15:23:19 |
| 20251228 | zhaoliu | 2025-12-28 | 2025-12-28 09:49:56 |
| 20220616 | liqi    | 2022-06-16 | 2022-06-16 15:58:29 |
+----------+---------+------------+---------------------+
3 rows in set (0.00 sec)mysql> update t_user set name='fanba' where id=20220616;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from t_user;
+----------+---------+------------+---------------------+
| id       | name    | birth      | creat_time          |
+----------+---------+------------+---------------------+
| 20251132 | wanwu   | 2025-11-23 | 2025-11-23 15:23:19 |
| 20251228 | zhaoliu | 2025-12-28 | 2025-12-28 09:49:56 |
| 20220616 | fanba   | 2022-06-16 | 2022-06-16 15:58:29 |
+----------+---------+------------+---------------------+
3 rows in set (0.00 sec)

删除数据(delete)

DML语句

语法格式:delete from 表名 where 条件;

注意:没有条件限制整张表会全部删除。

mysql> select * from t_user;
+----------+---------+------------+---------------------+
| id       | name    | birth      | creat_time          |
+----------+---------+------------+---------------------+
| 20251132 | wanwu   | 2025-11-23 | 2025-11-23 15:23:19 |
| 20251228 | zhaoliu | 2025-12-28 | 2025-12-28 09:49:56 |
| 20220616 | fanba   | 2022-06-16 | 2022-06-16 15:58:29 |
+----------+---------+------------+---------------------+
3 rows in set (0.00 sec)mysql> delete from t_user where id=20251132;
Query OK, 1 row affected (0.00 sec)mysql> select * from t_user;
+----------+---------+------------+---------------------+
| id       | name    | birth      | creat_time          |
+----------+---------+------------+---------------------+
| 20251228 | zhaoliu | 2025-12-28 | 2025-12-28 09:49:56 |
| 20220616 | fanba   | 2022-06-16 | 2022-06-16 15:58:29 |
+----------+---------+------------+---------------------+
2 rows in set (0.00 sec)mysql> delete from t_user;
Query OK, 2 rows affected (0.00 sec)mysql> select * from t_user;
Empty set (0.00 sec)

MySQL数据库学习笔记(2)相关推荐

  1. linux数据库创建score表,MySQL数据库学习笔记

    MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...

  2. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. 研一寒假MySQL数据库学习笔记(三)

    研一寒假MySQL数据库学习笔记(三) 本节记录数据库高级查询部分的内容,整理于此便于之后回顾. 1. 上一节补充内容 1.1 案例练习 现在有一个员工表.部门表,两张表之间是一个部门多个员工,一个员 ...

  5. 最新、最全、最详细的 MySQL 数据库学习笔记总结(2021最新版)

    数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统. DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 ...

  6. MySQL数据库学习笔记,知识点和案例整理,期末三天复习完【简单且详细】

    MySQL数据库近三万字学习笔记,超级详细! 文章目录 前言 一.day1 二.day2 三.day3 前言 MySQL数据库知识点和案例总结,非常详细,将近三万字!分成了三天去消化吸收! 一.day ...

  7. Mysql数据库学习笔记[完结]

    一.数据库 1.概述 数据库(database ,简称db)就是用来存储数据和管理数据的仓库 分类: 关系型数据库:指存放的数据之间是有紧密关系的 常见的有:Oracle.MySQL.SQLServe ...

  8. MySQL数据库 学习笔记 零基础入门 面试 整理

    一.MySQL基础篇 1. 数据库技术的基本概念和方法 1.1 数据库基本概念 1] 数据 数据(Data)指对客观事物进行描述并可以鉴别的符号,这些符号是可识别的.抽象的,不仅仅指狭义上的数字,而是 ...

  9. MySQL数据库-学习笔记

    一.MySQL课程内容 1.1 数据库介绍 数据库概念 术语介绍 1.2 MySQL数据库 下载.安装.配置.卸载 MySQL客户端工具的安装及使用 1.3 SQL 结构化查询语言 什么是SQL SQ ...

  10. MySQL数据库学习笔记

    MySQL常用语法总结 一.创建Web数据库 1.登陆到数据库 mysql -h hostname -u username -p mysql -h hostname -u username -D db ...

最新文章

  1. 搭建LVS_DR模型
  2. 仿微信未读RecyclerView平滑滚动定位效果
  3. 在一台超级计算机上,编号为1,2,…,n的n个作业等待批处理。批处理的任务就是将这n个作业分成若干批,每批包含相邻的若干作业。从时刻0开始,分批加工这些作业。在每批作业开始前,机器需要启动时间S,而完
  4. 从0到1写RT-Thread内核——支持多优先级
  5. 释放虚拟GPU力量 NVIDIA 加速企业远程办公生产力变革
  6. Flowable 数据库表结构 ACT_ID_INFO
  7. 转载:GCC 提供的原子操作
  8. C++ 推断进程是否存在
  9. linux常用的搜索命令
  10. svn取消文件夹图标_SVN文件夹或文件不显示图标解决方法
  11. 美区苹果id关闭双重认证_苹果帐号在双重认证的情况下被更改受信任手机号,导致帐号被锁,且无法解锁...
  12. b站up粉丝数量及变化爬取,并保存成txt文件
  13. 【UE4】如何获取/下载虚幻4(Unreal Engine4)源码
  14. java学习篇(一)---从网络下载图片
  15. 英雄联盟修改服务器封3年,LOL自定义也被封三年 竟然因为这个原因?
  16. Unity动画系统-配置Avatar
  17. Perl Learning 3 Subroutine
  18. 使用ActiveX实现的Web自定义查询-万能查询
  19. [2010年终大礼]破壳而出的琉璃之鸟 汉化补丁 第二版(win8兼容版发布)
  20. 大数据入门之分布式计算框架Spark(2) -- Spark SQL

热门文章

  1. Linux dirname命令
  2. 云管平台监控实践分享
  3. C语言 system函数
  4. 京东商品滞销怎么处理,如何一键清理?
  5. TS科普19 各种流(如:MP3、H264、H265等)在TS的流类型
  6. 【IMX6UL开发板试用体验】OpenWRT在iMX6UL上面的移植与编译
  7. hadoop之MapReduce学习教程
  8. 2-3 Coursera吴恩达《改善深度神经网络》第三周课程笔记-超参数调试、Batch正则化和编程框架
  9. DataStream API【1】
  10. matlab做胶州湾地图,青岛胶州湾跨海大桥为什么建在胶州湾最宽的地方?