MySQL数据库学习笔记(2)
把查询结果去除重复记录(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的注意事项
- 两个结果集的列数相同。
- 结果集合并时列和列的数据类型也要相同。(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)
用法
完整用法:limit startIndex,length //startIndex为起始下标,length为长度
缺省用法: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)
日期、字符串的相互转换
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不能指定长度。
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)相关推荐
- linux数据库创建score表,MySQL数据库学习笔记
MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 研一寒假MySQL数据库学习笔记(三)
研一寒假MySQL数据库学习笔记(三) 本节记录数据库高级查询部分的内容,整理于此便于之后回顾. 1. 上一节补充内容 1.1 案例练习 现在有一个员工表.部门表,两张表之间是一个部门多个员工,一个员 ...
- 最新、最全、最详细的 MySQL 数据库学习笔记总结(2021最新版)
数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统. DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 ...
- MySQL数据库学习笔记,知识点和案例整理,期末三天复习完【简单且详细】
MySQL数据库近三万字学习笔记,超级详细! 文章目录 前言 一.day1 二.day2 三.day3 前言 MySQL数据库知识点和案例总结,非常详细,将近三万字!分成了三天去消化吸收! 一.day ...
- Mysql数据库学习笔记[完结]
一.数据库 1.概述 数据库(database ,简称db)就是用来存储数据和管理数据的仓库 分类: 关系型数据库:指存放的数据之间是有紧密关系的 常见的有:Oracle.MySQL.SQLServe ...
- MySQL数据库 学习笔记 零基础入门 面试 整理
一.MySQL基础篇 1. 数据库技术的基本概念和方法 1.1 数据库基本概念 1] 数据 数据(Data)指对客观事物进行描述并可以鉴别的符号,这些符号是可识别的.抽象的,不仅仅指狭义上的数字,而是 ...
- MySQL数据库-学习笔记
一.MySQL课程内容 1.1 数据库介绍 数据库概念 术语介绍 1.2 MySQL数据库 下载.安装.配置.卸载 MySQL客户端工具的安装及使用 1.3 SQL 结构化查询语言 什么是SQL SQ ...
- MySQL数据库学习笔记
MySQL常用语法总结 一.创建Web数据库 1.登陆到数据库 mysql -h hostname -u username -p mysql -h hostname -u username -D db ...
最新文章
- 搭建LVS_DR模型
- 仿微信未读RecyclerView平滑滚动定位效果
- 在一台超级计算机上,编号为1,2,…,n的n个作业等待批处理。批处理的任务就是将这n个作业分成若干批,每批包含相邻的若干作业。从时刻0开始,分批加工这些作业。在每批作业开始前,机器需要启动时间S,而完
- 从0到1写RT-Thread内核——支持多优先级
- 释放虚拟GPU力量 NVIDIA 加速企业远程办公生产力变革
- Flowable 数据库表结构 ACT_ID_INFO
- 转载:GCC 提供的原子操作
- C++ 推断进程是否存在
- linux常用的搜索命令
- svn取消文件夹图标_SVN文件夹或文件不显示图标解决方法
- 美区苹果id关闭双重认证_苹果帐号在双重认证的情况下被更改受信任手机号,导致帐号被锁,且无法解锁...
- b站up粉丝数量及变化爬取,并保存成txt文件
- 【UE4】如何获取/下载虚幻4(Unreal Engine4)源码
- java学习篇(一)---从网络下载图片
- 英雄联盟修改服务器封3年,LOL自定义也被封三年 竟然因为这个原因?
- Unity动画系统-配置Avatar
- Perl Learning 3 Subroutine
- 使用ActiveX实现的Web自定义查询-万能查询
- [2010年终大礼]破壳而出的琉璃之鸟 汉化补丁 第二版(win8兼容版发布)
- 大数据入门之分布式计算框架Spark(2) -- Spark SQL