Mysql基础语法理论大全

------------------------------------------------------------------------------------------------
第一章:SQL语言基础(SQL结构化查询语句)
------------------------------------------------------------------------------------------------
-- 按照SQL92、99标准 分为4大类
1:数据操作语言(DML) SELECT 查询,INSERT 插入,UPDATE 更新,DELETE 删除, 
2:数据定义语言(DDL) CREATE 创建,ALTER修改结构,DROP 删除 ,TRUNCATE 删除 等语句
3:事务处理语言(TCL) COMMIT 提交,ROLLBACK 回滚事务 等语句
4:数据控制语言(DCL) GRANT 授权,REVOKE 解除授权, 

说明:也可以把SELECT 作为数据操作语言(DQL)

-- SQL语句的语法规范
 1. SQL语句的所有表名、字段名全部小写,系统保留字、内置函数名、SQL保留字大写。
 2. 连接符OR、IN、AND、以及=、<=、>=等前后加上一个空格。
 3. 对较为复杂的SQL语句、存储过程、函数加上注释,说明算法、功能。
-- 单行注释
/*
多行注释
*/ 
 4. SQL语句的缩进风格
 1) 一行有多列,超过80个字符时,基于列对齐原则,采用下行缩进 
 2) WHERE子句书写时,每个条件占一行,语句另起一行时,以保留字或者连接符开始,连接符右对齐。 
 5. 多表连接时,使用表的别名来引用列。

-- 其他注意事项
1. SQL 命令大小写不敏感
2. SQL 命令可写成一行或多行
3. 一个关键字不能跨多行或缩写
4. 子句通常位于独立行,以便编辑,并易读 
5. SQL语句用分号作为分隔符,系统读取到分号才会执行语句

------------------------------------------------------------------------------------------------
第二章:表管理DDL语句
------------------------------------------------------------------------------------------------
数据定义语言(DDL) CREATE 创建,ALTER修改结构,DROP 删除 ,TRUNCATE 删除 等语句

1.新建表
CREATE TABLE 表名
(
列名1 数据类型 [DEFAULT 默认值][列级约束1,列级约束2 ……],
列名2 数据类型 [DEFAULT 默认值][列级约束1,列级约束2 ……],
...,
列名n 数据类型 [DEFAULT 默认值][列级约束1,列级约束2 ……],
[CONSTRAINT 约束名称 约束类型(列名)],
[CONSTRAINT 约束名称 约束类型(列名)],
...
);

-- 表名的命名规则
1)必须以字母开头
2)可包括数字
3)只能包含A-Z, a-z, 0-9, _, $, AND #
4)不要使用MySQL的保留字
5)同一用户的表对象不能同名

-- 数据类型
CHAR(10): 定长字符串    输入LUCY ,结果将占有10个字符
VARCHAR(10):变长字符串  输入LUCY,结果将占有4个字符

CREATE TABLE student
(
学号 INT(5),
姓名 VARCHAR(20),
年龄 TINYINT(2),
性别 CHAR(1),
系名 VARCHAR(10),
身份证号 VARCHAR(18),
专业号 INT(4)
)
CHARACTER SET = utf8; -- 创建表时数据支持中文字符样式

SELECT * FROM student;-- 查看表数据
DESC student; -- 查看表结构

-- 插入一条数据
INSERT INTO student
VALUES(20204,'王小明',19,'女','经济系','510839199810106670',1001);

INSERT INTO student(学号,姓名,系名)
VALUES(20305,'黄大鹏','管理系');

INSERT INTO student
VALUES
(20506,'张文斌',18,'女','外语系','510639199905183452',1005),
(20507,'张文',18,'男','外语系','510639199905183433',1005),
(20508,'张文',19,'男','外语系','510639199905183499',1005);

2:修改表结构
-- 不推荐在建表完成后去修改表结构,特别是表中已经有数据的情况
-- 修改默认值
ALTER TABLE 表名 ALTER COLUMN 列名 SET DEFAULT 默认值;
-- 删除默认值
ALTER TABLE 表名 ALTER COLUMN 列名 DROP DEFAULT 默认值;

ALTER TABLE student ALTER COLUMN 性别 SET DEFAULT '女';

INSERT INTO student(学号,姓名,系名)
VALUES(20601,'黄小明','表演系');

SELECT * FROM student;

-- 添加/删除列
ALTER TABLE 表名 ADD 列名 数据类型;
ALTER TABLE 表名 DROP 列名;

ALTER TABLE student  ADD 联系电话 VARCHAR(11);
ALTER TABLE student  DROP 联系电话;

-- 修改列名
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 新列的数据类型;-- 添加/修改列
ALTER TABLE 表名 MODIFY COLUMN 列名 数据类型;-- 修改数据类型

ALTER TABLE student CHANGE COLUMN 系名 院系名 VARCHAR(20);
ALTER TABLE student MODIFY COLUMN 姓名 VARCHAR(40);
DESC student;

3: 删除表
TRUNCATE TABLE 表名;-- 删除表中所有的数据,不能删除部分数据,全部删除
DROP TABLE 表名;--  删除整张表结构,含数据

TRUNCATE TABLE student;
SELECT * FROM student;
DROP TABLE student;

------------------------------------------------------------------------------------------------
第三章:表的约束
------------------------------------------------------------------------------------------------
-- 约束的种类
DEFAULT -- 默认值
PRIMARY KEY -- 主键约束
FOREIGN KEY -- 外键约束
NOT NULL -- 非空约束
UNIQUE -- 唯一约束
AUTO_INCREMENT  -- 自增约束

1:在创建表时增加约束
CREATE TABLE student2
(
学号 INT(5) PRIMARY KEY,
姓名 VARCHAR(20) NOT NULL,
年龄 TINYINT(2) DEFAULT 18,
性别 ENUM('男','女') NOT NULL  DEFAULT '女',
系名 VARCHAR(10),
身份证号 VARCHAR(18),
专业号 INT(4)
)
CHARACTER SET = utf8;

SELECT * FROM student2;
DESC student2;

-- 创建course表
CREATE TABLE course
(
专业号 INT(5) PRIMARY KEY AUTO_INCREMENT,
专业名称 VARCHAR(20) NOT NULL
)
CHARACTER SET = utf8;

SELECT * FROM course;

2:建表后增加约束(不推荐)
-- AUTO_INCREMENT默认从1开始自增,可以通过赋值改变初始值
ALTER TABLE  course AUTO_INCREMENT = 1001;
INSERT INTO  course(专业名称)
VALUES ('金融学');
INSERT INTO  course(专业名称)
VALUES ('国际金融与贸易');

-- 为student2表添加一个非空约束
ALTER TABLE 表名  MODIFY  列名 数据类型 NOT NULL;
ALTER TABLE student2 MODIFY 系名 VARCHAR(10) NOT NULL;
DESC student2

-- 为student2表添加一个唯一约束
ALTER TABLE 表名  ADD UNIQUE(列名);
ALTER TABLE student2  ADD UNIQUE(身份证号);


INSERT INTO student2
VALUES(20204,'王小明',19,'女','经济系','510839199810106670',1001);

INSERT INTO student2
VALUES(20205,'王小明',19,'女','经济系','510839199810106670',1001);

INSERT INTO student2
VALUES(20205,'王小明',19,'女','经济系','510839199810106671',1001);

INSERT INTO student2
VALUES(20205,NULL,19,'女','经济系','510839199810106671',1001);

SELECT * FROM student2;


-- 为student2表中的专业号设置外键约束
ALTER TABLE 从表名 ADD CONSTRAINT 外键名
FOREIGN KEY(从表的外键字段) REFERENCES 主表(主键字段);--  student2 表是从 ,course表是主表

ALTER TABLE student2 ADD CONSTRAINT FK_student2_course
FOREIGN KEY(专业号) REFERENCES course(专业号);

DESC student2
-- 查看表中的各种约束条件
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE constraint_schema = 'studentinfo2';


-- 查看创建的表的整体结构
SHOW CREATE TABLE 表名;
SHOW CREATE TABLE student2;
CREATE TABLE `student2` (
  `学号` INT(5) NOT NULL,
  `姓名` VARCHAR(20) NOT NULL,
  `年龄` TINYINT(2) DEFAULT '18',
  `性别` ENUM('男','女') NOT NULL DEFAULT '女',
  `系名` VARCHAR(10) NOT NULL,
  `身份证号` VARCHAR(18) DEFAULT NULL,
  `专业号` INT(4) DEFAULT NULL,
  PRIMARY KEY (`学号`),
  UNIQUE KEY `身份证号` (`身份证号`),
  KEY `FK_student2_course` (`专业号`),
  CONSTRAINT `FK_student2_course` FOREIGN KEY (`专业号`) REFERENCES `course` (`专业号`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

------------------------------------------------------------------------------------------------
第四章:表的操作(DML语句)
------------------------------------------------------------------------------------------------
1:INSERT 插入
-- 全量数据插入,插入的数据,顺序必须和建表时的顺序一致
INSERT INTO 表名
VALUES(value1,value2...valueN);
-- 按照自定义的列进行数据的插入
INSERT INTO 表名(列名1,列名2,列名3...列名N)
VALUES(value1,value2...valueN);
-- 批量插入数据,插入的数据,顺序必须和建表时的顺序一致
INSERT INTO 表名
VALUES
(value1,value2...valueN),
(value1,value2...valueN),
(value1,value2...valueN);

SELECT * FROM dept;
-- 要求在部门表中插入一条记录
INSERT INTO dept
VALUES(50,'DEVELOPMENT','BEIJING');
-- dept表按指定列再次插入一行数据
INSERT INTO dept(deptno,dname)
VALUES(60,'MIS');
-- 注意空值的处理
INSERT INTO dept
VALUES(70,'TESTTEAM',NULL);
///
【扩展】事务TCL 
COMMIT 提交,ROLLBACK 回滚 SAVEPOINT  设置回滚点
Q;什么是事务?
-- 包含SQL语句的一个执行整体,对DML操作语句生效(对其他操作语句无效)
-- MySQL默认自动提交事务,可以通过命令来修改默认值
SET autocommit = 0; 表示手动提交事务,=1则表示自动提交事务(默认值)

-- 实际应用场景
ATM转账   A卡向B卡转账,结果A卡扣款成功,B卡到账失败  ——回滚A卡的数据
电商订单  确认订单后,商品库存被扣减,如果下订单失败,则商品库存需要回滚到下订单之前
-- 在emp表中插入一条记录

INSERT INTO employees.emp 
    (empno, 
    ename, 
    job, 
    mgr, 
    hiredate, 
    sal, 
    comm, 
    deptno
    )
    VALUES
    (6666, 
    'XIAOMING', 
    'DEVELOPMENT', 
    '7788', 
    CURDATE(), 
    '2000', 
    NULL, 
    50
    );

SELECT * FROM emp;

SAVEPOINT A;

INSERT INTO employees.emp 
    (empno, 
    ename, 
    job, 
    mgr, 
    hiredate, 
    sal, 
    comm, 
    deptno
    )
    VALUES
    (7777, 
    'XIAOMING', 
    'DEVELOPMENT', 
    '7788', 
    CURDATE(), 
    '2000', 
    NULL, 
    50
    );
-- 要求还原到上一组插入的数据,如何回滚?
ROLLBACK TO SAVEPOINT A;
SELECT * FROM emp;

ROLLBACK ;  -- 直接回滚则是回滚到最初设置事务的位置
SELECT * FROM emp;
-- 事务一旦提交,则直接对数据库服务器中的数据生效,不能再次回滚
///
-- 从其他表中插入数据到当前表insert + select
-- 把有提成的员工信息,导入到bonus表中
CREATE TABLE bonus
(
ename VARCHAR(10),
job VARCHAR(9),
sal FLOAT(7,2),
comm FLOAT(7,2)
)
SELECT * FROM bonus;

-- INSERT INTO 表名 SELECT 完整查询语句
INSERT INTO bonus
SELECT ename,job,sal,comm FROM emp 
WHERE comm IS NOT NULL;

DESC emp

2. UPDATE 修改
UPDATE 表名
SET 列名1=value1,列名2=value2....列名N=valueN
WHERE 限定条件

-- 调整dept表中50号部门的地址
UPDATE dept
SET loc='CHENGDU' WHERE deptno = 50;
SELECT * FROM dept

-- 想要给emp表中所有员工+200元 其中KING不加薪水
UPDATE emp
SET sal=sal+200 WHERE ename <> 'KING';
SELECT * FROM emp;

-- UPDATE语句中的set和where后面都可以使用子查询语句,但不能是对同一张表的操作
-- 将所有工资比ALLEN高的员工,薪水改成和ALLEN一样
-- 错误案例
UPDATE emp 
SET sal = (SELECT sal FROM emp WHERE ename = 'ALLEN') 
WHERE sal > (SELECT sal FROM emp WHERE ename = 'ALLEN');

UPDATE emp d,(SELECT e.sal FROM emp e WHERE e.ename='ALLEN') a SET d.sal = a.sal
WHERE d.sal >a.sal;

-- 将RESEARCH部门所有员工的上级改为King
UPDATE emp
SET mgr = (SELECT empno FROM (SELECT empno FROM emp WHERE ename='KING') a)
WHERE deptno= (SELECT deptno FROM dept WHERE dname= 'RESEARCH')
-- 另一种解法
UPDATE emp e,dept d SET mgr = 7902 WHERE e.deptno=d.deptno
AND d.dname='research';

SELECT * FROM emp WHERE deptno=20 

ROLLBACK;

3. DELETE 删除
DELETE [FROM] 表名
WHERE 限定条件 -- 如果delete不加where条件,则表示删除表中的所有数据

SELECT * FROM bonus;
DELETE FROM bonus;
COMMIT;

-- 删除dept表中50,60,70号部门
DELETE FROM dept WHERE deptno IN(50,60,70) ;
SELECT * FROM dept;
COMMIT;

-- 使用子查询删除数据
-- 删除sales部门的所有员工信息
DELETE FROM emp
WHERE deptno = (SELECT deptno FROM dept WHERE dname='SALES');
SELECT * FROM emp;
ROLLBACK;

注意:请先关闭自动提交事务功能 SET autocommit=0;
1.在EMP表中,增加一名员工,员工信息参照现有员工构造.

2.员工SMITH调动到SALES部门,请编写SQL语句更新员工信息.

3.员工JAMES已经离职,请编写SQL语句更新数据库.

4.用户执行DELETE FROM emp;语句删除了EMP表的记录,但没有提交,请问有办法恢复EMP原来的数据吗? 


------------------------------------------------------------------------------------------------
第五章 常用数据库对象
------------------------------------------------------------------------------------------------
1.视图
-- 视图是查询数据的快捷方式,视图不存储数据,存储的是一个查询语句
/*
CREATE VIEW 视图名称
(别名1,别名2,别名3...别名N)
AS
SELECT -- 一个完整的查询语句
*/
1)新建视图
【用法一】针对不同的用户,提供不同的权限(权限控制)
-- HR,BOSS 想要查看每个员工的薪水
SELECT empno,ename,sal FROM emp;

-- 20号部门的经理,要求只能查询自己部门的员工薪水
SELECT empno,ename,sal FROM emp WHERE deptno = 20;

CREATE VIEW v_dept20
AS
(SELECT * FROM emp WHERE deptno = 20);

SELECT * FROM v_dept20   -- 视图和表的用法相同
-- 对视图进行操作,为SMITH涨薪水 200
UPDATE v_dept20
SET sal=sal+200
WHERE ename='SMITH';

Q: 请问emp表SMITH的薪水是多少? -- 1000 修改视图的数据等于修改原表的数据 
SELECT empno,ename,sal FROM emp WHERE ename='SMITH'; 

【用法二】简化复杂的查询语句
-- 通过部门名称查询该部门的平均工资
SELECT AVG(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND d.dname='SALES';

-- 视图
CREATE VIEW v_avgsal
AS
(SELECT e.*,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno);

SELECT * FROM v_avgsal;
SELECT AVG(sal) FROM v_avgsal WHERE dname='SALES'

2)删除视图
-- DROP VIEW 视图名称
DROP VIEW  v_dept20;  -- 删除视图,实际上只是删除了一个select语句,不会影响到原表的数据
DROP VIEW  v_avgsal;  
SELECT * FROM emp


2.索引 INDEX
Q:什么是索引?
-- 索引(INDEX)类似书的目录,是供服务器在表中快速查找和操作行的数据库结构
-- 索引是以列为单位建立的,经常作为查询条件的列,可以创建索引来提高查询效率

Q:索引设计原则
-- 经常出现在where,order by,group by后面的列可以创建索引
-- 有大量空值的列,数据频繁改动的列,不经常作为查询条件的列不要创建索引
-- 当某个数据具有唯一性特征时,可以指定唯一索引,以确保数据的完整性,提高查询速度

Q:优点
-- 可以大大提高数据的查询速度,这是建索引的主要原因
-- 索引的内部结构由系统自动创建,每次对数据的修改索引也会自动更新
-- 在创建主键约束和唯一约束时,会自动创建主键索引和唯一索引,保证每行数据的唯一性

Q:不足
-- 索引虽然提高了查询速度,同时却会降低更新表的速度,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
-- 建立索引会占用磁盘空间的索引文件,每个表至少支持16个索引(依据存储引擎的不同而有所区别)

索引分类:普通索引和唯一索引
1)普通索引——允许在定义的索引列中插入重复的值/空值
-- 创建普通索引
CREATE INDEX 索引名称 ON 表名(列名(`length`)); -- 如果是BLOB,TEXT数据类型,必须制定length
-- 为ename字段创建索引
CREATE INDEX ind_ename ON emp(ename);
-- 添加索引
ALTER TABLE emp ADD INDEX ind_mgr(mgr);

-- 查看索引
SHOW INDEX FROM emp

-- 在建表时添加索引
CREATE TABLE  mytable
(
id INT PRIMARY KEY,
myname VARCHAR(20),
INDEX ind_myname(myname)
);

SELECT * FROM mytable;

2)唯一索引——索引的列数据必须唯一,但允许有空值NULL,如果是组合索引,则列值的组合必须唯一
-- 创建索引
CREATE UNIQUE INDEX 索引名称 ON 表名(列名(`length`));
-- 添加索引
ALTER TABLE 表名 ADD UNIQUE INDEX 索引名称(列名(`length`));
-- 在建表时添加索引
CREATE TABLE  mytable1
(
id INT PRIMARY KEY,
myname VARCHAR(20),
UNIQUE ind_myname(myname)
);

SHOW INDEX FROM mytable1

-- 当经常使用多个组合条件进行查询时使用组合索引
CREATE INDEX ind_job_deptno ON emp(job,deptno);
SHOW INDEX FROM emp
-- 如果查询条件只有job,该索引生效
-- 如果查询条件是job和deptno 该索引生效
-- 如果查询条件是deptno 该索引不生效

3) 删除索引
DROP  INDEX 索引名称 ON 表名;
DROP  INDEX ind_job_deptno ON emp;
DROP  INDEX ind_mgr ON emp;
DROP  INDEX ind_ename ON emp;


【注意】索引的限制条件
A.MyISAM存储引擎支持的索引引键长度不超过1000字节
B.MySQL目前不支持函数索引
C.使用!= ,<> 不能使用索引
SELECT * FROM emp
WHERE ename <> 'ALLEN';

SELECT * FROM emp
WHERE ename < 'ALLEN'
OR ename > 'ALLEN'

D. LIKE不能以%开头,无法使用索引

------------------------------------------------------------------------------------------------
第六章 存储过程  Stored PROCEDURE (SP)
------------------------------------------------------------------------------------------------
-- 简单来说,存储过程是一条或者多条SQL语句的集合
-- 存储过程能够实现较复杂的数据处理
-- MYSQL中的编程主要是在存储过程中实现的

-- 实际应用场景
-- 业务场景,部分业务逻辑被写入了SP中 举例:电商业务中,生成一张订单:插入数据到订单表;商品信息表修改商品数量,插入一条日志信息
-- 构建一整套测试数据  举例: 准备100个注册用户信息;准备N条日志测试翻页

DELIMITER //
CREATE PROCEDURE 存储过程名称(参数列表)
BEGIN 
程序主体;
END //
DELIMITER ;

-- DELIMITER //是告诉系统不要将分号作为分隔符,而是将//作为分隔符
-- DELIMITER ;是告诉系统请使用分号作为后续的分隔符

-- 参数列表
IN 参数名称 参数类型  -- 输入参数
OUT 参数名称 参数类型 -- 输出参数
INOUT 参数名称 参数类型 -- 也可以输入也可以输出的参数(不推荐)
-- 调用存储过程
CALL 存储过程名称(参数列表)
-----------------------------------------------------
-- 编写一个存储过程,输出 hello kitty
DELIMITER //
CREATE PROCEDURE pro_hello()
BEGIN 
SELECT "hello kitty";
END //
DELIMITER ;

CALL pro_hello();
-----------------------------------------------------
-- 编写一个带参数的存储过程
-- 输入一个员工编号,查询出该员工的薪水
DELIMITER //
CREATE PROCEDURE pro_empno(IN paramA INT)
BEGIN 
SELECT sal FROM emp
WHERE empno = paramA ;
END //
DELIMITER ;

CALL pro_empno(7839);

-----------------------------------------------------
-- 编写一个带参数的存储过程
-- 输入一个员工编号,返回其所在部门的平均工资
-- SELECT ... INTO... 给变量/参数赋值
DELIMITER //
CREATE PROCEDURE pro_empno_avgsal(IN paramA INT,OUT paramB FLOAT)
BEGIN 
SELECT AVG(sal) INTO paramB FROM emp
WHERE deptno =
(SELECT deptno FROM emp WHERE empno = paramA);
END //
DELIMITER ;

-- @+变量名称声明一个会话变量,作用域是整个会话
CALL pro_empno_avgsal(7788,@sal);
SELECT @sal;


-- 查看该表的存储过程
SELECT * FROM information_schema.ROUTINES

-- 删除存储过程
DROP PROCEDURE 存储过程名称
DROP PROCEDURE pro_empno;
DROP PROCEDURE pro_hello;
DROP PROCEDURE pro_empno_avgsal;
存储过程【练习题】
1.编写一个存储过程,要求能够对emp表中10部门的员工人数进行统计,并打印出来。

2.编写一个存储过程,要求能够对emp表中的所有员工平均工资进行统计,并打印出来。

3.编写一个存储过程,要求输入一个员工的编号,
过程能把该员工的所属部门名称和他的直接领导manager的姓名打印出来。

4.删除创建的所有存储过程
-------------------------------------------------------------------
2.控制结构
(1)IF 条件控制
/*
IF 条件判断1 then 执行语句1;
elseif  条件判断2 then 执行语句2;
...
elseif  条件判断N then 执行语句N;
else 执行语句N+1;
END IF;
*/

-- 输入一个部门编号,计算出该部门的平均工资
-- 如果平均工资低于1800,给该部门的员工涨薪300

DELIMITER //
CREATE PROCEDURE pro_sal(IN paramA INT)
BEGIN 
DECLARE avgsal FLOAT(7,2); -- 声明一个变量

SELECT AVG(sal) INTO avgsal FROM emp
WHERE deptno = paramA;

IF avgsal < 1800 THEN  UPDATE emp SET sal=sal+300 WHERE deptno = paramA;
END IF;

END //
DELIMITER ;

-- DECLARE 变量名 数据类型 [default 默认值] 
-- 该变量值只能在存储过程中使用 ,称为存储过程变量
CALL pro_sal(30);
SELECT AVG(sal) FROM emp WHERE deptno = 30;
SELECT * FROM emp WHERE deptno = 30;

ROLLBACK;
-- DROP PROCEDURE pro_sal;
-----------------------------------------------------------------
-- 输入一个部门编号,计算出该部门的平均工资
-- 如果平均工资低于1800,给该部门涨薪300
-- 如果平均工资在1800~2800之间,给该部门涨薪100
-- 如果平均工资大于2800,输出“工资太高了”


(2)循环控制
/*
while 进入循环的条件 DO
循环体;
end while;
*/

-- 创建一张表reg,用来存储用户的注册信息
-- 包含2个列 uname作为主键,upass 不能为空
-- 往表中插入100条数据
CREATE TABLE reg
(
uname VARCHAR(20) PRIMARY KEY,
upass VARCHAR(20) NOT NULL
);

SELECT * FROM reg

DELIMITER //
CREATE PROCEDURE pro_testdate(IN username VARCHAR(20),IN passwd VARCHAR(20), IN n INT)
BEGIN 

DECLARE varA INT DEFAULT 0;

WHILE varA < n DO
INSERT INTO reg
VALUES(CONCAT(username,varA),CONCAT(passwd,varA));

SET varA=varA+1;
END WHILE;

END //
DELIMITER ;

CALL pro_testdate('test','pass',100);

SELECT * FROM reg

-- drop table reg;
-- DROP PROCEDURE pro_testdate;
-- SELECT * FROM information_schema.ROUTINES

【练习题】
练习1:
输入一个部门编号,对该部门员工的薪资进行统计,要求:
用部门最高薪水-最低薪水的之差进行判断,
如果差距大于等于2000,输出标记‘H’
如果差距小于2000,大于等于1000,输出标记‘M’,
如果差距小于1000,输出标记‘L’
-- 提示:要求用IF实现

练习2:
输入一个员工编号,并对员工的工资进行判断,要求:
如果员工的工资等级为5,则输出wealthy
如果工资等级为4,输出rich
如果工资等级为3,输出average
如果工资等级为2,输出poor
如果工资等级为1,输出misery
-- 提示:用CASE实现
/*
case [变量]
when value1 then 执行语句1;
when value2 then 执行语句2;
……
when valueN then 执行语句N;
else 执行语句N+1;
end case;
*/

练习3:
编写一个函数,要求接受输入3个数字,表示三角形3边的长度。
如果输入的数字中包含0或负数,返回错误提示;
如果输入的数字不能组成三角形,返回错误提示;
如果能组成三角形,则需要判断组成的三角是不规则,等腰还是等边三角形,同样返回相应信息
-- 提示:用IF实现


练习4
自定义一张表test1,字段(id(主键),NAME(不能重复),phno)用循环向这张表中插入100行记录。
-- 提示:用while实现

【思考题】
复制N条雇员信息,要求重新创建100条

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ELK企业级日志分析系统

ELK概述 为什么要使用 ELK 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措施纠正错误。 往…

切比雪夫不等式,大数定律及极限定理。

一.切比雪夫不等式 1.定理 若随机变量X的期望EX和方差DX存在,则对任意ε > 0,有   P{ |X - EX| > ε } < DX/ε2 或 P{ |X - EX| < ε } > 1 - DX/ε2 2.解析定理 ①该定理对 X 服从什么分布不做要求&#xff0c;仅EX DX存在即可。 ②“| |” 由于X某次…

软件测试炸了,作为从业者,你做好准备了吗?

软件测试行业已经发生很大变化&#xff0c;你跟上变化了吗&#xff1f; 岗位少不可怕&#xff0c;要求越来越高也不可怕&#xff0c;可怕的是&#xff0c;软件测试行业已经发生巨变&#xff0c;而你却原地踏步&#xff01;目前一线大厂更多倾向于招收测试开发&#xff0c;或者…

自学网络安全(黑客),一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且…

torch.distributed.launch多卡多机

torch.distributed.launch命令介绍 我们在训练分布式时候&#xff0c;会使用到 torch.distributed.launch 可以通过命令&#xff0c;来打印该模块提供的可选参数 python -m torch.distributed.launch --help usage: launch.py [-h] [--nnodes NNODES] [--node_rank NODE_RANK]…

诚迈科技携智达诚远出席高通汽车技术与合作峰会

5月25日至26日&#xff0c;诚迈科技及旗下的智能汽车操作系统及中间件产品提供商智达诚远作为高通生态伙伴&#xff0c;亮相首届“高通汽车技术与合作峰会”&#xff0c;通过产品展示和主题演讲呈现了基于高通骁龙数字底盘的最新智能座舱技术成果&#xff0c;共同展望智能网联汽…

GcExcel v6.1 支持新的 ‘.sjs‘ 模板文件 ‘.xltx‘ 格式 Crack

GrapeCity Documents for Excel (GcExcel) v6.1 版本现已上线&#xff01;该版本支持新的 SpreadJS .sjs 文件格式和 Excel 模板文件 .xltx 格式。此外&#xff0c;GcExcel 支持更多的SpreadJS兼容性功能和对 GcDataViewer 的多项增强。看看下面的主要亮点。 导入/导出 Spread…

Revit幕墙:用幕墙巧做屋面瓦及如何快速幕墙?

一、Revit中用幕墙巧做屋面瓦 屋面瓦重复性很高&#xff0c;我们如何快速的创建呢?下面我们来学会快速用幕墙来创建屋面瓦的技巧。 1.新建“公制轮廓-竖挺”族&#xff0c;以此来创建瓦的族(以便于载入项目中使用) 2.在轮廓族中绘制瓦的轮廓(轮廓需要闭合)&#xff0c;将族名称…

【JavaSE】Java基础语法(三十四):实现多线程

文章目录 1. 简单了解多线程2. 并发和并行3. 进程和线程4. 实现多线程方式一&#xff1a;继承Thread类【应用】5. 实现多线程方式二&#xff1a;实现Runnable接口【应用】6. 实现多线程方式三: 实现Callable接口【应用】7. 设置和获取线程名称【应用】8. 线程休眠【应用】9. 线…

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息&#xff0c;我一直觉得&#xff0c;如果那真的发生了&#xff0c;会是人类的悲哀。 由于之前我存储的地址又挂了&#xff0c;所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下&#xff0c;发现有三个地址。 他说这第一个…

xlsx是什么格式

xlsx是什么格式? xlsx是Excel文档的扩展名&#xff0c;其基于Office Open XML标准的压缩文件格式&#xff0c;取代了其以前专有的默认文件格式&#xff0c;在传统的文件名扩展名后面添加了字母x&#xff0c;即.xlsx取代.xls。 xlsx文件是什么格式? xlsx是Excel表格的文件格…

【P34】JMeter ForEach控制器(ForEach Controller)

文章目录 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明二、准备工作三、测试计划设计 一、ForEach控制器&#xff08;ForEach Controller&#xff09;参数说明 可以对一个组变量进行循环迭代&#xff1b;该组件通常与后置处理器中的 JSON 提取器、正…

桥梁结构健康监测解决方案

城市桥梁担负着城市的交通和运输网络的重要角色&#xff0c;是城市生命线的重要组成部分。然而&#xff0c;随着时间的推移和日益增长的负荷&#xff0c;桥梁可能会受到各种因素的损害&#xff0c;如自然灾害、疲劳、腐蚀等。因此&#xff0c;桥梁结构健康监测变得至关重要&…

chatgpt赋能Python-python中怎么导入numpy

介绍 Python是一种广泛使用的编程语言&#xff0c;具有许多内建功能和模块&#xff0c;让开发者能够快速地编写代码。然而&#xff0c;虽然能够实现许多计算&#xff0c;但是原始Python本身并不足够处理各种科学和数字计算上需要的高效性&#xff0c;因此numpy这个开源的Pytho…

【机器学习】采样方法

文章目录 采样方法11.1 简介11.2 常见采样方法11.2.1 均匀分布采样11.2.2 逆变换采样11.2.3 拒绝采样11.2.4 重要采样11.2.5 Metropolis方法11.2.6 Metropolis-Hasting 算法11.2.7 吉布斯采样 采样方法 11.1 简介 什么是采样 从一个分布中生成一批服从该分布的样本&#xff0c…

JavaWeb ( 十 ) SpringMVC

4.Spring MVC Spring MVC是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架。 三层架构分为表述层&#xff08;或表示层)、业务逻辑层、数据访问层&#xff0c;表述层表示前台页面和后台servlet 4.1.Spring MVC优点&#xff1a; ① 基于原生的Servlet&#xff0c;通过…

API测试| 了解API接口测试| API接口测试指南

什么是API&#xff1f; API是一个缩写&#xff0c;它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程&#xff0c;协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序&#xff1a;执行特定任务的程序。例程也称为过…

MKS SERVO4257D 闭环步进电机_系列1 产品简介

第1部分 产品概述 1.1 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口&#xff0c;RS485接口和CAN接口&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&#xff0c;有…

【工具】vscode的常用插件之git插件

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

进程间通信(命名管道)

目录&#xff1a; 1.命名管道 2.创建命名管道 --------------------------------------------------------------------------------------------------------------------------------- 1.命名管道 1.管道的一个应用限制就是只能在具有共同祖先&#xff08;具有亲缘关系&…
最新文章