MySQL第二天笔记

1、关于查询结果的去重?


mysql> select distinct job from emp;//distinct关键字,去除重复记录
+-----------+
| job       |
+-----------+
| CLERK     |
| SALESMAN  |
| MANAGER   |
| ANALYST   |
| PRESIDENT |
+-----------+

mysql> select ename, distinct job from emp;
以上的sql语句是错误的。
记住:distinct只能出现在所有字段的最前面。

mysql> select distinct deptno ,job from emp;
+--------+-----------+
| deptno | job       |
+--------+-----------+
|     20 | CLERK     |
|     30 | SALESMAN  |
|     20 | MANAGER   |
|     30 | MANAGER   |
|     10 | MANAGER   |
|     20 | ANALYST   |
|     10 | PRESIDENT |
|     30 | CLERK     |
|     10 | CLERK     |
+--------+-----------+

案例:统计岗位的数量?
mysql> select count(distinct job) from emp;
+---------------------+
| count(distinct job) |
+---------------------+
|                   5 |
+---------------------+

2、连接查询

2.1、什么是连接查询?

在实际开发中,大部分的情况下都不是从单表中查询数据,一般都是多张表联合查询取出最终的结果。

在实际开发中,一般一个业务都会对应多张表,比如:学生和班级,起码两张表。

stuno    stuname    classno    classname
-------------------------------------------
  1	       zs	      1班   	 高三2班
  2	       ls	      1班	     高三2班

学生和班级信息存储到一张表中,结果就像上面一样,数据会存在大量的重复,导致数据的冗余。

2.2、连接查询的分类?

根据语法出现的年代来划分,包括:
SQL92:(一些老的DBA还在使用这种语法,DBA:DataBase Administrator,数据库管理员)
SQL99:(比较新的语法)

根据表的连接方式来划分,包括:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接(这个不讲,很少用!)

2.3、在表的连接查询方面有一种现象被称为:笛卡尔积现象。
 案例:找出每一个员工的部门名称,要求显示员工名和部门名。

EMP表
+--------+--------+
| ename  | deptno |
+--------+--------+
| SMITH  |     20 |
| ALLEN  |     30 |
| WARD   |     30 |
| JONES  |     20 |
| MARTIN |     30 |
| BLAKE  |     30 |
| CLARK  |     10 |
| SCOTT  |     20 |
| KING   |     10 |
| TURNER |     30 |
| ADAMS  |     20 |
| JAMES  |     30 |
| FORD   |     20 |
| MILLER |     10 |
+--------+--------+
DEPT表
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

mysql> select ename,dname from emp,dept;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | ACCOUNTING |
| SMITH  | RESEARCH   |
| SMITH  | SALES      |
| SMITH  | OPERATIONS |
| ALLEN  | ACCOUNTING |
| ALLEN  | RESEARCH   |
| ALLEN  | SALES      |
| ALLEN  | OPERATIONS |
| WARD   | ACCOUNTING |
.....
56 rows in set (0.00 sec)

笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是
两张表记录条数的乘积。

关于表的别名:
select e.ename,d.dname from emp e,dept d;
表的别名有什么好处?
第一:执行效率高。
第二:可读性好。

2.4、怎么避免笛卡尔积现象?

当然是进行条件过滤。
思考:避免了笛卡尔积现象,会减少记录的匹配次数吗?
不会,次数还是56次。只不过显示的是有效记录。

案例:找出每一个员工的部门名称,要求显示员工名和部门名。
     select
	e.ename,d.dname
     from
	emp e,dept d
     where
	e.deptno = d.deptno;//SQL92,以后不用。
	+--------+------------+
	| 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      |
	+--------+------------+
2.5、内连接之等值连接

最大的特点是:条件是等量关系。

案例:查询每个员工的部门名称,要求显示员工名和部门名。
 
 SQL92:(太老了,基本不用了)
     select
	e.ename,d.dname
     from
	emp e,dept d
     where
	e.deptno = d.deptno;
 SQL99:(常用的)
     select
	e.ename,d.dname
     from
	emp e
     join
	dept d
     on
	e.deptno = d.deptno;
  
  语法:
     select
	...
     from
	...A
     join
	...B
     on
	连接条件
     where
	...

SQL99的结构更清晰一些:表的连接条件和后来的where条件分离了。

2.6、内连接之非等值连接

最大的特点是:连接条件中的关系是非等量关系。

案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。
	select
		e.ename,e.sal,s.grade
	from
		emp e
	inner join //inner可以省略
		salgrade s
	on
		e.sal>=s.losal and e.sal<=s.hisal;
		(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 |
	+--------+---------+-------+
2.7、自连接

最大的特点是:一张表看作两张表,自己连接自己。

案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
	
	select
		e1.ename ,e2.ename as mgrname
	from
		emp e1
	join
		emp e2
	on
		e1.mgr = e2.empno;(这里自己写的无法显示KING)
	+--------+---------+
	| ename  | mgrname |
	+--------+---------+
	| 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   |
	+--------+---------+
2.8、外连接

什么是外连接?和内连接有什么区别?

内连接:
假设A和B表进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的。
外连接:
假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要是查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。

外连接的分类?
左外连接(左连接):表示左边那张表是主表。
右外连接(右连接):表示右边那张表是主表。

左连接有右连接的写法,右连接也会有对应左连接的写法。

案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
	
	select(内连接之自连接)
		e1.ename ,e2.ename as mgrname
	from
		emp e1
	inner join
		emp e2
	on
		e1.mgr = e2.empno;(这里自己写的无法显示KING)
	+--------+---------+
	| ename  | mgrname |
	+--------+---------+
	| 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   |
	+--------+---------+

	内连接无法显示KING
	外连接:
	select 
		e1.ename as '员工',e2.ename as '领导'
	from
		emp e1
	left outer join 
		emp e2
	on
		e1.mgr = e2.empno;
	+--------+-------+
	| 员工   | 领导	 |
	+--------+-------+
	| 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 |
	+--------+-------+

外连接最重要的特点是:主表的数据无条件的全部查询出来。

案例:找出哪个部门没有员工?
select
	d.*
from
	emp e
right join
	dept d
on
	e.deptno = d.deptno
where
	e.deptno is null;
+--------+------------+--------+
| DEPTNO | DNAME      | LOC    |
+--------+------------+--------+
|     40 | OPERATIONS | BOSTON |
+--------+------------+--------+
select d.deptno
from emp e
right join dept d
on e.deptno = d.deptno
where e.ename is null;
2.9、三张表怎么连接查询?
案例:找出每一个员工的部门名称以及工资等级。
	select 
		e.ename,d.dname,s.grade
	from 
		emp e
	join 
		dept d
	on
		e.deptno = d.deptno 
	join
		salgrade s
	on
		e.sal between losal and hisal;
	+--------+------------+-------+
	| ename  | dname      | grade |
	+--------+------------+-------+
	| SMITH  | RESEARCH   |     1 |
	| ALLEN  | SALES      |     3 |
	| WARD   | SALES      |     2 |
	| JONES  | RESEARCH   |     4 |
	| MARTIN | SALES      |     2 |
	| BLAKE  | SALES      |     4 |
	| CLARK  | ACCOUNTING |     4 |
	| SCOTT  | RESEARCH   |     4 |
	| KING   | ACCOUNTING |     5 |
	| TURNER | SALES      |     3 |
	| ADAMS  | RESEARCH   |     1 |
	| JAMES  | SALES      |     1 |
	| FORD   | RESEARCH   |     4 |
	| MILLER | ACCOUNTING |     2 |
	+--------+------------+-------+
案例:找出每一个员工的部门名称、工资等级以及上级领导。
	select 
		e1.ename,d.dname,s.grade,e2.ename
	from
		emp e1
	join
		dept d
	on
		e1.deptno = d.deptno
	join
		salgrade s
	on
		e1.sal between s.losal and s.hisal
	left join
		emp e2
	on
		e1.mgr = e2.empno;
	+--------+------------+-------+-------+
	| ename  | dname      | grade | ename |
	+--------+------------+-------+-------+
	| SMITH  | RESEARCH   |     1 | FORD  |
	| ALLEN  | SALES      |     3 | BLAKE |
	| WARD   | SALES      |     2 | BLAKE |
	| JONES  | RESEARCH   |     4 | KING  |
	| MARTIN | SALES      |     2 | BLAKE |
	| BLAKE  | SALES      |     4 | KING  |
	| CLARK  | ACCOUNTING |     4 | KING  |
	| SCOTT  | RESEARCH   |     4 | JONES |
	| KING   | ACCOUNTING |     5 | NULL  |
	| TURNER | SALES      |     3 | BLAKE |
	| ADAMS  | RESEARCH   |     1 | SCOTT |
	| JAMES  | SALES      |     1 | BLAKE |
	| FORD   | RESEARCH   |     4 | JONES |
	| MILLER | ACCOUNTING |     2 | CLARK |
	+--------+------------+-------+-------+

3、子查询

3.1、什么是子查询?子查询都可以出现在哪里?

select语句当中嵌套select语句,被嵌套的select语句是子查询。
子查询都可以出现在哪里?

select
	..(select).
from
	..(select).
where
	..(select).
3.2、where子句中使用子查询
案例:找出高于平均薪资的员工信息。
	
	第一步:找出平均薪资:
	select avg(sal) from emp;
	+-------------+
	| avg(sal)    |
	+-------------+
	| 2073.214286 |
	+-------------+

	第二步:where过滤
	select
		ename,sal
	from
		emp
	where
		sal>(select avg(sal) from emp);
	+-------+---------+
	| ename | sal     |
	+-------+---------+
	| JONES | 2975.00 |
	| BLAKE | 2850.00 |
	| CLARK | 2450.00 |
	| SCOTT | 3000.00 |
	| KING  | 5000.00 |
	| FORD  | 3000.00 |
	+-------+---------+

3.3、from子句中使用子查询

案例:找出每个部门平均薪资的薪资等级。

 第一步:找出每个部门的平均薪资
 mysql> select deptno,avg(sal) as avgsal from emp group by deptno;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     10 | 2916.666667 |
|     20 | 2175.000000 |
|     30 | 1566.666667 |
+--------+-------------+
 第二步:
select 
	t.*,s.grade
from 
	(select deptno,avg(sal) as avgsal from emp group by deptno) t
join
	salgrade s
on
	t.avgsal between losal and hisal;
+--------+-------------+-------+
| deptno | avgsal      | grade |
+--------+-------------+-------+
|     30 | 1566.666667 |     3 |
|     10 | 2916.666667 |     4 |
|     20 | 2175.000000 |     4 |
+--------+-------------+-------+

案例:找出每个部门平均的薪资等级。

第一步:找出每个人的等级,(按照部门排序)-->可省略(我只是为了直观看)
select 
	e.ename,e.sal,e.deptno,s.grade
from
	emp e
join
	salgrade s
on
	e.sal between s.losal and s.hisal
order by
	e.deptno;
+--------+---------+--------+-------+
| ename  | sal     | deptno | grade |
+--------+---------+--------+-------+
| KING   | 5000.00 |     10 |     5 |
| MILLER | 1300.00 |     10 |     2 |
| CLARK  | 2450.00 |     10 |     4 |
| SCOTT  | 3000.00 |     20 |     4 |
| FORD   | 3000.00 |     20 |     4 |
| JONES  | 2975.00 |     20 |     4 |
| SMITH  |  800.00 |     20 |     1 |
| ADAMS  | 1100.00 |     20 |     1 |
| WARD   | 1250.00 |     30 |     2 |
| MARTIN | 1250.00 |     30 |     2 |
| TURNER | 1500.00 |     30 |     3 |
| BLAKE  | 2850.00 |     30 |     4 |
| ALLEN  | 1600.00 |     30 |     3 |
| JAMES  |  950.00 |     30 |     1 |
+--------+---------+--------+-------+

第二步:找出平均等级并按照deptno分组。
select 
	e.deptno,avg(grade) as avggrade
from
	emp e
join
	salgrade s
on
	e.sal between s.losal and s.hisal
group by
	deptno;
+--------+----------+
| deptno | avggrade |
+--------+----------+
|     10 |   3.6667 |
|     20 |   2.8000 |
|     30 |   2.5000 |
+--------+----------+
3.4、在select后面嵌套子查询。
案例:找出每个员工所在的部门名称,要求显示员工名和部门名。
	select --------------------->(这个是连接查询)
		e.ename,d.dname
	from 
		emp e
	join
		dept d
	on
		e.deptno =	d.deptno;

	select
		e.ename,(select d.dname from dept where e.deptno = d.deptno) as dname
	from
		emp e;
	+--------+------------+
	| 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      |
	+--------+------------+

4、union(可以将查询结果集相加)

案例:找出工作岗位是SALESMAN和MANAGER的员工?
第一种:select ename,job from emp where job = 'salesman' or job = 'manager';
第二种:select ename,job from emp where job in('salesman','manager');
+--------+----------+
| ename  | job      |
+--------+----------+
| ALLEN  | SALESMAN |
| WARD   | SALESMAN |
| JONES  | MANAGER  |
| MARTIN | SALESMAN |
| BLAKE  | MANAGER  |
| CLARK  | MANAGER  |
| TURNER | SALESMAN |
+--------+----------+
(可以将两个不相干的查询结果拼接在一起)
第三种:select ename,job from emp where job = 'MANAGER'
	union
	select ename,job from emp where job = 'SALESMAN';

5、limit(重点中的重点,以后分页查询全靠它了!!!!)

5.1、limit是MySQL特有的,其他数据库没有,不通用。(Oracle中有一个相同的机制,叫做rownum)
5.2、limit取结果集中的部分数据,这是它的作用。
5.3、语法机制:

limit startindex,length
startindex 表示起始位置
length表示取几个

案例:取出工资前5名的员工。

mysql> select ename,sal from emp order by sal desc;
取前5个:
	mysql> select ename,sal from emp order by sal desc limit 5 ;
	mysql> select ename,sal from emp order by sal desc limit 0,5 ;
+-------+---------+
| ename | sal     |
+-------+---------+
| KING  | 5000.00 |
| SCOTT | 3000.00 |
| FORD  | 3000.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
+-------+---------+
5.4、limit是sql语句最后执行的一个环节:
  select		5
	...
   from			1
	...
   where		2
	...
   group by		3
	...
   having		4
	...
   order by		6
	...
   limit		7
	startindex,length;
5.5、案例:找出工资排名在第4到第9名的员工?
select
	ename,sal
from
	emp
order by 
	sal desc
limit
	3,6;
+--------+---------+
| ename  | sal     |
+--------+---------+
| JONES  | 2975.00 |
| BLAKE  | 2850.00 |
| CLARK  | 2450.00 |
| ALLEN  | 1600.00 |
| TURNER | 1500.00 |
| MILLER | 1300.00 |
+--------+---------+
5.6、通用的标准分页sql?

每页显示3条记录:
第1页:0,3
第2页:3,3
第3页:6,3
第4页:9,3
第5页:12,3

每页显示pageSize条记录:
第pageNo页:(pageNo-1) * pageSize,pageSize;

pageSize是什么?每页显示多少条记录
pageNo是什么?显示第几页

java代码{
int pageSize = 10;
int pageNo = 2;
limit (2-1) * 10 , 10;
}

6、创建表

建表的语法格式:
create table 表名{
字段名1 数据类型;
字段名2 数据类型;
字段名3 数据类型;
字段名4 数据类型;

};

关于MySQL当中字段的数据类型?以下只说常见的
int 整数型(相当于Java中的int)
bigint 长整数型(相当于Java中的long)
float 浮点型(相当于Java中的float double)
char 字符串(相当于Java中的String)
varchar 可变长字符串(相当于Java中的StringBuffer/StringBuilder)
date 日期类型(对应Java中的java.sql.Date类型)
BLOB 二进制大对象(存储图片、视频等流媒体信息)
Binary Large OBject(相当于Java中的Object)
CLOB 字符大对象(存储较大文本,可以存4G的字符串)
Character Large OBject(相当于Java中的Object)

BLOB和CLOB类型的使用?
    电影表:t_movie
    id(int)	name(varchar)	playtime(char/date)	haibao(BLOB)	background(CLOB)
    ------------------------------------------------------------------------------------
      1		哪吒之魔童降世
      2		误杀
      3		流浪地球

创建学生表:
    学生信息包括:
	学号、姓名、性别、班级编号、生日
	学号:bigint
	姓名:varchar
	性别:char
	班级编号:char/int
	生日:char/date
	create table t_student(
		stuno bigint,
		name varchar(255),
		sex char(1),
		clsno varchar(255),
		birth char(10)
	);---------->注意是小括号!!!!!!

7、insert语句插入数据

语法格式:
insert into 表名(字段1,字段2,字段3,…) values(值1,值2,值3,…);
要求:字段的数量和值的数量相同,b并且数据类型要对应相同。

insert into t_student (stuno,name,sex,clsno,birth) values(1,'jack','B','class01','1998-05-20');

	//可以只写部分字段,其他没有赋值默认为NULL
	insert into t_student (stuno,name,sex) values(2,'rose','G');
	
	//可以打乱顺序写,只要字段和值对应就行
	insert into t_student(name,birth,stuno,clsno) values('Tom','1999-02-02',4,'class03');
	//只要插入了,就不可以再insert条数据了,只能改

	//删表
	drop table if exists t_student;
	create table t_student(
		stuno bigint,
		name varchar(255),
		sex char(1) default 'G',
		clsno varchar(255),
		birth char(10)
		);

	//字段可以省略不写,但是后面的value对数量和顺序都有要求。
	insert into t_student values(2,'jerry','M','class02','1998-06-12');

	//一次插入多行数据
	insert into t_student values(2,'jack','G','class03','1945-06-02'),
	(2,'mary','G','class02','1946-06-02');

8、表的复制

//复制整张表
create table emp2 as select * from emp;
//复制一部分表
create table emp3 as select ename,sal from emp;

9、将查询结果插入到一张表中?

create table dept1 as select * from dept;
insert into dept1 select * from dept;
select * from dept1;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+

10、修改数据:update

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

注意:没有条件的话,默认整张表数据全部更新。

案例:将部门10的LOC修改为SHANGHAI,将部门名称修改为RENSHIBU。
mysql> update dept1 set dname = 'RENSHIBU', loc='SHANGHAI' where deptno = 10;
mysql> select * from dept1;
+--------+------------+----------+
| DEPTNO | DNAME      | LOC      |
+--------+------------+----------+
|     10 | RENSHIBU   | shanghai |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
|     10 | RENSHIBU   | shanghai |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
更新全部数据
mysql> update dept1 set dname='x', loc='y';
mysql> select * from dept1;
+--------+-------+------+
| DEPTNO | DNAME | LOC  |
+--------+-------+------+
|     10 | x     | y    |
|     20 | x     | y    |
|     30 | x     | y    |
|     40 | x     | y    |
|     10 | x     | y    |
|     20 | x     | y    |
|     30 | x     | y    |
|     40 | x     | y    |
+--------+-------+------+

11、删除数据?
语法格式:
delete from 表名 where 条件;

注意:没用条件默认全部删除。

案例:删除10部门的数据?
mysql> delete from dept1 where deptno = 10;

删除所有记录?
delete from dept1 ;

怎么删除大表?(重点)
truncate table 表明; //表被截断,不可回滚,永久丢失。	

12、对于表结构的修改,使用工具完成即可。

因为在实际开发中表一旦设计好之后,对表结构的修改是很少的,修改表结构就是对之前的设计进行了否定,即使需要修改表结构,我们也可以直接使用工具操作,修改表结构的语句不会出现在Java代码中,出现在Java代码中的sql包括:
insert delete update select(这些都是对表中的数据操作。)

增删改查有一个术语:CRUD操作。
Create(增) Retrieve(检索) Update(修改) Delete(删除)

13、约束(Constraint)

13.1、什么是约束?常见的约束有哪些?

在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中的数据的合法性、有效性、完整性。
常见的约束有哪些呢?
非空约束(not null):结束的字段不能为NULL
唯一性约束(unique):结束的字段不能重复
主键约束(primary key):结束的字段既不能为NULL,也不能重复。
外键约束(foreign key):…
检查约束(check):注意Oracle数据库有check约束,但是MySQL没有,目前MySQL不支持该约束。

13.2、非空约束:not null
create table t_user(id int, username varchar(255) not null ,password varchar(255));

insert into t_user(id,password) values(1,'123');
ERROR 1364 (HY000): Field 'username' doesn't have a default value

insert into t_user(id,username,password) values(1,'zhangsan','123');
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    1 | zhangsan | 123      |
+------+----------+----------+
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值