MySQL数据库:SQL语言入门 (学习笔记)

SQL(Structured Query Language)是结构化查询语言的简称,它是一种数据库查询和程序设计语言,同时也是目前使用最广泛的关系型数据库操作语言。(95%适用于所有关系型数据库) 【 SQL是关系型数据库通用的操作语言】

在数据库管理系统中,使用SQL语言来实现数据的存取、查询、更新等功能。SQL是一种非过程化语言,只需提出“做什么”,而不需要指明“怎么做”。

SQL语言具有集数据查询、数据操纵、数据定义和数据控制功能于一体,类似自然语言、简单易用以及非过程化等特点,

数据库管理人员(DBA)通过数据库管理系统(DBMS)可以对数据库(DB)中的数据进行操作,

(分页查询语句不同)
MySQL:  limit ?, ?
orcale: top 5 where 

  • 介绍MySQL数据库

mysql是一款开放源码,轻量级的关系型数据库
具有体积小,数据快,成本低,开放源码等特点
使用sql语言对数据库进行管理


一,SQL语言组成部分(5)

DQL* 数据的查询语言:查询语句的6个组成部分

DML* 数据的操作语言:insert delete update  

DDL 数据的定义语言:(了解)创建/删除/修改 数据库对象

DCL 数据的控制语言:(了解)授予,撤回 

TCL* 事务的控制语言:提交,回滚  

1,DQL —— 数据查询语言(Data Query Language)

           主要用于数据的查询,其基本结构是使用 select 子句,from 子句和 where 子句的组合来查询一条或多条数据。

(1)组成结构

select  字段名,字段名,字段名,

from  表名,表名,表名

where  条件  and/or 条件 and/or 条件 ———— 【分组前条件判断】

group by  字段名,字段名,字段名————【分组】

having  条件  and/or  条件  and/or  字段名————【分组后条件判断】

order  by 字段名,字段名,字段名————【排序】

【select 语句的执行顺序】
from--where -- group  by–  select   -  having-   order  by

(2)单表查询

【1】介绍 select 部分

===查指定的部位(与表内数据的顺序不关)

 select ename,empno from emp

===查表内全部数据 

 select * from emp

===别名——as

      ----- 真实案例 :实体类 属性名写错了;   多表查询的时候

           ---改名--》deptno改成eptno

select empno,ename,job,deptno as eptno from emp

      ----- 真实案例 开发组 每周会议

           ---写别名  as可以省略

           --- '  '  可加可不加,如果别名类里面有特殊符号或者空格  必须用!!!

select empno 员工编号,ename 员工姓名,job 岗位名称,deptno as '部门编号' from emp
===简单的算术运算

       ----- 查询表里所有员工的年薪是多少?  (忽视了奖金,流程函数处补全)

              ---空值做任何运算结果都为空!!!

select sal*12 年薪,ename,comm from emp
===去重操作   

去重关键字  distinct

       ----- 查询员工都在哪几个部门工作?

select distinct deptno from emp 
select distinct job,deptno from emp; -- 对后面的所有列组合 去重 ,而不是单独的某一列去重
===介绍 order by

默认情况下是按照升序排列的

 asc---升序 (可以默认不写)
desc---降序

select * from emp order by sal; -- 默认情况下是按照升序排列的
select * from emp order by sal asc; -- asc 升序,可以默认不写
select * from emp order by sal desc; -- desc 降序
select * from emp order by sal asc ,deptno desc; -- 在工资升序的情况下,deptno按照降序排列select deptno,count(*) num
from emp
where year(hiredate)=1981
GROUP BY deptno        
order by num,deptno desc

【2】介绍  where  部分

将过滤条件放在where子句的后面,可以筛选/过滤出我们想要的符合条件的数据:

===关系运算符 

= , > ,<  ,>= ,<= ,!= ,<>  (最后两个都是  不等于)

      -----查询入职时间在1981年的所有员工信息

 select * from emp where hiredate>='1981-1-1' and hiredate<='1981-12-31'

      -----查寻部门编号不是30的所有员工信息

select * from emp where deptno!=30

      -----查询工资范围在1000--2000的所有员工信息

select * from emp where sal>1000 and sal<2000

      -----查询经理编号是7321的所有员工信息

select * from emp where mgr=7321
===逻辑运算符   

and  &&     or  | |        in———替换 or

      -----查寻部门编号是10或者20的所有员工信息  

select * from emp where deptno=10 or deptno=20
select * from emp where deptno in (10,20)
===空值判断

       ..... where is null    ————为空
       ..... where is not null ————不为空

      -----查询没有奖金的所有员工信息

select * from emp where comm is null 
===模糊查询     

% :0~n位任意字符    ;   _  :1位任意字符

       ----- 查询名字第三位是a的

 select * from emp where ename like '__a%'

       ----- 查询员工姓名里以A开头的员工信息

select * from emp where ename like 'A%'

       ----- 查询岗位名称里,带A或者带C的员工信息

select * from emp where job like '%A%' or '%C%'

       ----- 查询 没有奖金,不是20号部门 ,名字里没有A的员工信息

select * from emp where comm is null and deptno!=30 and ename not like '%A%'
===小括号的使用

因为不同的运算符的优先级别不同,加括号为了可读性

select * from emp where job = 'SALESMAN' or job = 'CLERK' and sal >=1500; -- 先and再or  and > or
select * from emp where job = 'SALESMAN' or (job = 'CLERK' and sal >=1500); 
select * from emp where (job = 'SALESMAN' or job = 'CLERK') and sal >=1500;
【3】函数
  • 函数只是对查询结果中的数据进行处理,不会改变数据库中数据表的值。
  • 使用函数可以大大提高SELECT语句操作数据库的能力,同时也给数据的转换和处理提供了方便。 (在sql中使用函数)
  • 函数的功能:封装了特定的一些功能,我们直接拿过来使用,可以实现对应的功能
  • 函数作用:为了提高select的能力
===分类:   

    单行函数  (进去一条数据,出来一条数据)

    多行函数/分组函数/聚合函数(进去一组数据,出来一条数据)

  • 除了多行函数(max,min,count,sum,avg),都是单行函数
===单行函数
      ----- 字符串函数

              拼接:concat(str1,str2,。。。strn)

                       ---查询所有  部门编号员工编号员工姓名  的员工信息

select concat(deptno,'_',empno,'_',ename) from emp  

             添加:insert(str,index,n,newstr)

                       ---查询所有 长春吉软_员工姓名 的员工信息

select ename,insert(ename,1,0,'长春吉软_') from emp

             总长度:length(str)

                       ---查询所有 员工姓名长度 大于5位的

select * from emp where length(ename)>5
-- 仅查询了 字节数和员工姓名
select length(ename),ename from emp where length(ename)>5

             替换:replace(str,oldstr,newstr)

              获取:substring(str,index,n)

                       ---查询所有  员工姓名(保留第一位和最后一位字母,中间用。。。代替)

 SELECT REPLACE(ename,substring(ename,2,length(ename)-2),'...') FROM emp
-- 拼接和获取
SELECT CONCAT(substring(ename,1,1),'...',substring(ename,length(ename),1)) FROM emp;
字符串函数
函数  描述 
concat(str1,str2,···strn) 将str1、str2···strn拼接成一个新的字符串 
insert(str,index,n,newstr) 将字符串str从第index位置开始的n个字符替换成字符串newstr  
length(str)获取字符串str的长度  
lower(str)  将字符串str中的每个字符转换为小写  
  upper(str)将字符串str中的每个字符转换为大写  
left(str, n)   获取字符串str最左边的n个字符  
 right(str, n) 获取字符串str最右边的n个字符  
lpad(str, n,  pad)   使用字符串pad在str的最左边进行填充,直到长度为n个字符为止  
rpad(str, n,  pad 使用字符串pad在str的最右边进行填充,直到长度为n个字符为止  
 ltrim(str) 去除字符串str左侧的空格  
 rtrim(str)  去除字符串str右侧的空格  
 trim(str)  去除字符串str左右两侧的空格
replace(str,oldstr,newstr)  用字符串newstr替换字符串str中所有的子字符串oldstr  
reverse(str) 将字符串str中的字符逆序  
strcmp(str1, str2)  比较字符串str1和str2的大小  
substring(str,index,n)获取从字符串str的index位置开始的n个字符  
数值函数
函数  描述  
  ABS(num)   返回num的绝对值  
 CEIL(num)  返回大于num的最小整数(向上取整)  
  FLOOR(num)   返回小于num的最大整数(向下取整)  
 MOD(num1, num2)   返回num1/num2的余数(取模)  
  PI()   返回圆周率的值  

POW(num,n)

POWER(num, n)  

返回num的n次方 
  RAND(num)返回0~1之间的随机数  
 ROUND(num, n)  返回x四舍五入后的值,该值保留到小数点后n位 
TRUNCATE(num, n) 返回num被舍去至小数点后n位的值 

      ----- 日期时间函数

dual ---虚拟表

       ----- 房租一个月后到期,问到期时间?

select ADDDATE(NOW(),INTERVAL 1 MONTH) from dual

       ----- 查询所有员工试用期通过的时间

select  ename,ADDDATE(hiredate,INTERVAL 3 MONTH) from emp

       ----- 查询所有员工里工龄超过20年的所有员工

select * from emp where (DATEDIFF(NOW(),hiredate)/365)>20
select * from EMP WHERE SUBDATE(Now(), INTERVAL 20 YEAR) > hiredate  -- 减
select * from emp where adddate(hiredate,interval 20 year)<now()   -- 加

       ----- 查询所有员工,在1981年9月份入职的所有员工

select * from emp where year(hiredate) = 1981 and month(hiredate) = 9

       -----查询入职时间超100天的所有员工

select DATEDIFF(NOW(),hiredate) from emp where DATEDIFF(NOW(),hiredate)>100

                                        时间与日期函数 

 

      ----- 流程函数

             ----- 查询表里所有员工的年薪是多少?

select sal*12+ IFNULL(comm,0) 年薪 from emp

              ----- 查询所有员工编号,姓名,以及所在的部门名称(单表查询)

select empno,ename, 
case deptno when 10 then '开发部'when 20 then '测试部'when 30 then '运维部'when 40 then '实施部'else '最后' end 部门名称 from emp

                                                       流程函数 

 

===多行函数/分组函数/聚合函数

 max()—最大值 ;min()—最小值 ;avg()—平均值 ;sum()—求和 ;count()—求个数 ;

select max(sal),min(sal),avg(sal),sum(sal),count(sal) from emp
      ----- 介绍 group by 和 having 

             ----- 查询每个部门里 的最大工资,最小工资,平均工资

select max(sal),min(sal),avg(sal) 
from emp 
group by deptno

             ----- 查询 每个岗位的最高工资,最低工资,平均工资

select job,max(sal),min(sal),avg(sal) 
from emp
GROUP BY job

             ----- 查询 1000元以上的每个工资的总人数,总人数低于5个的部门不显示

select deptno,count(*) c
from emp 
where sal>1000 
GROUP BY deptno 
having c>=5

             ----- 查询 每个经理人所带的手下员工的总人数

select mgr,count(*)
from emp
GROUP BY mgr

             ----- 查询 在1981年入职的各部门总人数

select deptno,count(*)
from emp
where year(hiredate)=1981
GROUP BY deptno

                                                        其他函数

      

(3)多表查询

===分类

   内连接查询,外连接查询

-- from部分
select * from emp,dept (缺少关联关系)    造成--笛卡尔积现象   15*3=45

===内连接查询
       ----- 【写法一】 
select * from emp,dept where emp.deptno=dept.deptno 
        ----- inner join  . . . on    【写法二】     

    inner join —— 内连接  ; on —— 通过on做两张表之间的关联查询

select * from emp inner join dept on emp.deptno=dept.deptno 
        ----- 关键字  using        【写法三】

     要求:两张表之间的关联列是同名的

select * from emp inner join dept using(deptno)  
        ----- 自然连接               【写法四】 

      要求:两张表之间的关联列 同名,同类型,同长度

select * from emp e natural join dept d 
        ----- 自身内连接 (一张表)

             ----- 例子:查找每个经理的名字,入职时间,和工资

select distinct m.empno,m.ename,m.hiredate 
from emp m,emp e
where m.empno=e.mgr
===外连接查询

左外连接   右外连接

    ——区分原理:一个查询的SQL语句里,第一个表名 叫 左表;第二个表名叫 右表。

                              如果是内连接查询,左右两个表的地位是一样的

select * from t_emp,dept where dept.deptno=t_emp.deptno 

                               如果使用左外连接查询,那么左表是主表,主表里的数据都会显示出来;右表是子表,子表里的数据,只显示符合连接条件的。

select * from t_emp left join dept on dept.deptno=t_emp.deptno-- 右表做主表
select * from t_emp right join dept on dept.deptno=t_emp.deptno

(4)子查询

{没有子查询,可能要执行很多次,才能得到最终结果  ;有子查询,执行一次就能拿到最终结果}

===分类

不相关子查询(简单)  ——单行不相关子查询

                                       ——多行不相关子查询

相关子查询  ----》存储过程

        ----- 单行不相关子查询

              --- 查询工资最高的员工信息

select * from emp where sal=(select max(sal) from emp)

              --- 查询工资高于平均工资的雇员名字和工资

select ename,sal from emp where sal>(select avg(sal) from emp)

        ----- 多行不相关子查询

             any————任何
             all————全部
             select * from emp where sal>any/all(select语句)

        ----- 相关子查询

               ---查询本部门最高工资的员工

select * from emp e 
where sal =(select max(sal) from emp where deptno=e.deptno) 
order by deptno

              --- 查询工资高于其所在岗位的平均工资

select * from emp e 
where sal>= (select avg(sal) from emp where emp.job=e.job) 
order by deptno desc                        

2,DML —— 数据操作语言(Data Manipulation Language)

           主要用于对数据库中的数据进行增加、修改和删除的操作。

(1)insert   增加 数据

insert into 表名(字段名,,,字段名)values(值,,,值) 

insert into 表名 values(值,,,值)

  • 一次添加1条:insert into 表 values(值,值,值)
  • 一次添加n条:insert into 表 values(值,值,值),(值,值,值),(值,值,值)

------ 在t_student数据库表中插入数据

insert into t_student values (1,'张三','男',18,'2022-5-8','软件1班','123@126.com');
insert into t_student values (10010010,'张三','男',18,'2022-5-8','软件1班','123@126.com');
insert into t_student values (2,'张三','男',18,'2022.5.8','软件1班','123@126.com');
insert into t_student values (2,"张三",'男',18,'2022.5.8','软件1班','123@126.com');
insert into t_student values (7,"张三",'男',18,now(),'软件1班','123@126.com');
insert into t_student values (9,"易烊千玺",'男',18,now(),'软件1班','123@126.com');
insert into t_student (sno,sname,enterdate) values (10,'李四','2023-7-5');

(2)delete  删除 数据       truncate  删除表和数据,再创建一个新表

delete from 表名 where 条件 and/or 条件

delete from t_student 【慎用】

delete from t_student where sno = 2;
truncate table t_student;
  • delete 和 truncate 的区别
  1. delete为数据操作语言DML;truncate为数据定义语言DDL。
  2. delete操作是将表中所有记录一条一条删除直到删除完;truncate操作则是保留了表的结构,重新创建了这个表,所有的状态都相当于新表。因此,truncate操作的效率更高。
  3. delete操作可以回滚;truncate操作会导致隐式提交,因此不能回滚(在第十章中会讲解事务的提交和回滚)。
  4. delete操作删除表中记录后,再次向表中添加新记录时,对于设置有自增约束字段的值会从删除前表中该字段的最大值加1开始自增;truncate操作则会重新从1开始自增。 
  5. delete操作执行成功后会返回已删除的行数(如删除4行记录,则会显示“Affected rows:4”);截断操作不会返回已删除的行量,结果通常是“Affected rows:0”。

(3)update  修改 数据

update 表名 set  字段=值,字段=值  where 条件 and/or 条件
update 表名 set  字段=值,字段=值 【慎用】

-----修改表中数据

update t_student set sex = '女' ;
update t_student set sex = '男' where sno = 10 ;
UPDATE T_STUDENT SET AGE = 21 WHERE SNO = 10;
update t_student set CLASSNAME = 'java01' where sno = 10 ;
update t_student set CLASSNAME = 'JAVA01' where sno = 9 ;
update t_student set age = 29 where classname = 'java01';

注意事项

  • 关键字,表名,字段名不区分大小写
  • 默认情况下,内容不区分大小写
  • 删除操作from关键字不可缺少
  • 修改,删除数据别忘记加限制条件 

3,DDL —— 数据定义语言(Data Definition Language)

          主要用针对是数据库对象(数据库、表、索引、视图、触发器、存储过程、函数)进行

建、修改和删除操作。

(1)create  创建 数据库对象

create  table '表名'(

      '字段名'  类型(长度)约束  注释,

      '字段名'  类型(长度)约束  注释,

      '字段名'  类型(长度)约束  注释

);

 创建表的时候,同时添加多条数据:
            create table t_emp
            as
            select e.*,d.dname,d.loc 
            from emp e,dept d where e.deptno=d.deptno

-- 查看表的结构:展示表的字段详细信息
desc t_student; 
-- 查看表中数据:
select * from t_student;
-- 查看建表语句:
show create table t_student;

(2)drop  删除 数据库对象      

drop  table  '表名';

drop table t_student;

(3)alter  修改 数据库对象

alter  table '表名';

----- 修改表的结构:
----- 增加一列:
alter table t_student add score double(5,2) ; -- 5:总位数  2:小数位数 
update t_student set score = 123.5678 where sno = 1 ;
----- 增加一列(放在最前面)
alter table t_student add score double(5,2) first;
----- 增加一列(放在sex列的后面)
alter table t_student add score double(5,2) after sex;
----- 删除一列:
alter table t_student drop score;
----- 修改一列:

-- modify修改是列的类型的定义,但是不会改变列的名字

-- change修改列名和列的类型的定义

alter table t_student modify score float(4,1); -- modify修改是列的类型的定义,但是不会改变列的名字
alter table t_student change score score1 double(5,1); -- change修改列名和列的类型的定义

(4)字段类型

#1——整数类型  int

MySQL支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示
主键自增:不使用序列,通过auto_increment,要求是整数类型 

#2——浮点型   double(m,n)【m--一共的位数;n---小数点后的位数】

需要注意的是与整数类型不一样的是,浮点数类型的宽度不会自动扩充。 score double(4,1)
 score double(4,1)--小数部分为1位,总宽度4位,并且不会自动扩充。 

#3——字符串型   varchar(20)【对应Java的String型】

CHAR 和  VARCHA 类型相似,均用于存于较短的字符串,主要的不同之处在于存储方式。CHAR类型长度固定,VARCHAR类型的长度可变。

因为VARCHAR类型能够根据字符串的实际长度来动态改变所占字节的大小,所以在不能明确该字段具体需要多少字符时推荐使用VARCHAR类型,这样可以大大地节约磁盘空间、提高存储效率。

CHAR和VARCHAR表示的是字符的个数,而不是字节的个数 。

注意事项

  • int  宽度是显示宽度,如果超过,可以自动增大宽度 int底层都是4个字节
  • 时间的方式多样  '1256-12-23'  "1256/12/23"  "1256.12.23"
  • 字符串不区分单引号和双引号
  • 如何写入当前的时间  now() , sysdate() , CURRENT_DATE()
  • char varchar 是字符的个数,不是字节的个数,可以使用binary,varbinary表示定长和不定长的字节个数。
  • 如果不是全字段插入数据的话,需要加入字段的名字
     
#4——时间日期   date/datetime 【时间】

TIMESTEMP类型的数据指定方式与DATETIME基本相同,两者的不同之处在于以下几点:
(1) 数据的取值范围不同,TIMESTEMP类型的取值范围更小。
(2) 如果我们对TIMESTAMP类型的字段没有明确赋值,或是被赋与了NULL值,MySQL会自动将该字段赋值为系统当前的日期与时间。
(3) TIMESTEMP类型还可以使用CURRENT_TIMESTAMP来获取系统当前时间。
(4) TIMESTEMP类型有一个很大的特点,那就是时间是根据时区来显示的。例如,在东八区插入的TIMESTEMP数据为2017-07-11 16:43:25,在东七区显示时,时间部分就变成了15:43:25,在东九区显示时,时间部分就变成了17:43:25。   

(5)认识数据库表

  • 表(Table)是数据库中数据存储最常见和最简单的一种形式,
  • 数据库可以将复杂的数据结构用较为简单的二维表来表示。
  • 二维表是由行和列组成的,分别都包含着数据。如图

  • 每个表都是由若干行和列组成的,在数据库中表中为记录的行被称为记录,表中的列被称为是这些记录的字段
  • 字段是表里的一列,用于保存每条记录的特定信息。如上表所示的学生信息表中的字段包括“学号”、“姓名”、“性别”和“年龄”。数据表的一列包含了某个特定字段的全部信息。 

 (6)约束

  • 为防止不符合规范的数据存入数据库,在用户对数据进行插入、修改、删除等操作时,
  • MySQL提供了一种机制来检查数据库中的数据是否满足规定的条件,以保证数据库中数据的准确性和一致性,这种机制就是完整性约束。  

完整性----数据的准确性

#1——约束的使用场合

                DDL建表语句里。

#2——约束的种类(7)

#3——根据DDL建表语句里约束代码的位置,可以分为【约束从作用上可以分为两类:
列级约束:
  • 约束代码直接写在  字段名后面
  • 包含在列定义中,直接跟在该列的其它定义之后 ,用空格分隔;不必指定列名;

————非空,唯一,默认值,自增,检查

表级约束:
  • 约束代码脱离字段,单独一行存在
  • 可以约束表中任意一个或多个字段。与列定义相互独立,不包含在列定义中;与定义用‘,’分隔;必须指出要约束的列的名称;

————主键,外键,检查

缩写约束条件约束描述(作用)表级约束/列级约束
PK主键    primary   key约束字段的值可唯一地标识对应的记录

单字段主键的添加:

表级约束   列级约束;

多字段主键的添加:

表级约束

NK非空    not null约束字段的值不能为空

单字段或多个字段非空约束的添加:

列级约束

(非空约束无表级约束)

UK唯一     unique约束字段的值是唯一的

单字段或多个字段唯一约束的添加:

表级约束  列级约束

检查     check限制某个字段的取值范围表级约束  列级约束
默认值     default约束字段的默认值

单字段或多个字段约束的添加:

列级约束

自增    auto_increment约束字段的值自动递增   
外键    foreign   key约束表与表之间的关系

  • 使用主键约束可以快速查找表中的记录。就像人的身份证、学生的学号等等,设置为主键的字段取值不能重复(唯一),也不能为空(非空),否则无法唯一标识一条记录。

  • 设置了非空约束的字段,在插入的数据为NULL时,数据库会提示错误,导致数据无法插入。

  •  一张表中只能有一个自增长字段,并且该字段必须定义了约束(该约束可以是主键约束、唯一约束以及外键约束),如果自增字段没有定义约束,数据库则会提示“Incorrect table definition; there can be only one auto column and it must be defined as a key”错误。
  • 由于自增约束会自动生成唯一的ID,所以自增约束通常会配合主键使用,并且只适用于整数类型。一般情况下,设置为自增约束字段的值会从1开始,每增加一条记录,该字段的值加1

  • 外键约束(FOREIGN KEY,缩写FK)是用来实现数据库表的参照完整性的。
  • 外键约束可以使两张表紧密的结合起来,特别是针对修改或者删除的级联操作时,会保证数据的完整性。
  • 外键是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须具有主键约束或者唯一约束。被依赖的表我们通常称之为父表或者主表,设置外键约束的表称为子表或者从表。
#4——使用约束
(1)6种约束使用展示
create table t_student(sno int(6) primary key auto_increment, sname varchar(5) not null, sex char(1) default '男' check(sex='男' || sex='女'),age int(3) check(age>=18 and age<=50),enterdate date,classname varchar(10),email varchar(15) unique
);
(2)创建数据库表

    ——constraint   约束关键字

create table t_student(sno int(6) auto_increment, sname varchar(5) not null, sex char(1) default '男',age int(3),enterdate date,classname varchar(10),email varchar(15),constraint pk_stu primary key (sno),  -- pk_stu 主键约束的名字constraint ck_stu_sex check (sex = '男' || sex = '女'),constraint ck_stu_age check (age >= 18 and age <= 50),constraint uq_stu_email unique (email)

—— 在创建表以后添加约束:

-- 创建数据库表:
create table t_student(sno int(6), sname varchar(5) not null, sex char(1) default '男',age int(3),enterdate date,classname varchar(10),email varchar(15)
);-- 在创建表以后添加约束:
alter table t_student add constraint pk_stu primary key (sno) ; -- 主键约束
alter table t_student modify sno int(6) auto_increment; -- 修改自增条件
alter table t_student add constraint ck_stu_sex check (sex = '男' || sex = '女');
alter table t_student add constraint ck_stu_age check (age >= 18 and age <= 50);
alter table t_student add constraint uq_stu_email unique (email);
(3)创建表后,添加外键约束   

    ————前者关联后者

alter table emp add CONSTRAINT fk_emp_deptno FOREIGN key (deptno) REFERENCES dept(deptno)

4,DCL —— 数据控制语言(Data Control Language)

          用来授予或回收访问 数据库的权限。

(1)grant  授予用户某种权限

(2)revoke  回收授予的某种权限

5,TCL —— 事务控制语言(Transaction Control Language)

          用于数据库的事务管理。

  •  删除数据的三种方式 以及之间的区别
  1. delete  from 表  === 只删除数据,保留表    ;可以回滚   ; 添加数据时,下标继续累加。【DML数据操作语言】
  2. truncate table 表 === 先把表以及表里的数据都删掉。然后再创建一个新表  ; 不能回滚  ;添加数据时,下标从新开始。【DDL数据定义语言】
  3. drop table 表 ===删除表以及表里的数据  ;【DDL数据定义语言】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频会议接入GB28181视频指挥调度,语音对讲方案

传统的视频会议指挥调度系统目前主流的互联网会议大部分都是私有协议&#xff0c;功能都很独立。目前主流的视频监控国标都最GB平台&#xff0c;新的需求要求融合平台要接入监控等设备&#xff0c;并能实现观看监控接入会议&#xff0c;实时语音设备指挥现场工作人员办公实施。…

萤石设备视频接入平台EasyCVR海康私有化视频平台监控硬盘和普通硬盘有何区别?

在现代安防监控领域&#xff0c;对于数据存储和视频处理的需求日益增长&#xff0c;特别是在需要长时间、高稳定性监控的环境中&#xff0c;选择合适的存储设备和监控系统显得尤为重要。本文将深入探讨监控硬盘与普通硬盘的区别&#xff0c;并详细介绍海康私有化视频平台EasyCV…

一学就废|Python基础碎片,字符串编码

Unicode 万国码 在 Python 3 中&#xff0c;字符串由 Unicode 表示&#xff0c;而不是字节。ASCII 码是定义字符数字代码的最著名的标准。数字值最初只定义 128 个字符&#xff0c;因此 ASCII 只包含控制代码、数字、小写字母、大写字母等。然而&#xff0c;我们不足以表示世界…

npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系

文章目录 作用示例常用选项示例命令注意事项 1、实战举例**解决方法**1. **锁定唯一的 types/node 版本**2. **清理依赖并重新安装**3. **设置 tsconfig.json 的 types**4. **验证 Promise 类型支持** **总结** npm list types/node 命令用于列出当前项目中 types/node 包及其…

Qt--命令行终端程序开发

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;谦虚受教。 文章目录 前言一、头文件二、cpp文件三、使用流程如图所示 总结 前言 Constant dropping wears the stone. 一、头文件 #ifndef TERMINALWIDGET_H #define TERMINALWIDGET_…

【Linux】常用命令(2.6万字汇总)

文章目录 Linux常用命令汇总1. 基础知识1.1. Linux系统命令行的含义1.2. 命令的组成 2. 基础知识2.1. 关闭系统2.2. 关闭重启2.3. 帮助命令&#xff08;help&#xff09;2.4. 命令说明书&#xff08;man&#xff09;2.5. 切换用户&#xff08;su&#xff09;2.6.历史指令 3.目录…

video2gif容器构建指南

一、介绍 1.项目概述 Video2Gif 项目旨在提供一种便捷的方式&#xff0c;让用户能够将视频中的精彩片段快速转换为 GIF 动画。GIF 动画因其循环播放、文件体积小等特点&#xff0c;在社交媒体、聊天工具中广泛应用&#xff0c;用于表达情感、分享趣事等。 2.核心功能 视频导…

《人工智能网络安全现状(2024)》深度解读:机遇、挑战与应对策略

在当今数字化浪潮汹涌澎湃的时代&#xff0c;人工智能&#xff08;AI&#xff09;与网络安全已然深度交融&#xff0c;二者相互作用所塑造的发展态势正深刻重塑着我们的信息安全格局。《人工智能网络安全现状&#xff08;2024&#xff09;》这份报告恰似一盏明灯&#xff0c;为…

JVM(二、类加载系统)

类加载器 JVM的类加载通过classLoader及其子类完成的 类加载器&#xff1a; 启动类加载器&#xff08;Bootstrap ClassLoader&#xff09;&#xff1a; 负责加载存放在 <JAVA_HOME>\lib 目录中的核心类库&#xff0c;如rt.jar、resources.jar等&#xff08;或者被 -Xboot…

九、HttpMessageConverter

文章目录 1. RequestBody2. RequestEntity3. ResponseBody4. SpringMVC处理json5. SpringMVC处理ajax6. RestController注解7. ResponseEntity 1. RequestBody 2. RequestEntity 3. ResponseBody 4. SpringMVC处理json 5. SpringMVC处理ajax 6. RestController注解 7. Response…

PaddleYOLO目标检测训练(集成SwanLab可视化全过程)

PaddleYolo 是飞桨&#xff08;PaddlePaddle&#xff09;框架下的一个目标检测库&#xff0c;主要用于图像和视频中的物体检测。PaddleYOLO包含YOLO系列模型的相关代码&#xff0c;支持YOLOv3、PP-YOLO、PP-YOLOv2、PP-YOLOE、PP-YOLOE、RT-DETR、YOLOX、YOLOv5、YOLOv6、YOLOv…

移动电源测试中最核心的测试项目有哪些?-纳米软件

移动电源在如今的生活中扮演着重要的角色&#xff0c;对其进行准确的测试至关重要。以下是移动电源测试中一些较为核心的测试项目&#xff1a; 一、容量测试 内部电池容量测试&#xff1a;通过设计大量整机及内部电池容量测试实验&#xff0c;可以准确了解移动电源的实际容量…

跟着尚硅谷学vue2—进阶版4.0—Vuex1.0

5. Vuex 1. 理解 Vuex 1. 多组件共享数据-全局事件总线实现 红线是读&#xff0c;绿线是写 2. 多组件共享数据-vuex实现 vuex 不属于任何组件 3. 求和案例-纯vue版 核心代码 1.Count.vue <template><div><h1>当前求和为&#xff1a;{{ sum }}</h1&…

ChatGPT 搜索 vs Google 搜索

原文&#xff1a;Amanda Caswell - 2024.11.01 随着 OpenAI 推出的实时搜索功能&#xff0c;ChatGPT 正在逐步成为像 Google 这样的传统搜索引擎的竞争对手。ChatGPT 以其对话式的回答方式而闻名&#xff0c;它能够在没有广告干扰的情况下提供实时的上下文信息。 我迫不及待地…

LeetCode【0017】电话号码的字母组合

本文目录 1 中文题目2 最优解法&#xff1a;迭代法2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相…

iOS 18.2 重磅更新:6个大动作

根据外媒报道&#xff0c;iOS 18.2迎来重磅更新&#xff0c;将带来6个大动作&#xff0c;这是一次非常实用的更新。不过要注意的是&#xff0c;其中涉及到AI的功能&#xff0c;国行iPhone 暂时还不可用&#xff0c;只能等审核通过了。 1&#xff0c;Safari下载进度 过去通过S…

《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项

《TCP/IP网络编程》学习笔记 | Chapter 9&#xff1a;套接字的多种可选项 《TCP/IP网络编程》学习笔记 | Chapter 9&#xff1a;套接字的多种可选项套接字可选项和 I/O 缓冲大小套接字多种可选项getsockopt & setsockoptSO_SNDBUF & SO_RCVBUF SO_REUSEADDR发生地址绑定…

D66【python 接口自动化学习】- python基础之数据库

day66 SQL-DQL-排序分页 学习日期&#xff1a;20241112 学习目标&#xff1a;MySQL数据库-- 135 SQL-DQL-排序分页 学习笔记&#xff1a; 结果查询 结果分页限制 总结 排序和分页限制的语法 2. 关键字总结&#xff1a;

Groovy有哪些官方文档和教程可以学习?

Groovy Language Documentation&#xff1a; 这是Groovy的官方文档&#xff0c;提供了详细的语言规范、教程和指南。您可以从这里下载JavaDoc和在线文档&#xff0c;以及获取关于如何开始使用Groovy的指导。[Groovy Language Documentation][1] Groovy官方教程&#xff1a; 官…

LeetCode 3.无重复字符的最长子串

LeetCode 3.无重复字符的最长子串 思路&#x1f9d0;&#xff1a; 使用滑动窗口哈希表&#xff0c;哈希表映射每一个字符串&#xff0c;左右指针表示当前区间&#xff0c;当出现一个字符串那么就将哈希表1&#xff0c;右指针移动&#xff0c;当哈希表对应位置大于1时&#xff0…