Compare commits
159
Commits
d2970d183d
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c9dd5c8c83 | ||
|
|
e7aae27f87 | ||
|
|
c097a27e34 | ||
|
|
e6afc51134 | ||
|
|
db0782e5fc | ||
|
|
d7e3a5c9d9 | ||
|
|
3d52dadba1 | ||
|
|
3fbfc647b8 | ||
|
|
2c43525475 | ||
|
|
3f9704f1a4 | ||
|
|
f725ee8c97 | ||
|
|
2c3e944e03 | ||
|
|
1918e1e1e7 | ||
|
|
c96d28c005 | ||
|
|
0ab49e8346 | ||
|
|
1725b35ac9 | ||
|
|
1a1a6c0409 | ||
|
|
39672f95cb | ||
|
|
712b37490c | ||
|
|
449f17509e | ||
|
|
cd169b4904 | ||
|
|
d31fe4ec44 | ||
|
|
dc74003746 | ||
|
|
e8fd54dc02 | ||
|
|
c573ab7540 | ||
|
|
53b34d917f | ||
|
|
4079ff9b07 | ||
|
|
fc813427c5 | ||
|
|
255a4afc97 | ||
|
|
dc8392a55c | ||
|
|
b5cc50f90d | ||
|
|
da63a1d634 | ||
|
|
fc66b14900 | ||
|
|
49499ddb60 | ||
|
|
0fca9c9a65 | ||
|
|
ad6ebb9fa2 | ||
|
|
e229bbbb5d | ||
|
|
dae819bf03 | ||
|
|
984e4b5848 | ||
|
|
2c6fa871fd | ||
|
|
4afd009240 | ||
|
|
7c1ff398ef | ||
|
|
b555d546f3 | ||
|
|
7a89b6c6bd | ||
|
|
ca908905f0 | ||
|
|
e98ec49be5 | ||
|
|
562f6156ce | ||
|
|
12172b99ca | ||
|
|
0f66c6b6d8 | ||
|
|
631b95b9a1 | ||
|
|
dba08dadf4 | ||
|
|
ee5bf925ef | ||
|
|
36a2f799e1 | ||
|
|
9050c876b1 | ||
|
|
1101eebe94 | ||
|
|
3fd783abc5 | ||
|
|
67e45ace21 | ||
|
|
05299e024a | ||
|
|
c0663bc99c | ||
|
|
4732388b07 | ||
|
|
2a43e05b5f | ||
|
|
5f169e30ac | ||
|
|
c4547a80fc | ||
|
|
d06b6fc13d | ||
|
|
195f784173 | ||
|
|
abfd593f38 | ||
|
|
542dd24e8d | ||
|
|
9aa26a9fbe | ||
|
|
cc59f1a38b | ||
|
|
947c7e78d2 | ||
|
|
0ed3a59e2c | ||
|
|
932fcc500c | ||
|
|
be5497370f | ||
|
|
ba7a5971be | ||
|
|
eaa1811ce7 | ||
|
|
0699f7825b | ||
|
|
537578994c | ||
|
|
57e8628eec | ||
|
|
6b086283b9 | ||
|
|
eb6a1ba10c | ||
|
|
85aedd7dcf | ||
|
|
4ebb1c8c83 | ||
|
|
9a03816526 | ||
|
|
1455f339be | ||
|
|
21eab878bf | ||
|
|
777fefdcef | ||
|
|
f9f35929ed | ||
|
|
03e8200eb7 | ||
|
|
7826824d2f | ||
|
|
3f10d8ce73 | ||
|
|
ce7fcd525a | ||
|
|
b42341556b | ||
|
|
04dfcd275e | ||
|
|
8333736ef2 | ||
|
|
2fd8dd0574 | ||
|
|
1697d05c41 | ||
|
|
ef57fdc6da | ||
|
|
fb7ce8d575 | ||
|
|
72d7281a50 | ||
|
|
2e57bf8a24 | ||
|
|
8da3011a4f | ||
|
|
f6f91c0fd4 | ||
|
|
92bbbfb089 | ||
|
|
281083bf85 | ||
|
|
448f49d644 | ||
|
|
727db1bb4a | ||
|
|
fbb09280fd | ||
|
|
b030ae136a | ||
|
|
a3837c3a77 | ||
|
|
ce0f22d5f5 | ||
|
|
37fccb1898 | ||
|
|
5072cd79b1 | ||
|
|
2cafec9ae9 | ||
|
|
983e28df10 | ||
|
|
37f68f467b | ||
|
|
68e4508eaf | ||
|
|
6aa71ed621 | ||
|
|
02788e2bb2 | ||
|
|
95aa201cf4 | ||
|
|
26b0159c32 | ||
|
|
6733da3ec5 | ||
|
|
1b42d49ba9 | ||
|
|
4cf78065f1 | ||
|
|
da1fcd8e75 | ||
|
|
8fa209f213 | ||
|
|
5d16a365de | ||
|
|
077f0330f5 | ||
|
|
43b718db0c | ||
|
|
a192d96e71 | ||
|
|
7e85346487 | ||
|
|
a19a2490e0 | ||
|
|
bf07420a5e | ||
|
|
d9e06991e9 | ||
|
|
49853d7338 | ||
|
|
2be46d87e0 | ||
|
|
297f2784fb | ||
|
|
2f7f806aab | ||
|
|
72b6014ddf | ||
|
|
caa10b19b2 | ||
|
|
cbf371e29d | ||
|
|
5e39adead8 | ||
|
|
6b6d78b340 | ||
|
|
525c0edd1d | ||
|
|
53224e1642 | ||
|
|
72ad4426fe | ||
|
|
df4fea3437 | ||
|
|
8b030d5a28 | ||
|
|
721a9d8fb7 | ||
|
|
f93fce1ea6 | ||
|
|
4b5e81f1b3 | ||
|
|
55230c94e4 | ||
|
|
a580bebc74 | ||
|
|
31af716c23 | ||
|
|
09d0f90697 | ||
|
|
adb07f27c5 | ||
|
|
152541650a | ||
|
|
777ac955d0 | ||
|
|
d76940406d | ||
|
|
86d4341146 |
Binary file not shown.
@@ -0,0 +1,25 @@
|
||||
#include <stdio.h>
|
||||
|
||||
void change(char *p){
|
||||
//alex apple
|
||||
*p++ -= 32;//a-> -32 ->A
|
||||
while(*p != '#'){
|
||||
if(*(p-1) == ' '){
|
||||
*p -= 32;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
*p = '\0';
|
||||
}
|
||||
|
||||
int main(){
|
||||
char str[1024];
|
||||
|
||||
gets(str);//读取一行字符串 回车判定结束
|
||||
change(str);
|
||||
puts(str);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
#include <stdio.h>
|
||||
|
||||
//Ãݴη½
|
||||
int power(int n){
|
||||
int s = 1, i;
|
||||
for(i=1;i<=n;i++){
|
||||
s *= 2;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
//½×³Ë
|
||||
int factorial(int n){
|
||||
int s = 1, i;
|
||||
for(i=1;i<=n;i++){//1~n
|
||||
s*=i;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int n, i, s = 0;
|
||||
scanf("%d", &n);
|
||||
for(i=1;i<=n;i++){
|
||||
s += power(i) * factorial(i);
|
||||
}
|
||||
printf("%d\n", s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
int a[10], b[10];
|
||||
int i;
|
||||
int *p, *q;
|
||||
|
||||
for(i=0, p=a;i<10;i++){
|
||||
scanf("%d", p++);
|
||||
}
|
||||
for(i=0, p=a, q=b;i<10;i++){
|
||||
if(*p%2==0){
|
||||
*q++=*p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
for(i=0, p=b;i<q-b;i++){
|
||||
printf("%d ", *p++);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
#include <stdio.h>
|
||||
/*
|
||||
1 2 3 4 5 6 7 8 9 10
|
||||
1 3 4 5 6 7 8 9 10
|
||||
*/
|
||||
int main(){
|
||||
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||
int n = 10;
|
||||
int i;
|
||||
int *p, *q;
|
||||
p = a+1;
|
||||
q = a+2;
|
||||
for(i=0;i<8;i++){//用来控制循环的次数
|
||||
*p++ = *q++;
|
||||
}
|
||||
n--;
|
||||
for(i=0;i<n;i++){
|
||||
printf("%d ", *(a+i));
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
char str[] = "AbcDEfg";
|
||||
char *p = str;
|
||||
|
||||
while(*p != '\0'){
|
||||
if(*p >= 'a' && *p <= 'z'){
|
||||
*p -= 32;
|
||||
}else{
|
||||
*p += 32;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
puts(str);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(){
|
||||
char str[5][20];
|
||||
char (*p)[20], (*max)[20];//数据类型 (*变量名)[长度];数组指针
|
||||
int i;
|
||||
for(i=0, p =str;i<5;i++){
|
||||
scanf("%s", p++);
|
||||
}
|
||||
max = p;
|
||||
|
||||
for(i=1, p =str+1;i<5;i++){
|
||||
if(strcmp(*p, *max)){
|
||||
max = p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
printf("max = %s\n", max);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#include <stdio.h>
|
||||
#define MAXD(x, y) (x>y?x:y)
|
||||
|
||||
int main(){
|
||||
int a, b;
|
||||
scanf("%d %d", &a, &b);
|
||||
//(1>2?1:2) 将MAXD替换成三目运算符
|
||||
printf("%d \n", MAXD(a, b));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
#include <stdio.h>
|
||||
#define f(n) (n%5==0 && n%7==0?"能被整除\n":"不能被整除\n")
|
||||
int main(){
|
||||
//#define 指令 语句序列 会在语句序列中将所有参数替换成传入的
|
||||
int num;
|
||||
scanf("%d", &num);
|
||||
|
||||
puts(f(num));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#define CHANGE 0 //1代表打印密文 0明文
|
||||
//! Ctrl + .注释
|
||||
int main(){
|
||||
char str[100], i=0;
|
||||
scanf("%s", str);
|
||||
#if CHANGE
|
||||
while(str[i] != '\0'){
|
||||
if(str[i] >= 'a' && str[i] <= 'y' || str[i] >= 'A' && str[i] <= 'Y' ){
|
||||
str[i]++;
|
||||
}else if(str[i] == 'z' || str[i] == 'Z'){
|
||||
str[i]-=25;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
#endif
|
||||
puts(str);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#include <stdio.h>
|
||||
|
||||
typedef struct student{
|
||||
int num;
|
||||
char name[20];
|
||||
float socre[3];
|
||||
}student;
|
||||
//student 作为一个类型
|
||||
//如果不写typedef则结构体类型为 struct student
|
||||
|
||||
void output(student stuList[5]){
|
||||
int i;
|
||||
|
||||
for(i=0;i<5;i++){
|
||||
printf("%d\t%s\t%f\t%f\t%f\n", stuList[i].num, stuList[i].name, stuList[i].socre[0],
|
||||
stuList[i].socre[1], stuList[i].socre[2]);
|
||||
}
|
||||
}
|
||||
|
||||
void input(student stuList[5]){
|
||||
int i;
|
||||
for(i=0;i<5;i++){
|
||||
scanf("%d %s %f %f %f", &stuList[i].num, stuList[i].name, &stuList[i].socre[0],
|
||||
&stuList[i].socre[1], &stuList[i].socre[2]);
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
student stuList[5];//定义了一个结构体数组里面可以容纳5个结构体变量
|
||||
|
||||
input(stuList);
|
||||
output(stuList);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
#include <stdio.h>
|
||||
typedef struct score{
|
||||
float medScore;
|
||||
float endScore;
|
||||
}score;
|
||||
|
||||
int main(){
|
||||
score s;
|
||||
scanf("%f %f", &s.medScore, &s.endScore);
|
||||
|
||||
printf("avg=%.2f\n", (s.medScore + s.endScore)/2);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
FILE *in, *out;
|
||||
char str[100];
|
||||
in = fopen("file1.c", "r");//r:只读
|
||||
out = fopen("file2.c", "w");//w:覆盖
|
||||
|
||||
while(fgets(str, 100, in)){//fgets每次从文件获取一行并存储到str中
|
||||
puts(str);//使用控制台输出
|
||||
fputs(str, out);//向file2.c输出
|
||||
}
|
||||
fclose(in);//关闭文件指针
|
||||
fclose(out);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
|
||||
FILE *fp;
|
||||
char ch;
|
||||
int count=0;
|
||||
fp = fopen("letter.txt", "r");
|
||||
while((ch=fgetc(fp)) != EOF){
|
||||
if(ch == 'c'){
|
||||
count++;
|
||||
}
|
||||
}
|
||||
printf("c个数为:%d\n", count);
|
||||
fclose(fp);//关闭文件指针
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
char str[100];
|
||||
char *p = str;
|
||||
FILE *fp;
|
||||
fp = fopen("test.dat", "w");
|
||||
gets(str);
|
||||
|
||||
while(*p != '\0'){
|
||||
if(*p >= 'a' && *p <= 'z'){
|
||||
*p-=32;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
fputs(str, fp);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
ccadfadsfasfadsfafa
|
||||
@@ -0,0 +1 @@
|
||||
ADFADFAAAFDAFDSFSDF
|
||||
@@ -667,12 +667,73 @@ int main(){
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void change(char *p){
|
||||
//alex apple
|
||||
*p++ -= 32;//a-> -32 ->A
|
||||
while(*p != '#'){
|
||||
if(*(p-1) == ' '){
|
||||
*p -= 32;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
*p = '\0';
|
||||
}
|
||||
|
||||
int main(){
|
||||
char str[1024];
|
||||
|
||||
gets(str);//读取一行字符串 回车判定结束
|
||||
change(str);
|
||||
puts(str);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 函数-3
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
//幂次方
|
||||
int power(int n){
|
||||
int s = 1, i;
|
||||
for(i=1;i<=n;i++){
|
||||
s *= 2;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
//阶乘
|
||||
int factorial(int n){
|
||||
int s = 1, i;
|
||||
for(i=1;i<=n;i++){//1~n
|
||||
s*=i;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int n, i, s = 0;
|
||||
scanf("%d", &n);
|
||||
for(i=1;i<=n;i++){
|
||||
s += power(i) * factorial(i);
|
||||
}
|
||||
printf("%d\n", s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 指针
|
||||
@@ -681,24 +742,126 @@ int main(){
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
int a[10], b[10];
|
||||
int i;
|
||||
int *p, *q;
|
||||
|
||||
for(i=0, p=a;i<10;i++){
|
||||
scanf("%d", p++);
|
||||
}
|
||||
for(i=0, p=a, q=b;i<10;i++){
|
||||
if(*p%2==0){
|
||||
*q++=*p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
for(i=0, p=b;i<q-b;i++){
|
||||
printf("%d ", *p++);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 指针-2
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
/*
|
||||
1 2 3 4 5 6 7 8 9 10
|
||||
1 3 4 5 6 7 8 9 10
|
||||
*/
|
||||
int main(){
|
||||
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
|
||||
int n = 10;
|
||||
int i;
|
||||
int *p, *q;
|
||||
p = a+1;
|
||||
q = a+2;
|
||||
for(i=0;i<8;i++){//用来控制循环的次数
|
||||
*p++ = *q++;
|
||||
}
|
||||
n--;
|
||||
for(i=0;i<n;i++){
|
||||
printf("%d ", *(a+i));
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 指针-3
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
char str[] = "AbcDEfg";
|
||||
char *p = str;
|
||||
|
||||
while(*p != '\0'){
|
||||
if(*p >= 'a' && *p <= 'z'){
|
||||
*p -= 32;
|
||||
}else{
|
||||
*p += 32;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
puts(str);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 指针-4
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(){
|
||||
char str[5][20];
|
||||
char (*p)[20], (*max)[20];//数据类型 (*变量名)[长度];数组指针
|
||||
int i;
|
||||
for(i=0, p =str;i<5;i++){
|
||||
scanf("%s", p++);
|
||||
}
|
||||
max = p;
|
||||
|
||||
for(i=1, p =str+1;i<5;i++){
|
||||
if(strcmp(*p, *max)){
|
||||
max = p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
printf("max = %s\n", max);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 编译预处理
|
||||
@@ -707,36 +870,161 @@ int main(){
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#define MAXD(x, y) (x>y?x:y)
|
||||
|
||||
int main(){
|
||||
int a, b;
|
||||
scanf("%d %d", &a, &b);
|
||||
//(1>2?1:2) 将MAXD替换成三目运算符
|
||||
printf("%d \n", MAXD(a, b));
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 预处理-2
|
||||
|
||||

|
||||
```c
|
||||
#include <stdio.h>
|
||||
#define f(n) (n%5==0 && n%7==0?"能被整除\n":"不能被整除\n")
|
||||
int main(){
|
||||
//#define 指令 语句序列 会在语句序列中将所有参数替换成传入的
|
||||
int num;
|
||||
scanf("%d", &num);
|
||||
|
||||
puts(f(num));
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### 预处理-3
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
#define CHANGE 0 //1代表打印密文 0明文
|
||||
//! Ctrl + .注释
|
||||
int main(){
|
||||
char str[100], i=0;
|
||||
scanf("%s", str);
|
||||
#if CHANGE
|
||||
while(str[i] != '\0'){
|
||||
if(str[i] >= 'a' && str[i] <= 'y' || str[i] >= 'A' && str[i] <= 'Y' ){
|
||||
str[i]++;
|
||||
}else if(str[i] == 'z' || str[i] == 'Z'){
|
||||
str[i]-=25;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
#endif
|
||||
puts(str);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
## 结构体
|
||||
|
||||
### 结构体-1
|
||||
|
||||

|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
typedef struct student{
|
||||
int num;
|
||||
char name[20];
|
||||
float socre[3];
|
||||
}student;
|
||||
//student 作为一个类型
|
||||
//如果不写typedef则结构体类型为 struct student
|
||||
|
||||
void output(student stuList[5]){
|
||||
int i;
|
||||
|
||||
for(i=0;i<5;i++){
|
||||
printf("%d\t%s\t%f\t%f\t%f\n", stuList[i].num, stuList[i].name, stuList[i].socre[0],
|
||||
stuList[i].socre[1], stuList[i].socre[2]);
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
student stuList[5];//定义了一个结构体数组里面可以容纳5个结构体变量
|
||||
int i;
|
||||
for(i=0;i<5;i++){
|
||||
scanf("%d %s %f %f %f", &stuList[i].num, stuList[i].name, &stuList[i].socre[0],
|
||||
&stuList[i].socre[1], &stuList[i].socre[2]);
|
||||
}
|
||||
output(stuList);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
### 结构体-2
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
typedef struct student{
|
||||
int num;
|
||||
char name[20];
|
||||
float socre[3];
|
||||
}student;
|
||||
//student 作为一个类型
|
||||
//如果不写typedef则结构体类型为 struct student
|
||||
|
||||
void output(student stuList[5]){
|
||||
int i;
|
||||
|
||||
for(i=0;i<5;i++){
|
||||
printf("%d\t%s\t%f\t%f\t%f\n", stuList[i].num, stuList[i].name, stuList[i].socre[0],
|
||||
stuList[i].socre[1], stuList[i].socre[2]);
|
||||
}
|
||||
}
|
||||
|
||||
void input(student stuList[5]){
|
||||
int i;
|
||||
for(i=0;i<5;i++){
|
||||
scanf("%d %s %f %f %f", &stuList[i].num, stuList[i].name, &stuList[i].socre[0],
|
||||
&stuList[i].socre[1], &stuList[i].socre[2]);
|
||||
}
|
||||
}
|
||||
int main(){
|
||||
student stuList[5];//定义了一个结构体数组里面可以容纳5个结构体变量
|
||||
|
||||
input(stuList);
|
||||
output(stuList);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 结构体-3
|
||||
|
||||

|
||||
```c
|
||||
#include <stdio.h>
|
||||
typedef struct score{
|
||||
float medScore;
|
||||
float endScore;
|
||||
}score;
|
||||
|
||||
int main(){
|
||||
score s;
|
||||
scanf("%f %f", &s.medScore, &s.endScore);
|
||||
|
||||
printf("avg=%.2f\n", (s.medScore + s.endScore)/2);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## 文件
|
||||
@@ -747,17 +1035,82 @@ int main(){
|
||||
|
||||
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
FILE *in, *out;
|
||||
char str[100];
|
||||
in = fopen("file1.c", "r");//r:只读
|
||||
out = fopen("file2.c", "w");//w:覆盖
|
||||
|
||||
while(fgets(str, 100, in)){//fgets每次从文件获取一行并存储到str中
|
||||
puts(str);//使用控制台输出
|
||||
fputs(str, out);//向file2.c输出
|
||||
}
|
||||
fclose(in);//关闭文件指针
|
||||
fclose(out);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 文件-2
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
|
||||
FILE *fp;
|
||||
char ch;
|
||||
int count=0;
|
||||
fp = fopen("letter.txt", "r");
|
||||
while((ch=fgetc(fp)) != EOF){
|
||||
if(ch == 'c'){
|
||||
count++;
|
||||
}
|
||||
}
|
||||
printf("c个数为:%d\n", count);
|
||||
fclose(fp);//关闭文件指针
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 文件-3
|
||||
|
||||

|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
char str[100];
|
||||
char *p = str;
|
||||
FILE *fp;
|
||||
fp = fopen("test.dat", "w");
|
||||
gets(str);
|
||||
|
||||
while(*p != '\0'){
|
||||
if(*p >= 'a' && *p <= 'z'){
|
||||
*p-=32;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
fputs(str, fp);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -179,6 +179,79 @@ VALUES
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#5
|
||||
SELECT e.empid, e.`name`, e.title, d.depname, s.basesalary + s.titleSalary, s.basesalary + s.titleSalary-IFNULL(s.decuction, 0)
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid;
|
||||
#6
|
||||
SELECT e.`name`, s.basesalary
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid AND d.depname = '销售部';
|
||||
#7
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERe e.`name` LIKE '张%' AND TIMESTAMPDIFF(YEAR,e.birthday, NOW()) < 40;
|
||||
#8
|
||||
SELECT e.`name`, s.basesalary, s.titleSalary
|
||||
FROM employee e, salary s
|
||||
WHERE e.sex = '男' AND e.empid AND s.empid;
|
||||
#9
|
||||
SELECT e.`name`, e.title, d.depname
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid AND s.basesalary < 2000;
|
||||
#10
|
||||
SELECT COUNT(*)
|
||||
FROM employee;
|
||||
#11
|
||||
SELECT COUNT(*)
|
||||
FROM department d;
|
||||
#12
|
||||
SELECT AVG(s.basesalary + s.titleSalary), MAX(s.basesalary + s.titleSalary), MIN(s.basesalary + s.titleSalary)
|
||||
FROM employee e, salary s
|
||||
WHERE e.empid = s.empid;
|
||||
#13
|
||||
SELECT d.depname, AVG(s.basesalary + s.titleSalary)
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
GROUP BY d.depid;
|
||||
#14
|
||||
SELECT d.depname, AVG(s.basesalary + s.titleSalary) avg
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
GROUP BY d.depid
|
||||
HAVING avg<2000;
|
||||
#15
|
||||
SELECT e.empid, e.`name`, s.basesalary, s.titleSalary, s.decuction
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
ORDER BY s.titleSalary, s.basesalary;
|
||||
#16
|
||||
SELECT e.empid, e.`name`, e.birthday,
|
||||
IF(YEAR(e.birthday) < 1980, '老年',
|
||||
IF(YEAR(e.birthday)< 1990, '中年', '青壮年'))
|
||||
FROM employee e;
|
||||
#17
|
||||
SELECT e.*, depname
|
||||
FROM employee e, department d
|
||||
WHERE e.depid = d.depid;
|
||||
#18
|
||||
SELECT d.*, e.*
|
||||
FROM employee e, department d
|
||||
WHERE e.depid = d.depid;
|
||||
#19
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERE e.title LIKE '%工程师%' AND e.sex = '男';
|
||||
#20
|
||||
SELECT d.depname, e.sex, COUNT(*), AVG(s.basesalary)
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid
|
||||
GROUP BY d.depid, e.sex;
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 练习四
|
||||
@@ -188,11 +261,63 @@ VALUES
|
||||

|
||||
|
||||
```sql
|
||||
#1
|
||||
CREATE DATABASE test_school DEFAULT CHARACTER SET 'UTF8';
|
||||
#2
|
||||
DROP TABLE department;
|
||||
CREATE TABLE department(
|
||||
depNo INT(10) PRIMARY KEY COMMENT '部门号',
|
||||
depName VARCHAR(50) NOT NULL COMMENT '部门名称',
|
||||
depNote VARCHAR(20) COMMENT '部门备注'
|
||||
);
|
||||
CREATE TABLE teacher(
|
||||
number INT PRIMARY KEY COMMENT '教工号',
|
||||
`name` VARCHAR(30) NOT NULL COMMENT '姓名',
|
||||
sex VARCHAR(4) COMMENT '性别',
|
||||
birth DATE COMMENT '出生日期',
|
||||
depNo INT COMMENT '部门号',
|
||||
salary FLOAT COMMENT '工资',
|
||||
address VARCHAR(100) COMMENT '家庭住址'
|
||||
);
|
||||
INSERT INTO department()
|
||||
VALUES
|
||||
(601, '软件技术系', '软件技术等专业'),
|
||||
(602, '网络技术系', '多媒体技术等专业'),
|
||||
(603, '艺术设计系', '广告艺术设计等专业'),
|
||||
(604, '管理工程系', '连锁经营管理等专业');
|
||||
|
||||
INSERT INTO teacher()
|
||||
VALUES
|
||||
(2001, 'Tom', '女', '1970-01-10', 602, 4500, '四川省绵阳市'),
|
||||
(2002, 'Lucy', '男', '1983-12-18', 601, 2500, '北京市昌平区'),
|
||||
(2003, 'Mike', '男', '1990-06-01', 604, 1500, '重庆市渝中区'),
|
||||
(2004, 'James', '女', '1980-10-20', 602, 3500, '四川省成都市'),
|
||||
(2005, 'Jack', '男', '1975-05-30', 603, 1200, '重庆市南岸区');
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#4
|
||||
SELECT *
|
||||
FROM teacher;
|
||||
#5
|
||||
SELECT t.number '教工号', d.depName '部门名称'
|
||||
FROM teacher t, department d
|
||||
WHERE t.depNo = d.depNo AND t.address LIKE '%北京%';
|
||||
#6
|
||||
SELECT t.number, t.`name`
|
||||
FROM teacher t
|
||||
ORDER BY t.salary DESC
|
||||
LIMIT 1;
|
||||
#7
|
||||
SELECT t.number, t.`name`
|
||||
FROM teacher t
|
||||
WHERE t.salary BETWEEN 2500 AND 4000;
|
||||
#8
|
||||
SELECT t.`name`, t.sex, t.salary
|
||||
FROM teacher t, department d
|
||||
WHERE t.depNo = d.depNo AND d.depName = '网络技术系';
|
||||
```
|
||||
|
||||
---
|
||||
@@ -202,11 +327,89 @@ VALUES
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_student CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_student;
|
||||
|
||||
-- 创建表 Classes
|
||||
CREATE TABLE Classes (
|
||||
专业 VARCHAR(50),
|
||||
班级 VARCHAR(50),
|
||||
姓名 VARCHAR(50),
|
||||
性别 VARCHAR(10),
|
||||
座位 INT
|
||||
);
|
||||
|
||||
-- 向表 Classes 插入数据
|
||||
INSERT INTO Classes (专业, 班级, 姓名, 性别, 座位) VALUES
|
||||
('计算机网络', '1班', '张三', '男', 8),
|
||||
('软件工程', '2班', '李四', '男', 12),
|
||||
('计算机维护', '1班', '王五', '男', 9),
|
||||
('计算机网络', '2班', 'LILY', '女', 15),
|
||||
('软件工程', '1班', '小强', '男', 20),
|
||||
('计算机维护', '1班', 'CoCo', '女', 18);
|
||||
|
||||
-- 创建表 Score
|
||||
CREATE TABLE Score (
|
||||
姓名 VARCHAR(50),
|
||||
英语 INT,
|
||||
数学 INT,
|
||||
语文 INT
|
||||
);
|
||||
|
||||
-- 向表 Score 插入数据
|
||||
INSERT INTO Score (姓名, 英语, 数学, 语文) VALUES
|
||||
('张三', 65, 75, 98),
|
||||
('李四', 87, 45, 86),
|
||||
('王五', 98, 85, 65),
|
||||
('LILY', 75, 86, 87),
|
||||
('小强', 85, 60, 58),
|
||||
('CoCo', 96, 87, 70);
|
||||
|
||||
-- 创建表 Records
|
||||
CREATE TABLE Records (
|
||||
姓名 VARCHAR(50),
|
||||
记录 VARCHAR(50)
|
||||
);
|
||||
|
||||
-- 向表 Records 插入数据
|
||||
INSERT INTO Records (姓名, 记录) VALUES
|
||||
('小强', '迟到'),
|
||||
('小强', '事假'),
|
||||
('李四', '旷课'),
|
||||
('李四', '旷课'),
|
||||
('李四', '迟到'),
|
||||
('CoCo', '病假'),
|
||||
('LILY', '事假');
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#3
|
||||
UPDATE score s
|
||||
SET s.`语文` = 88
|
||||
WHERE s.`姓名` = '张三';
|
||||
|
||||
#4
|
||||
SELECT AVG(s.`英语`), AVG(s.`数学`), AVG(s.`语文`)
|
||||
FROM classes c, score s
|
||||
WHERE c.`姓名` = s.`姓名` AND c.`班级` = 1 AND c.`专业` = '计算机维护';
|
||||
|
||||
#5
|
||||
SELECT *
|
||||
FROM score s
|
||||
WHERE s.`数学` < 60 OR s.`英语` < 60 OR s.`语文` < 60;
|
||||
|
||||
#6
|
||||
SELECT *
|
||||
FROM score s
|
||||
WHERE s.`姓名` IN (
|
||||
SELECT r.`姓名`
|
||||
FROM records r
|
||||
GROUP BY r.`姓名`
|
||||
HAVING COUNT(*) > 2
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
@@ -216,6 +419,60 @@ VALUES
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_xuankedb 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_xuankedb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_xuankedb;
|
||||
|
||||
-- 创建学生表 Student
|
||||
CREATE TABLE Student (
|
||||
Sn0 VARCHAR(20) PRIMARY KEY, -- 学号,主键
|
||||
Sname VARCHAR(50), -- 姓名
|
||||
Ssex VARCHAR(10), -- 性别
|
||||
Sage INT, -- 年龄
|
||||
Sdept VARCHAR(50) -- 所在系
|
||||
);
|
||||
|
||||
-- 创建课程表 Course
|
||||
CREATE TABLE Course (
|
||||
Cn0 VARCHAR(20) PRIMARY KEY, -- 课程号,主键
|
||||
Cname VARCHAR(100), -- 课程名
|
||||
Cpn0 VARCHAR(20), -- 选修课号
|
||||
Ccredit INT -- 学分
|
||||
);
|
||||
|
||||
-- 创建成绩表 SG
|
||||
CREATE TABLE SG (
|
||||
Sn0 VARCHAR(20), -- 学号
|
||||
Cn0 VARCHAR(20), -- 课程号
|
||||
Grade INT, -- 成绩
|
||||
PRIMARY KEY (Sn0, Cn0), -- 复合主键 (学号, 课程号)
|
||||
FOREIGN KEY (Sn0) REFERENCES Student(Sn0), -- 外键,引用 Student 表
|
||||
FOREIGN KEY (Cn0) REFERENCES Course(Cn0) -- 外键,引用 Course 表
|
||||
);
|
||||
|
||||
INSERT INTO Student (Sno, Sname, Ssex, Sage, Sdept, Scome) VALUES
|
||||
('05001', '张三', '男', 20, '计算机系', '2021-09-01'),
|
||||
('05002', '李四', '女', 21, '数学系', '2021-09-01'),
|
||||
('05003', '王五', '男', 22, '计算机系', '2021-09-01'),
|
||||
('05004', '李洋', '男', 19, '物理系', '2021-09-01'),
|
||||
('05019', '赵六', '女', 20, '计算机系', '2021-09-01');
|
||||
|
||||
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES
|
||||
('1', '数据库', NULL, 4),
|
||||
('2', '数学', NULL, 3),
|
||||
('3', '物理', NULL, 3),
|
||||
('4', '操作系统', '1', 4);
|
||||
|
||||
INSERT INTO SG (Sno, Cno, Grade) VALUES
|
||||
('05001', '1', 85),
|
||||
('05001', '2', 90),
|
||||
('05002', '1', 78),
|
||||
('05002', '3', 88),
|
||||
('05003', '1', 92),
|
||||
('05003', '4', 76),
|
||||
('05004', '3', 95),
|
||||
('05019', '1', 80),
|
||||
('05019', '4', 85);
|
||||
```
|
||||
|
||||
---
|
||||
@@ -227,6 +484,80 @@ VALUES
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_library 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_library CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_library;
|
||||
|
||||
-- 创建表 press(出版社)
|
||||
CREATE TABLE press (
|
||||
pressid INT PRIMARY KEY, -- 出版社编号,主键
|
||||
pressname VARCHAR(100), -- 出版社名称
|
||||
address VARCHAR(100) -- 出版社地址
|
||||
);
|
||||
|
||||
-- 创建表 sort(种类)
|
||||
CREATE TABLE sort (
|
||||
sortno INT PRIMARY KEY, -- 种类编号,主键
|
||||
scount INT, -- 数量
|
||||
describes VARCHAR(100) -- 描述
|
||||
);
|
||||
|
||||
-- 创建表 book(图书)
|
||||
CREATE TABLE book (
|
||||
bid INT PRIMARY KEY, -- 图书编号,主键
|
||||
bname VARCHAR(100), -- 图书名称
|
||||
bsortno INT, -- 种类编号
|
||||
pressid INT, -- 出版社编号
|
||||
FOREIGN KEY (bsortno) REFERENCES sort(sortno), -- 外键,引用 sort 表
|
||||
FOREIGN KEY (pressid) REFERENCES press(pressid) -- 外键,引用 press 表
|
||||
);
|
||||
|
||||
-- 向 press 表插入数据
|
||||
INSERT INTO press (pressid, pressname, address) VALUES
|
||||
(100, '外研社', '上海'),
|
||||
(101, '北大出版社', '北京'),
|
||||
(102, '教育出版社', '北京');
|
||||
|
||||
-- 向 sort 表插入数据
|
||||
INSERT INTO sort (sortno, scount, describes) VALUES
|
||||
(11, 50, '小说'),
|
||||
(12, 100, '科幻'),
|
||||
(13, 100, '神话');
|
||||
|
||||
-- 向 book 表插入数据
|
||||
INSERT INTO book (bid, bname, bsortno, pressid) VALUES
|
||||
(1, '红与黑', 11, 100),
|
||||
(2, '幻城', 12, 102),
|
||||
(3, '希腊神话', 13, 102);
|
||||
|
||||
#5
|
||||
SELECT b.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid AND p.pressid = 100;
|
||||
|
||||
#6
|
||||
SELECT b.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid AND p.pressname = '外研社';
|
||||
|
||||
#7
|
||||
SELECT *
|
||||
FROM sort s
|
||||
WHERE s.scount > 100;
|
||||
|
||||
#8
|
||||
SELECT p.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid
|
||||
GROUP BY b.pressid
|
||||
HAVING COUNT(*) = (
|
||||
SELECT COUNT(*)
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid
|
||||
GROUP BY b.pressid
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 1
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
@@ -238,5 +569,83 @@ VALUES
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_tour 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_tour CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_tour;
|
||||
|
||||
-- 创建表 agency(旅行社表)
|
||||
CREATE TABLE agency (
|
||||
id INT PRIMARY KEY, -- 旅行社编号,主键
|
||||
name VARCHAR(100) NOT NULL, -- 旅行社名
|
||||
address VARCHAR(100) NOT NULL, -- 旅行社地址
|
||||
areaid INT -- 所属区域编号
|
||||
);
|
||||
|
||||
-- 创建表 travel(旅行线路表)
|
||||
CREATE TABLE travel (
|
||||
tid INT PRIMARY KEY, -- 旅行线路编号,主键
|
||||
time VARCHAR(50) NOT NULL, -- 所需时间
|
||||
position VARCHAR(100) NOT NULL, -- 目的地
|
||||
money FLOAT, -- 花费
|
||||
aid INT NOT NULL, -- 所属旅行社编号
|
||||
count INT, -- 报名人数
|
||||
FOREIGN KEY (aid) REFERENCES agency(id) -- 外键,引用 agency 表
|
||||
);
|
||||
|
||||
-- 向 agency 表插入数据
|
||||
INSERT INTO agency (id, name, address) VALUES
|
||||
(101, '青年旅行社', '北京海淀'),
|
||||
(102, '天天旅行社', '天津海院');
|
||||
|
||||
-- 向 travel 表插入数据
|
||||
INSERT INTO travel (tid, time, position, money, aid, count) VALUES
|
||||
(1, '5天', '八达岭', 3000, 101, 10),
|
||||
(2, '7天', '水长城', 5000, 101, 14),
|
||||
(3, '8天', '水长城', 6000, 102, 11);
|
||||
|
||||
#4
|
||||
SELECT a.*
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
GROUP BY a.id
|
||||
HAVING COUNT(*) = (
|
||||
SELECT COUNT(*)
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
GROUP BY a.id
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#5
|
||||
SELECT t.*
|
||||
FROM travel t
|
||||
WHERE t.count = (
|
||||
SELECT t.count
|
||||
FROM travel t
|
||||
ORDER BY t.count DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#6
|
||||
SELECT *
|
||||
FROM travel t
|
||||
WHERE t.money < 5000;
|
||||
|
||||
#7
|
||||
SELECT a.`name`
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id AND t.money = (
|
||||
SELECT t.money
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
ORDER BY t.money DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#8
|
||||
SELECT SUM(t.time)
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id AND a.`name` = '青年旅行社';
|
||||
```
|
||||
|
||||
|
||||
+155
@@ -0,0 +1,155 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
|
||||
CREATE FUNCTION calculate_annual_salary (
|
||||
monthly_salary DECIMAL(10, 2)
|
||||
)
|
||||
RETURNS DECIMAL(10, 2)
|
||||
DETERMINISTIC | NOT DETERMINISTIC #结果确定/不确定
|
||||
BEGIN
|
||||
RETURN monthly_salary * 12;
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 表结构与数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 计算员工年薪
|
||||
|
||||
创建一个存储函数 `calculate_annual_salary`,接受员工的月薪作为参数,返回其年薪(假设年薪为月薪的 12 倍)。
|
||||
|
||||
#### 练习题 2: 计算员工工龄
|
||||
|
||||
创建一个存储函数 `calculate_years_of_service`,接受员工的入职日期作为参数,返回该员工的工龄(以年为单位)。
|
||||
|
||||
#### 练习题 3: 根据部门计算平均工资
|
||||
|
||||
创建一个存储函数 `calculate_avg_salary_by_dept`,接受部门 ID 作为参数,返回该部门的平均工资。
|
||||
|
||||
#### 练习题 4: 根据职位计算平均工资
|
||||
|
||||
创建一个存储函数 `calculate_avg_salary_by_job`,接受职位 ID 作为参数,返回该职位的平均工资。
|
||||
|
||||
#### 练习题 5: 计算员工税后工资
|
||||
|
||||
创建一个存储函数 `calculate_net_salary`,接受员工的工资作为参数,返回其税后工资(假设税率为 15%)。
|
||||
|
||||
#### 练习题 6: 判断员工是否满足加薪条件
|
||||
|
||||
创建一个存储函数 `is_eligible_for_raise`,接受员工的工资和工龄作为参数,返回一个布尔值(1 或 0)。加薪条件如下:
|
||||
|
||||
- 如果工资低于 60000 且工龄大于等于 3 年,返回 1(满足条件)。
|
||||
- 否则返回 0(不满足条件)。
|
||||
|
||||
#### 练习题 7: 计算部门总工资
|
||||
|
||||
创建一个存储函数 `calculate_total_salary_by_dept`,接受部门 ID 作为参数,返回该部门所有员工的总工资。
|
||||
|
||||
#### 练习题 8: 计算职位总工资
|
||||
|
||||
创建一个存储函数 `calculate_total_salary_by_job`,接受职位 ID 作为参数,返回该职位所有员工的总工资。
|
||||
|
||||
#### 练习题 9: 判断员工是否属于高薪部门
|
||||
|
||||
创建一个存储函数 `is_high_salary_department`,接受部门 ID 作为参数,返回一个布尔值(1 或 0)。如果该部门的平均工资大于等于 70000,返回 1(高薪部门),否则返回 0(非高薪部门)。
|
||||
|
||||
#### 练习题 10: 计算员工的总收入
|
||||
|
||||
创建一个存储函数 `calculate_total_income`,接受员工的工资和奖金(假设奖金为工资的 10%)作为参数,返回其总收入(工资 + 奖金)。
|
||||
+529
@@ -0,0 +1,529 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
|
||||
CREATE PROCEDURE GetEmployeeCountByDept (
|
||||
IN dept_id INT,
|
||||
OUT employee_count INT
|
||||
)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO employee_count
|
||||
FROM employee
|
||||
WHERE dept_id = dept_id;
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
IF condition THEN
|
||||
-- 条件为真时执行的代码
|
||||
ELSEIF another_condition THEN
|
||||
-- 另一个条件为真时执行的代码
|
||||
ELSE
|
||||
-- 所有条件都不满足时执行的代码
|
||||
END IF;
|
||||
|
||||
CASE expression
|
||||
WHEN value1 THEN
|
||||
-- 当 expression = value1 时执行的代码
|
||||
WHEN value2 THEN
|
||||
-- 当 expression = value2 时执行的代码
|
||||
ELSE
|
||||
-- 当 expression 不匹配任何值时执行的代码
|
||||
END CASE;
|
||||
|
||||
CASE
|
||||
WHEN condition1 THEN
|
||||
-- 当 condition1 为真时执行的代码
|
||||
WHEN condition2 THEN
|
||||
-- 当 condition2 为真时执行的代码
|
||||
ELSE
|
||||
-- 当所有条件都不满足时执行的代码
|
||||
END CASE;
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 表结构与数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 插入新员工
|
||||
|
||||
创建一个存储过程 `add_employee`,接受员工姓名、工资、入职日期、部门ID和职位ID作为参数,并将其插入到 `employee` 表中。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS add_employee;
|
||||
CREATE PROCEDURE add_employee(IN emp_name VARCHAR(100), IN salary DECIMAL(10,2), IN hire_date DATE, IN dept_id INT, IN job_id INT)
|
||||
BEGIN
|
||||
INSERT INTO employee()
|
||||
VALUES(DEFAULT, emp_name, salary, hire_date, dept_id, job_id);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL add_employee('李泽龙', 6666, '2025-3-20', 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 2: 更新员工工资
|
||||
|
||||
创建一个存储过程 `update_employee_salary`,接受员工ID和新的工资作为参数,更新该员工的工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS update_employee_salary;
|
||||
CREATE PROCEDURE update_employee_salary(IN emp_id INT, IN salary DECIMAL(10, 2))
|
||||
BEGIN
|
||||
UPDATE employee e
|
||||
SET e.salary = salary
|
||||
WHERE e.emp_id = emp_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL update_employee_salary(1, 60000);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 3: 删除员工
|
||||
|
||||
创建一个存储过程 `delete_employee`,接受员工ID作为参数,删除该员工的记录。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS delete_employee;
|
||||
CREATE PROCEDURE delete_employee(IN id INT)
|
||||
BEGIN
|
||||
DELETE FROM employee
|
||||
WHERE emp_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL delete_employee(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 4: 查询部门员工
|
||||
|
||||
创建一个存储过程 `get_department_employees`,接受部门ID作为参数,返回该部门所有员工的详细信息。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_employees;
|
||||
CREATE PROCEDURE get_department_employees(IN id INT)
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_employees(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 5: 查询职位员工
|
||||
|
||||
创建一个存储过程 `get_job_employees`,接受职位ID作为参数,返回该职位所有员工的详细信息。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_employees;
|
||||
CREATE PROCEDURE get_job_employees(IN id INT)
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_employees(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 6: 计算部门平均工资
|
||||
|
||||
创建一个存储过程 `calculate_avg_salary_by_dept`,接受部门ID作为参数,返回该部门的平均工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS calculate_avg_salary_by_dept;
|
||||
CREATE PROCEDURE calculate_avg_salary_by_dept(IN id INT)
|
||||
BEGIN
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL calculate_avg_salary_by_dept(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 7: 计算职位平均工资
|
||||
|
||||
创建一个存储过程 `calculate_avg_salary_by_job`,接受职位ID作为参数,返回该职位的平均工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS calculate_avg_salary_by_job;
|
||||
CREATE PROCEDURE calculate_avg_salary_by_job(IN id INT)
|
||||
BEGIN
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL calculate_avg_salary_by_job(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 8: 查询高薪员工
|
||||
|
||||
创建一个存储过程 `get_high_salary_employees`,接受一个工资阈值作为参数,返回所有工资高于该阈值的员工。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_high_salary_employees;
|
||||
CREATE PROCEDURE get_high_salary_employees(IN sal DECIMAL(10, 2))
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.salary > sal;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_high_salary_employees(50000);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 9: 查询员工工龄
|
||||
|
||||
创建一个存储过程 `get_employee_years_of_service`,接受员工ID作为参数,返回该员工的工龄(以年为单位)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_years_of_service;
|
||||
CREATE PROCEDURE get_employee_years_of_service(IN id INT)
|
||||
BEGIN
|
||||
SELECT -TIMESTAMPDIFF(YEAR,NOW(),e.hire_date)
|
||||
FROM employee e
|
||||
WHERE e.emp_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employee_years_of_service(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 10: 查询部门员工总数
|
||||
|
||||
创建一个存储过程 `get_department_employee_count`,接受部门ID作为参数,返回该部门的员工总数。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_employee_count;
|
||||
CREATE PROCEDURE get_department_employee_count(IN id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_employee_count(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 11: 查询职位员工总数
|
||||
|
||||
创建一个存储过程 `get_job_employee_count`,接受职位ID作为参数,返回该职位的员工总数。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_employee_count;
|
||||
CREATE PROCEDURE get_job_employee_count(IN id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_employee_count(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 12: 查询员工详细信息
|
||||
|
||||
创建一个存储过程 `get_employee_details`,接受员工ID作为参数,返回该员工的姓名、工资、部门名称和职位名称。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_details;
|
||||
CREATE PROCEDURE get_employee_details(IN emp_id INT)
|
||||
BEGIN
|
||||
SELECT e.emp_name, e.salary, d.dept_name, j.job_title
|
||||
FROM employee e, department d, job j
|
||||
WHERE e.emp_id = emp_id AND e.dept_id = d.dept_id AND e.job_id = j.job_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employee_details(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 13: 查询部门最高工资
|
||||
|
||||
创建一个存储过程 `get_department_max_salary`,接受部门ID作为参数,返回该部门的最高工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_max_salary;
|
||||
CREATE PROCEDURE get_department_max_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_max_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 14: 查询职位最低工资
|
||||
|
||||
创建一个存储过程 `get_job_min_salary`,接受职位ID作为参数,返回该职位的最低工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_min_salary;
|
||||
CREATE PROCEDURE get_job_min_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT MIN(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_min_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 15: 查询员工工资排名
|
||||
|
||||
创建一个存储过程 `get_employee_salary_rank`,接受员工ID作为参数,返回该员工在公司中的工资排名。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_salary_rank;
|
||||
CREATE PROCEDURE get_employee_salary_rank(IN emp_id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) + 1
|
||||
FROM employee e
|
||||
WHERE e.salary > (
|
||||
SELECT e.salary
|
||||
FROM employee e
|
||||
WHERE e.emp_id = emp_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL get_employee_salary_rank(2);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 16: 查询部门工资总和
|
||||
|
||||
创建一个存储过程 `get_department_total_salary`,接受部门ID作为参数,返回该部门所有员工的工资总和。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_total_salary;
|
||||
CREATE PROCEDURE get_department_total_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT SUM(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_total_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 17: 查询职位工资总和
|
||||
|
||||
创建一个存储过程 `get_job_total_salary`,接受职位ID作为参数,返回该职位所有员工的工资总和。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_total_salary;
|
||||
CREATE PROCEDURE get_job_total_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT SUM(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_total_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 18: 查询员工入职年份分布
|
||||
|
||||
创建一个存储过程 `get_employees_by_hire_year`,接受年份作为参数,返回该年份入职的所有员工。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employees_by_hire_year;
|
||||
CREATE PROCEDURE get_employees_by_hire_year(IN y INT)
|
||||
BEGIN
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERE YEAR(e.hire_date) = y;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employees_by_hire_year(2020);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 19: 查询部门工资分布
|
||||
|
||||
创建一个存储过程 `get_department_salary_distribution`,接受部门ID作为参数,返回该部门工资的分布情况(如最高、最低、平均工资)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_salary_distribution;
|
||||
CREATE PROCEDURE get_department_salary_distribution(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary), MIN(e.salary), AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_salary_distribution(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 20: 查询职位工资分布
|
||||
|
||||
创建一个存储过程 `get_job_salary_distribution`,接受职位ID作为参数,返回该职位工资的分布情况(如最高、最低、平均工资)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_salary_distribution;
|
||||
CREATE PROCEDURE get_job_salary_distribution(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary), MIN(e.salary), AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_salary_distribution(1);
|
||||
```
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
+200
@@ -0,0 +1,200 @@
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
单招落榜 都怪资本!!!
|
||||
三年的青春给你了!!!
|
||||
@@ -0,0 +1 @@
|
||||
Hello
|
||||
@@ -0,0 +1,31 @@
|
||||
#include <stdio.h>
|
||||
//向out.txt输出1000以内素数 每10个换一行
|
||||
int prime(int n){
|
||||
int i;
|
||||
for(i=2;i<n;i++){
|
||||
if(n%i==0){
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main() {
|
||||
//1.定义文件指针
|
||||
FILE *fp;//定义一个文件指针
|
||||
int i, k=0;
|
||||
fp = fopen("out.txt", "w");//w覆盖
|
||||
for(i=2;i<1000;i++){
|
||||
if(prime(i)){
|
||||
fprintf(fp, "%d\t", i);
|
||||
k++;
|
||||
if(k%10==0){
|
||||
fprintf(fp,"\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
int main(){
|
||||
//定义文件指针
|
||||
FILE *fp, *out;
|
||||
int i;
|
||||
char str[100], out_str[1024];
|
||||
fp = fopen("input.txt", "r");//r只读 w覆写 a增加
|
||||
out = fopen("out.txt", "w");
|
||||
//EOF是文件结束的标记 #define EOF -1
|
||||
//fscanf(文件指针, 读取格式, 变量地址) 读到末尾会返回-1
|
||||
//fgets(字符串, 最大长度, 文件指针) 读到末尾会返回0
|
||||
while(fgets(str, 100, fp)){
|
||||
strcat(out_str, str);
|
||||
}
|
||||
for(i=0;i<100;i++){
|
||||
fprintf(out, "%s\n", out_str);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
+610
@@ -0,0 +1,610 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
CREATE TRIGGER trigger_name
|
||||
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
-- 触发器的逻辑代码
|
||||
-- 可以包含 SQL 语句、流程控制语句(如 IF、CASE 等)、变量声明等
|
||||
END//
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
### 表结构和数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
### `SIGNAL` 语句的基本语法
|
||||
|
||||
```sql
|
||||
SIGNAL SQLSTATE '状态码'
|
||||
SET MESSAGE_TEXT = '错误消息';
|
||||
```
|
||||
|
||||
- **SQLSTATE**:一个 5 字符的字符串,表示错误的状态码。MySQL 使用 `'45000'` 表示用户定义的错误。
|
||||
- **MESSAGE_TEXT**:自定义的错误消息,用于描述错误的原因。
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 工资范围验证
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据之前,检查员工的工资是否在其对应职位的 `min_salary` 和 `max_salary` 范围内。如果超出范围,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
|
||||
IF NEW.salary > (
|
||||
SELECT j.max_salary
|
||||
FROM job j
|
||||
WHERE j.job_id = NEW.job_id
|
||||
) OR NEW.salary < (
|
||||
SELECT j.min_salary
|
||||
FROM job j
|
||||
WHERE j.job_id = NEW.job_id
|
||||
) THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '工资值错误,不在职务工资范围内';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 0, NOW(), 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 2: 自动更新部门人数
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新 `department` 表中的部门人数(假设 `department` 表新增一个字段 `employee_count`)。
|
||||
|
||||
```sql
|
||||
ALTER TABLE department ADD employee_count INT UNSIGNED;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE department d
|
||||
SET d.employee_count = (
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = d.dept_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, NOW(), 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 3: 工资变更日志
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `salary` 字段后,将变更记录插入到一个新的日志表 `salary_log` 中,记录员工 ID、旧工资、新工资和变更时间。
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS salary_log;
|
||||
CREATE TABLE salary_log(
|
||||
emp_id INT,
|
||||
old_salary DECIMAL(10, 2),
|
||||
new_slaray DECIMAL(10, 2),
|
||||
update_date DATE
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
BEFORE UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.salary <> OLD.salary THEN
|
||||
INSERT INTO salary_log()
|
||||
VALUES(NEW.emp_id, OLD.salary, NEW.salary, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
UPDATE employee e
|
||||
SET e.salary = 10
|
||||
WHERE e.emp_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 4: 删除员工时备份数据
|
||||
|
||||
创建一个触发器 `before_employee_delete`,在删除 `employee` 表数据之前,将被删除的员工数据插入到一个备份表 `employee_backup` 中。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_backup AS
|
||||
SELECT *
|
||||
FROM employee
|
||||
WHERE 0;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_delete;
|
||||
CREATE TRIGGER before_employee_delete
|
||||
BEFORE DELETE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO employee_backup()
|
||||
VALUES(OLD.emp_id, OLD.emp_name, OLD.salary, OLD.hire_date, OLD.dept_id, OLD.job_id);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
DELETE FROM employee
|
||||
WHERE emp_id = 20;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 5: 自动设置默认职位
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,如果未指定 `job_id`,则自动将其设置为 `job` 表中的默认职位(假设默认职位的 `job_id` 为 1)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.job_id IS NULL THEN
|
||||
SET NEW.job_id = 1;
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, NOW(), 1, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 6: 防止修改入职日期
|
||||
|
||||
创建一个触发器 `before_employee_update`,在更新 `employee` 表数据时,防止修改 `hire_date` 字段。如果尝试修改,抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_update;
|
||||
CREATE TRIGGER before_employee_update
|
||||
BEFORE UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.hire_date <> OLD.hire_date THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT='不允许修改用户的入职时间';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
UPDATE employee e
|
||||
SET e.hire_date = '2025-3-20'
|
||||
WHERE e.emp_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 7: 自动计算工龄
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,自动计算员工的工龄(以年为单位),并将其存储到一个新字段 `years_of_service` 中。
|
||||
|
||||
```sql
|
||||
ALTER TABLE employee ADD years_of_service INT;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
SET NEW.years_of_service = TIMESTAMPDIFF(YEAR,NEW.hire_date,NOW());
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT TIMESTAMPDIFF(YEAR,e.hire_date,NOW())
|
||||
FROM employee e;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, '2022-12-31', 1, 1, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 8: 防止删除部门
|
||||
|
||||
创建一个触发器 `before_department_delete`,在删除 `department` 表数据之前,检查该部门是否还有员工。如果有员工,阻止删除并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_department_delete;
|
||||
CREATE TRIGGER before_department_delete
|
||||
BEFORE DELETE ON department
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM employee e WHERE e.dept_id = OLD.dept_id) > 0 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '该部门有员工无法删除';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
DELETE FROM department
|
||||
WHERE dept_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 9: 自动更新职位工资范围
|
||||
|
||||
创建一个触发器 `after_job_update`,在更新 `job` 表的 `min_salary` 或 `max_salary` 字段后,自动调整 `employee` 表中相关员工的工资,使其符合新的工资范围。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_job_update;
|
||||
CREATE TRIGGER after_job_update
|
||||
AFTER UPDATE ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE employee
|
||||
SET salary = IF(salary > NEW.max_salary, NEW.max_salary, IF(salary < NEW.min_salary, min_salary, salary))
|
||||
WHERE job_id = NEW.job_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 10: 记录部门变更
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `dept_id` 字段后,将变更记录插入到一个新的日志表 `department_change_log` 中,记录员工 ID、旧部门 ID、新部门 ID 和变更时间。
|
||||
|
||||
```sql
|
||||
CREATE TABLE department_change_log(
|
||||
emp_id INT,
|
||||
old_dept_id INT,
|
||||
new_dept_id INT,
|
||||
update_date DATE
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
AFTER UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.dept_id <> OLD.dept_id THEN
|
||||
INSERT INTO department_change_log()
|
||||
VALUES(NEW.emp_id, OLD.dept_id, NEW.dept_id, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 11: 防止插入重复职位
|
||||
|
||||
创建一个触发器 `before_job_insert`,在插入 `job` 表数据之前,检查职位名称是否已存在。如果存在,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_job_insert;
|
||||
CREATE TRIGGER before_job_insert
|
||||
BEFORE INSERT ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM job WHERE job_id = NEW.job_id) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '职位名称已存在';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 12: 自动更新员工总数
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新一个统计表 `employee_statistics` 中的员工总数。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_statistics(
|
||||
marking VARCHAR(20),
|
||||
num INT
|
||||
);
|
||||
INSERT INTO employee_statistics()
|
||||
VALUES('count', 0);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE employee_statistics
|
||||
SET num = (SELECT COUNT(*) FROM employee)
|
||||
WHERE marking = 'count';
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 13: 防止修改部门所在地
|
||||
|
||||
创建一个触发器 `before_department_update`,在更新 `department` 表数据时,防止修改 `location` 字段。如果尝试修改,抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_department_update;
|
||||
CREATE TRIGGER before_department_update
|
||||
BEFORE UPDATE ON department
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.location <> OLD.location THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '无法更新部分的位置';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 14: 自动调整工资
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,如果工资低于职位的最低工资,则自动将其调整为最低工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.salary < (SELECT min_salary FROM job WHERE job_id = NEW.job_id ) THEN
|
||||
SET NEW.salary = min_salary;
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 15: 记录职位变更
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `job_id` 字段后,将变更记录插入到一个新的日志表 `job_change_log` 中,记录员工 ID、旧职位 ID、新职位 ID 和变更时间。
|
||||
|
||||
```sql
|
||||
CREATE TABLE job_change_log(
|
||||
emp_id INT,
|
||||
old_job_id INT,
|
||||
new_job_id INT,
|
||||
update_date DATE
|
||||
);
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
AFTER UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.job_id <> OLD.job_id THEN
|
||||
INSERT INTO job_change_log()
|
||||
VALUES(NEW.emp_id, OLD.job_id, NEW.job_id, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 16: 防止删除职位
|
||||
|
||||
创建一个触发器 `before_job_delete`,在删除 `job` 表数据之前,检查该职位是否还有员工。如果有员工,阻止删除并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_job_delete;
|
||||
CREATE TRIGGER before_job_delete
|
||||
BEFORE DELETE ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM employee WHERE job_id = OLD.job_id) > 0 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '该职位还有员工';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 17: 自动更新部门平均工资
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新 `department` 表中的部门平均工资(假设 `department` 表新增一个字段 `avg_salary`)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE department d
|
||||
SET d.avg_salary = (SELECT AVG(e.salary) FROM employee e WHERE d.dept_id = e.dept_id)
|
||||
WHERE NEW.dept_id = d.dept_id;
|
||||
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 18: 防止插入未来入职日期
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,检查 `hire_date` 是否晚于当前日期。如果是,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.hire_date < CURDATE() THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '入职日期不得晚于当前日期';
|
||||
END IF;
|
||||
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 19: 自动生成员工编号
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,自动生成一个唯一的员工编号(格式为 `EMP-年份-序号`,例如 `EMP-2023-001`),并将其存储到一个新字段 `emp_code` 中。
|
||||
|
||||
```sql
|
||||
ALTER TABLE employee ADD emp_code VARCHAR(30);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
SET NEW.emp_code = CONCAT('EMP-',YEAR(NOW()),'-', (LAST_INSERT_ID()+1));
|
||||
END $$
|
||||
DELIMITER ;
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 0, NOW(), 1, 1, NULL, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 20: 记录员工离职
|
||||
|
||||
创建一个触发器 `after_employee_delete`,在删除 `employee` 表数据之后,将被删除的员工信息插入到一个离职记录表 `employee_exit_log` 中,记录员工 ID、姓名、离职时间和原因(假设原因由用户输入)。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_exit_log(
|
||||
emp_id INT,
|
||||
emp_name VARCHAR(20),
|
||||
quit_date DATE,
|
||||
quit_reason VARCHAR(50)
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_delete;
|
||||
CREATE TRIGGER after_employee_delete
|
||||
AFTER DELETE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO employee_exit_log()
|
||||
VALUES(OLD.emp_id, OLD.emp_name, NOW(), NULL);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
+521
-8
@@ -1,6 +1,6 @@
|
||||
### 练习一
|
||||
|
||||
**1**
|
||||

|
||||
|
||||
```sql
|
||||
#(1)创建数据库
|
||||
@@ -30,7 +30,7 @@ ALTER TABLE customers RENAME TO customers_info;
|
||||
ALTER TABLE customers_info DROP c_city;
|
||||
```
|
||||
|
||||
**2**
|
||||

|
||||
|
||||
```sql
|
||||
#(1)创建表时 添加外键约束并指定外键约束名称
|
||||
@@ -51,6 +51,10 @@ DROP TABLE orders;
|
||||
|
||||
### 练习二
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#(1)创建表、插入记录
|
||||
CREATE TABLE pet(
|
||||
@@ -84,8 +88,14 @@ WHERE death IS NOT NULL;
|
||||
TRUNCATE pet;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习三
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#1.创建数据库
|
||||
CREATE DATABASE test_compay DEFAULT CHARACTER SET utf8;
|
||||
@@ -115,24 +125,527 @@ CREATE TABLE salary(
|
||||
ALTER TABLE salary ADD CONSTRAINT fk_sal_eid FOREIGN KEY(empid)
|
||||
REFERENCES employee(empid) ON UPDATE CASCADE ON DELETE CASCADE;
|
||||
#4插入记录
|
||||
INSERT INTO department()
|
||||
INSERT INTO department (depid, depname, deinfo)
|
||||
VALUES
|
||||
(111, '生产部', NULL),
|
||||
(222, '销售部', NULL),
|
||||
(333, '人事部', NULL);
|
||||
(333, '人事部', NULL),
|
||||
(444, '财务部', '负责公司财务管理'),
|
||||
(555, '技术部', '负责技术研发与支持'),
|
||||
(666, '市场部', '负责市场推广与品牌建设'),
|
||||
(777, '客服部', '负责客户服务与支持'),
|
||||
(888, '采购部', '负责公司物资采购'),
|
||||
(999, '法务部', '负责公司法律事务'),
|
||||
(1010, '行政部', '负责公司日常行政管理'),
|
||||
(1011, '研发部', '负责新产品研发'),
|
||||
(1012, '培训部', '负责员工培训与发展');
|
||||
|
||||
INSERT INTO employee()
|
||||
INSERT INTO employee (empid, name, sex, title, birthday, depid)
|
||||
VALUES
|
||||
(1001, '张三', '男', '高级工程师', '1975-1-1', 111),
|
||||
(1002, '李四', '女', '助工', '1985-1-1', 111),
|
||||
(1003, '王五', '男', '工程师', '1978-11-11', 222),
|
||||
(1004, '赵六', '男', '工程师', '1999-1-1', 222);
|
||||
(1004, '赵六', '男', '工程师', '1999-1-1', 222),
|
||||
(1005, '陈七', '女', '会计师', '1980-5-15', 444),
|
||||
(1006, '刘八', '男', '软件工程师', '1990-8-20', 555),
|
||||
(1007, '孙九', '女', '市场经理', '1985-12-25', 666),
|
||||
(1008, '周十', '男', '客服专员', '1992-3-10', 777),
|
||||
(1009, '吴十一', '女', '采购经理', '1988-7-22', 888),
|
||||
(1010, '郑十二', '男', '法务顾问', '1983-9-30', 999),
|
||||
(1011, '王十三', '女', '行政助理', '1995-4-18', 1010),
|
||||
(1012, '李十四', '男', '研发工程师', '1991-11-5', 1011),
|
||||
(1013, '赵十五', '女', '培训讲师', '1987-6-12', 1012),
|
||||
(1014, '孙十六', '男', '技术支持', '1993-2-14', 555),
|
||||
(1015, '杨十七', '女', '销售代表', '1994-8-8', 222);
|
||||
|
||||
INSERT INTO salary()
|
||||
INSERT INTO salary (empid, basesalary, titleSalary, decuction)
|
||||
VALUES
|
||||
(1001, 2200, 1100, 200),
|
||||
(1002, 1200, 200, NULL),
|
||||
(1003, 2900, 700, 200),
|
||||
(1004, 1950, 700, 150);
|
||||
(1004, 1950, 700, 150),
|
||||
(1005, 2500, 800, 100),
|
||||
(1006, 3000, 1200, 250),
|
||||
(1007, 2800, 1000, 200),
|
||||
(1008, 1800, 300, 50),
|
||||
(1009, 3200, 900, 300),
|
||||
(1010, 3500, 1000, 400),
|
||||
(1011, 2000, 400, 100),
|
||||
(1012, 3100, 1100, 200),
|
||||
(1013, 2700, 800, 150),
|
||||
(1014, 2300, 700, 100),
|
||||
(1015, 2600, 600, 200);
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#5
|
||||
SELECT e.empid, e.`name`, e.title, d.depname, s.basesalary + s.titleSalary, s.basesalary + s.titleSalary-IFNULL(s.decuction, 0)
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid;
|
||||
#6
|
||||
SELECT e.`name`, s.basesalary
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid AND d.depname = '销售部';
|
||||
#7
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERe e.`name` LIKE '张%' AND TIMESTAMPDIFF(YEAR,e.birthday, NOW()) < 40;
|
||||
#8
|
||||
SELECT e.`name`, s.basesalary, s.titleSalary
|
||||
FROM employee e, salary s
|
||||
WHERE e.sex = '男' AND e.empid AND s.empid;
|
||||
#9
|
||||
SELECT e.`name`, e.title, d.depname
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid AND s.basesalary < 2000;
|
||||
#10
|
||||
SELECT COUNT(*)
|
||||
FROM employee;
|
||||
#11
|
||||
SELECT COUNT(*)
|
||||
FROM department d;
|
||||
#12
|
||||
SELECT AVG(s.basesalary + s.titleSalary), MAX(s.basesalary + s.titleSalary), MIN(s.basesalary + s.titleSalary)
|
||||
FROM employee e, salary s
|
||||
WHERE e.empid = s.empid;
|
||||
#13
|
||||
SELECT d.depname, AVG(s.basesalary + s.titleSalary)
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
GROUP BY d.depid;
|
||||
#14
|
||||
SELECT d.depname, AVG(s.basesalary + s.titleSalary) avg
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
GROUP BY d.depid
|
||||
HAVING avg<2000;
|
||||
#15
|
||||
SELECT e.empid, e.`name`, s.basesalary, s.titleSalary, s.decuction
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
ORDER BY s.titleSalary, s.basesalary;
|
||||
#16
|
||||
SELECT e.empid, e.`name`, e.birthday,
|
||||
IF(YEAR(e.birthday) < 1980, '老年',
|
||||
IF(YEAR(e.birthday)< 1990, '中年', '青壮年'))
|
||||
FROM employee e;
|
||||
#17
|
||||
SELECT e.*, depname
|
||||
FROM employee e, department d
|
||||
WHERE e.depid = d.depid;
|
||||
#18
|
||||
SELECT d.*, e.*
|
||||
FROM employee e, department d
|
||||
WHERE e.depid = d.depid;
|
||||
#19
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERE e.title LIKE '%工程师%' AND e.sex = '男';
|
||||
#20
|
||||
SELECT d.depname, e.sex, COUNT(*), AVG(s.basesalary)
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid
|
||||
GROUP BY d.depid, e.sex;
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 练习四
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#1
|
||||
CREATE DATABASE test_school DEFAULT CHARACTER SET 'UTF8';
|
||||
#2
|
||||
DROP TABLE department;
|
||||
CREATE TABLE department(
|
||||
depNo INT(10) PRIMARY KEY COMMENT '部门号',
|
||||
depName VARCHAR(50) NOT NULL COMMENT '部门名称',
|
||||
depNote VARCHAR(20) COMMENT '部门备注'
|
||||
);
|
||||
CREATE TABLE teacher(
|
||||
number INT PRIMARY KEY COMMENT '教工号',
|
||||
`name` VARCHAR(30) NOT NULL COMMENT '姓名',
|
||||
sex VARCHAR(4) COMMENT '性别',
|
||||
birth DATE COMMENT '出生日期',
|
||||
depNo INT COMMENT '部门号',
|
||||
salary FLOAT COMMENT '工资',
|
||||
address VARCHAR(100) COMMENT '家庭住址'
|
||||
);
|
||||
INSERT INTO department()
|
||||
VALUES
|
||||
(601, '软件技术系', '软件技术等专业'),
|
||||
(602, '网络技术系', '多媒体技术等专业'),
|
||||
(603, '艺术设计系', '广告艺术设计等专业'),
|
||||
(604, '管理工程系', '连锁经营管理等专业');
|
||||
|
||||
INSERT INTO teacher()
|
||||
VALUES
|
||||
(2001, 'Tom', '女', '1970-01-10', 602, 4500, '四川省绵阳市'),
|
||||
(2002, 'Lucy', '男', '1983-12-18', 601, 2500, '北京市昌平区'),
|
||||
(2003, 'Mike', '男', '1990-06-01', 604, 1500, '重庆市渝中区'),
|
||||
(2004, 'James', '女', '1980-10-20', 602, 3500, '四川省成都市'),
|
||||
(2005, 'Jack', '男', '1975-05-30', 603, 1200, '重庆市南岸区');
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#4
|
||||
SELECT *
|
||||
FROM teacher;
|
||||
#5
|
||||
SELECT t.number '教工号', d.depName '部门名称'
|
||||
FROM teacher t, department d
|
||||
WHERE t.depNo = d.depNo AND t.address LIKE '%北京%';
|
||||
#6
|
||||
SELECT t.number, t.`name`
|
||||
FROM teacher t
|
||||
ORDER BY t.salary DESC
|
||||
LIMIT 1;
|
||||
#7
|
||||
SELECT t.number, t.`name`
|
||||
FROM teacher t
|
||||
WHERE t.salary BETWEEN 2500 AND 4000;
|
||||
#8
|
||||
SELECT t.`name`, t.sex, t.salary
|
||||
FROM teacher t, department d
|
||||
WHERE t.depNo = d.depNo AND d.depName = '网络技术系';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习五
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_student CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_student;
|
||||
|
||||
-- 创建表 Classes
|
||||
CREATE TABLE Classes (
|
||||
专业 VARCHAR(50),
|
||||
班级 VARCHAR(50),
|
||||
姓名 VARCHAR(50),
|
||||
性别 VARCHAR(10),
|
||||
座位 INT
|
||||
);
|
||||
|
||||
-- 向表 Classes 插入数据
|
||||
INSERT INTO Classes (专业, 班级, 姓名, 性别, 座位) VALUES
|
||||
('计算机网络', '1班', '张三', '男', 8),
|
||||
('软件工程', '2班', '李四', '男', 12),
|
||||
('计算机维护', '1班', '王五', '男', 9),
|
||||
('计算机网络', '2班', 'LILY', '女', 15),
|
||||
('软件工程', '1班', '小强', '男', 20),
|
||||
('计算机维护', '1班', 'CoCo', '女', 18);
|
||||
|
||||
-- 创建表 Score
|
||||
CREATE TABLE Score (
|
||||
姓名 VARCHAR(50),
|
||||
英语 INT,
|
||||
数学 INT,
|
||||
语文 INT
|
||||
);
|
||||
|
||||
-- 向表 Score 插入数据
|
||||
INSERT INTO Score (姓名, 英语, 数学, 语文) VALUES
|
||||
('张三', 65, 75, 98),
|
||||
('李四', 87, 45, 86),
|
||||
('王五', 98, 85, 65),
|
||||
('LILY', 75, 86, 87),
|
||||
('小强', 85, 60, 58),
|
||||
('CoCo', 96, 87, 70);
|
||||
|
||||
-- 创建表 Records
|
||||
CREATE TABLE Records (
|
||||
姓名 VARCHAR(50),
|
||||
记录 VARCHAR(50)
|
||||
);
|
||||
|
||||
-- 向表 Records 插入数据
|
||||
INSERT INTO Records (姓名, 记录) VALUES
|
||||
('小强', '迟到'),
|
||||
('小强', '事假'),
|
||||
('李四', '旷课'),
|
||||
('李四', '旷课'),
|
||||
('李四', '迟到'),
|
||||
('CoCo', '病假'),
|
||||
('LILY', '事假');
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#3
|
||||
UPDATE score s
|
||||
SET s.`语文` = 88
|
||||
WHERE s.`姓名` = '张三';
|
||||
|
||||
#4
|
||||
SELECT AVG(s.`英语`), AVG(s.`数学`), AVG(s.`语文`)
|
||||
FROM classes c, score s
|
||||
WHERE c.`姓名` = s.`姓名` AND c.`班级` = 1 AND c.`专业` = '计算机维护';
|
||||
|
||||
#5
|
||||
SELECT *
|
||||
FROM score s
|
||||
WHERE s.`数学` < 60 OR s.`英语` < 60 OR s.`语文` < 60;
|
||||
|
||||
#6
|
||||
SELECT *
|
||||
FROM score s
|
||||
WHERE s.`姓名` IN (
|
||||
SELECT r.`姓名`
|
||||
FROM records r
|
||||
GROUP BY r.`姓名`
|
||||
HAVING COUNT(*) > 2
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习六
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_xuankedb 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_xuankedb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_xuankedb;
|
||||
|
||||
-- 创建学生表 Student
|
||||
CREATE TABLE Student (
|
||||
Sn0 VARCHAR(20) PRIMARY KEY, -- 学号,主键
|
||||
Sname VARCHAR(50), -- 姓名
|
||||
Ssex VARCHAR(10), -- 性别
|
||||
Sage INT, -- 年龄
|
||||
Sdept VARCHAR(50) -- 所在系
|
||||
);
|
||||
|
||||
-- 创建课程表 Course
|
||||
CREATE TABLE Course (
|
||||
Cn0 VARCHAR(20) PRIMARY KEY, -- 课程号,主键
|
||||
Cname VARCHAR(100), -- 课程名
|
||||
Cpn0 VARCHAR(20), -- 选修课号
|
||||
Ccredit INT -- 学分
|
||||
);
|
||||
|
||||
-- 创建成绩表 SG
|
||||
CREATE TABLE SG (
|
||||
Sn0 VARCHAR(20), -- 学号
|
||||
Cn0 VARCHAR(20), -- 课程号
|
||||
Grade INT, -- 成绩
|
||||
PRIMARY KEY (Sn0, Cn0), -- 复合主键 (学号, 课程号)
|
||||
FOREIGN KEY (Sn0) REFERENCES Student(Sn0), -- 外键,引用 Student 表
|
||||
FOREIGN KEY (Cn0) REFERENCES Course(Cn0) -- 外键,引用 Course 表
|
||||
);
|
||||
|
||||
INSERT INTO Student (Sno, Sname, Ssex, Sage, Sdept, Scome) VALUES
|
||||
('05001', '张三', '男', 20, '计算机系', '2021-09-01'),
|
||||
('05002', '李四', '女', 21, '数学系', '2021-09-01'),
|
||||
('05003', '王五', '男', 22, '计算机系', '2021-09-01'),
|
||||
('05004', '李洋', '男', 19, '物理系', '2021-09-01'),
|
||||
('05019', '赵六', '女', 20, '计算机系', '2021-09-01');
|
||||
|
||||
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES
|
||||
('1', '数据库', NULL, 4),
|
||||
('2', '数学', NULL, 3),
|
||||
('3', '物理', NULL, 3),
|
||||
('4', '操作系统', '1', 4);
|
||||
|
||||
INSERT INTO SG (Sno, Cno, Grade) VALUES
|
||||
('05001', '1', 85),
|
||||
('05001', '2', 90),
|
||||
('05002', '1', 78),
|
||||
('05002', '3', 88),
|
||||
('05003', '1', 92),
|
||||
('05003', '4', 76),
|
||||
('05004', '3', 95),
|
||||
('05019', '1', 80),
|
||||
('05019', '4', 85);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习七
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_library 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_library CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_library;
|
||||
|
||||
-- 创建表 press(出版社)
|
||||
CREATE TABLE press (
|
||||
pressid INT PRIMARY KEY, -- 出版社编号,主键
|
||||
pressname VARCHAR(100), -- 出版社名称
|
||||
address VARCHAR(100) -- 出版社地址
|
||||
);
|
||||
|
||||
-- 创建表 sort(种类)
|
||||
CREATE TABLE sort (
|
||||
sortno INT PRIMARY KEY, -- 种类编号,主键
|
||||
scount INT, -- 数量
|
||||
describes VARCHAR(100) -- 描述
|
||||
);
|
||||
|
||||
-- 创建表 book(图书)
|
||||
CREATE TABLE book (
|
||||
bid INT PRIMARY KEY, -- 图书编号,主键
|
||||
bname VARCHAR(100), -- 图书名称
|
||||
bsortno INT, -- 种类编号
|
||||
pressid INT, -- 出版社编号
|
||||
FOREIGN KEY (bsortno) REFERENCES sort(sortno), -- 外键,引用 sort 表
|
||||
FOREIGN KEY (pressid) REFERENCES press(pressid) -- 外键,引用 press 表
|
||||
);
|
||||
|
||||
-- 向 press 表插入数据
|
||||
INSERT INTO press (pressid, pressname, address) VALUES
|
||||
(100, '外研社', '上海'),
|
||||
(101, '北大出版社', '北京'),
|
||||
(102, '教育出版社', '北京');
|
||||
|
||||
-- 向 sort 表插入数据
|
||||
INSERT INTO sort (sortno, scount, describes) VALUES
|
||||
(11, 50, '小说'),
|
||||
(12, 100, '科幻'),
|
||||
(13, 100, '神话');
|
||||
|
||||
-- 向 book 表插入数据
|
||||
INSERT INTO book (bid, bname, bsortno, pressid) VALUES
|
||||
(1, '红与黑', 11, 100),
|
||||
(2, '幻城', 12, 102),
|
||||
(3, '希腊神话', 13, 102);
|
||||
|
||||
#5
|
||||
SELECT b.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid AND p.pressid = 100;
|
||||
|
||||
#6
|
||||
SELECT b.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid AND p.pressname = '外研社';
|
||||
|
||||
#7
|
||||
SELECT *
|
||||
FROM sort s
|
||||
WHERE s.scount > 100;
|
||||
|
||||
#8
|
||||
SELECT p.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid
|
||||
GROUP BY b.pressid
|
||||
HAVING COUNT(*) = (
|
||||
SELECT COUNT(*)
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid
|
||||
GROUP BY b.pressid
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 1
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习八
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_tour 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_tour CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_tour;
|
||||
|
||||
-- 创建表 agency(旅行社表)
|
||||
CREATE TABLE agency (
|
||||
id INT PRIMARY KEY, -- 旅行社编号,主键
|
||||
name VARCHAR(100) NOT NULL, -- 旅行社名
|
||||
address VARCHAR(100) NOT NULL, -- 旅行社地址
|
||||
areaid INT -- 所属区域编号
|
||||
);
|
||||
|
||||
-- 创建表 travel(旅行线路表)
|
||||
CREATE TABLE travel (
|
||||
tid INT PRIMARY KEY, -- 旅行线路编号,主键
|
||||
time VARCHAR(50) NOT NULL, -- 所需时间
|
||||
position VARCHAR(100) NOT NULL, -- 目的地
|
||||
money FLOAT, -- 花费
|
||||
aid INT NOT NULL, -- 所属旅行社编号
|
||||
count INT, -- 报名人数
|
||||
FOREIGN KEY (aid) REFERENCES agency(id) -- 外键,引用 agency 表
|
||||
);
|
||||
|
||||
-- 向 agency 表插入数据
|
||||
INSERT INTO agency (id, name, address) VALUES
|
||||
(101, '青年旅行社', '北京海淀'),
|
||||
(102, '天天旅行社', '天津海院');
|
||||
|
||||
-- 向 travel 表插入数据
|
||||
INSERT INTO travel (tid, time, position, money, aid, count) VALUES
|
||||
(1, '5天', '八达岭', 3000, 101, 10),
|
||||
(2, '7天', '水长城', 5000, 101, 14),
|
||||
(3, '8天', '水长城', 6000, 102, 11);
|
||||
|
||||
#4
|
||||
SELECT a.*
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
GROUP BY a.id
|
||||
HAVING COUNT(*) = (
|
||||
SELECT COUNT(*)
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
GROUP BY a.id
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#5
|
||||
SELECT t.*
|
||||
FROM travel t
|
||||
WHERE t.count = (
|
||||
SELECT t.count
|
||||
FROM travel t
|
||||
ORDER BY t.count DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#6
|
||||
SELECT *
|
||||
FROM travel t
|
||||
WHERE t.money < 5000;
|
||||
|
||||
#7
|
||||
SELECT a.`name`
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id AND t.money = (
|
||||
SELECT t.money
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
ORDER BY t.money DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#8
|
||||
SELECT SUM(t.time)
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id AND a.`name` = '青年旅行社';
|
||||
```
|
||||
|
||||
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
|
||||
CREATE FUNCTION calculate_annual_salary (
|
||||
monthly_salary DECIMAL(10, 2)
|
||||
)
|
||||
RETURNS DECIMAL(10, 2)
|
||||
DETERMINISTIC | NOT DETERMINISTIC #结果确定/不确定
|
||||
BEGIN
|
||||
RETURN monthly_salary * 12;
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 表结构与数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 计算员工年薪
|
||||
|
||||
创建一个存储函数 `calculate_annual_salary`,接受员工的月薪作为参数,返回其年薪(假设年薪为月薪的 12 倍)。
|
||||
|
||||
```c
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 2: 计算员工工龄
|
||||
|
||||
创建一个存储函数 `calculate_years_of_service`,接受员工的入职日期作为参数,返回该员工的工龄(以年为单位)。
|
||||
|
||||
#### 练习题 3: 根据部门计算平均工资
|
||||
|
||||
创建一个存储函数 `calculate_avg_salary_by_dept`,接受部门 ID 作为参数,返回该部门的平均工资。
|
||||
|
||||
#### 练习题 4: 根据职位计算平均工资
|
||||
|
||||
创建一个存储函数 `calculate_avg_salary_by_job`,接受职位 ID 作为参数,返回该职位的平均工资。
|
||||
|
||||
#### 练习题 5: 计算员工税后工资
|
||||
|
||||
创建一个存储函数 `calculate_net_salary`,接受员工的工资作为参数,返回其税后工资(假设税率为 15%)。
|
||||
|
||||
#### 练习题 6: 判断员工是否满足加薪条件
|
||||
|
||||
创建一个存储函数 `is_eligible_for_raise`,接受员工的工资和工龄作为参数,返回一个布尔值(1 或 0)。加薪条件如下:
|
||||
|
||||
- 如果工资低于 60000 且工龄大于等于 3 年,返回 1(满足条件)。
|
||||
- 否则返回 0(不满足条件)。
|
||||
|
||||
#### 练习题 7: 计算部门总工资
|
||||
|
||||
创建一个存储函数 `calculate_total_salary_by_dept`,接受部门 ID 作为参数,返回该部门所有员工的总工资。
|
||||
|
||||
#### 练习题 8: 计算职位总工资
|
||||
|
||||
创建一个存储函数 `calculate_total_salary_by_job`,接受职位 ID 作为参数,返回该职位所有员工的总工资。
|
||||
|
||||
#### 练习题 9: 判断员工是否属于高薪部门
|
||||
|
||||
创建一个存储函数 `is_high_salary_department`,接受部门 ID 作为参数,返回一个布尔值(1 或 0)。如果该部门的平均工资大于等于 70000,返回 1(高薪部门),否则返回 0(非高薪部门)。
|
||||
|
||||
#### 练习题 10: 计算员工的总收入
|
||||
|
||||
创建一个存储函数 `calculate_total_income`,接受员工的工资和奖金(假设奖金为工资的 10%)作为参数,返回其总收入(工资 + 奖金)。
|
||||
+529
@@ -0,0 +1,529 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
|
||||
CREATE PROCEDURE GetEmployeeCountByDept (
|
||||
IN dept_id INT,
|
||||
OUT employee_count INT
|
||||
)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO employee_count
|
||||
FROM employee
|
||||
WHERE dept_id = dept_id;
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
IF condition THEN
|
||||
-- 条件为真时执行的代码
|
||||
ELSEIF another_condition THEN
|
||||
-- 另一个条件为真时执行的代码
|
||||
ELSE
|
||||
-- 所有条件都不满足时执行的代码
|
||||
END IF;
|
||||
|
||||
CASE expression
|
||||
WHEN value1 THEN
|
||||
-- 当 expression = value1 时执行的代码
|
||||
WHEN value2 THEN
|
||||
-- 当 expression = value2 时执行的代码
|
||||
ELSE
|
||||
-- 当 expression 不匹配任何值时执行的代码
|
||||
END CASE;
|
||||
|
||||
CASE
|
||||
WHEN condition1 THEN
|
||||
-- 当 condition1 为真时执行的代码
|
||||
WHEN condition2 THEN
|
||||
-- 当 condition2 为真时执行的代码
|
||||
ELSE
|
||||
-- 当所有条件都不满足时执行的代码
|
||||
END CASE;
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 表结构与数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 插入新员工
|
||||
|
||||
创建一个存储过程 `add_employee`,接受员工姓名、工资、入职日期、部门ID和职位ID作为参数,并将其插入到 `employee` 表中。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS add_employee;
|
||||
CREATE PROCEDURE add_employee(IN emp_name VARCHAR(100), IN salary DECIMAL(10,2), IN hire_date DATE, IN dept_id INT, IN job_id INT)
|
||||
BEGIN
|
||||
INSERT INTO employee()
|
||||
VALUES(DEFAULT, emp_name, salary, hire_date, dept_id, job_id);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL add_employee('李泽龙', 6666, '2025-3-20', 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 2: 更新员工工资
|
||||
|
||||
创建一个存储过程 `update_employee_salary`,接受员工ID和新的工资作为参数,更新该员工的工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS update_employee_salary;
|
||||
CREATE PROCEDURE update_employee_salary(IN emp_id INT, IN salary DECIMAL(10, 2))
|
||||
BEGIN
|
||||
UPDATE employee e
|
||||
SET e.salary = salary
|
||||
WHERE e.emp_id = emp_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL update_employee_salary(1, 60000);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 3: 删除员工
|
||||
|
||||
创建一个存储过程 `delete_employee`,接受员工ID作为参数,删除该员工的记录。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS delete_employee;
|
||||
CREATE PROCEDURE delete_employee(IN id INT)
|
||||
BEGIN
|
||||
DELETE FROM employee
|
||||
WHERE emp_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL delete_employee(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 4: 查询部门员工
|
||||
|
||||
创建一个存储过程 `get_department_employees`,接受部门ID作为参数,返回该部门所有员工的详细信息。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_employees;
|
||||
CREATE PROCEDURE get_department_employees(IN id INT)
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_employees(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 5: 查询职位员工
|
||||
|
||||
创建一个存储过程 `get_job_employees`,接受职位ID作为参数,返回该职位所有员工的详细信息。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_employees;
|
||||
CREATE PROCEDURE get_job_employees(IN id INT)
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_employees(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 6: 计算部门平均工资
|
||||
|
||||
创建一个存储过程 `calculate_avg_salary_by_dept`,接受部门ID作为参数,返回该部门的平均工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS calculate_avg_salary_by_dept;
|
||||
CREATE PROCEDURE calculate_avg_salary_by_dept(IN id INT)
|
||||
BEGIN
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL calculate_avg_salary_by_dept(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 7: 计算职位平均工资
|
||||
|
||||
创建一个存储过程 `calculate_avg_salary_by_job`,接受职位ID作为参数,返回该职位的平均工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS calculate_avg_salary_by_job;
|
||||
CREATE PROCEDURE calculate_avg_salary_by_job(IN id INT)
|
||||
BEGIN
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL calculate_avg_salary_by_job(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 8: 查询高薪员工
|
||||
|
||||
创建一个存储过程 `get_high_salary_employees`,接受一个工资阈值作为参数,返回所有工资高于该阈值的员工。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_high_salary_employees;
|
||||
CREATE PROCEDURE get_high_salary_employees(IN sal DECIMAL(10, 2))
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.salary > sal;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_high_salary_employees(50000);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 9: 查询员工工龄
|
||||
|
||||
创建一个存储过程 `get_employee_years_of_service`,接受员工ID作为参数,返回该员工的工龄(以年为单位)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_years_of_service;
|
||||
CREATE PROCEDURE get_employee_years_of_service(IN id INT)
|
||||
BEGIN
|
||||
SELECT -TIMESTAMPDIFF(YEAR,NOW(),e.hire_date)
|
||||
FROM employee e
|
||||
WHERE e.emp_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employee_years_of_service(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 10: 查询部门员工总数
|
||||
|
||||
创建一个存储过程 `get_department_employee_count`,接受部门ID作为参数,返回该部门的员工总数。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_employee_count;
|
||||
CREATE PROCEDURE get_department_employee_count(IN id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_employee_count(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 11: 查询职位员工总数
|
||||
|
||||
创建一个存储过程 `get_job_employee_count`,接受职位ID作为参数,返回该职位的员工总数。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_employee_count;
|
||||
CREATE PROCEDURE get_job_employee_count(IN id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_employee_count(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 12: 查询员工详细信息
|
||||
|
||||
创建一个存储过程 `get_employee_details`,接受员工ID作为参数,返回该员工的姓名、工资、部门名称和职位名称。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_details;
|
||||
CREATE PROCEDURE get_employee_details(IN emp_id INT)
|
||||
BEGIN
|
||||
SELECT e.emp_name, e.salary, d.dept_name, j.job_title
|
||||
FROM employee e, department d, job j
|
||||
WHERE e.emp_id = emp_id AND e.dept_id = d.dept_id AND e.job_id = j.job_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employee_details(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 13: 查询部门最高工资
|
||||
|
||||
创建一个存储过程 `get_department_max_salary`,接受部门ID作为参数,返回该部门的最高工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_max_salary;
|
||||
CREATE PROCEDURE get_department_max_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_max_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 14: 查询职位最低工资
|
||||
|
||||
创建一个存储过程 `get_job_min_salary`,接受职位ID作为参数,返回该职位的最低工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_min_salary;
|
||||
CREATE PROCEDURE get_job_min_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT MIN(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_min_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 15: 查询员工工资排名
|
||||
|
||||
创建一个存储过程 `get_employee_salary_rank`,接受员工ID作为参数,返回该员工在公司中的工资排名。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_salary_rank;
|
||||
CREATE PROCEDURE get_employee_salary_rank(IN emp_id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) + 1
|
||||
FROM employee e
|
||||
WHERE e.salary > (
|
||||
SELECT e.salary
|
||||
FROM employee e
|
||||
WHERE e.emp_id = emp_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL get_employee_salary_rank(2);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 16: 查询部门工资总和
|
||||
|
||||
创建一个存储过程 `get_department_total_salary`,接受部门ID作为参数,返回该部门所有员工的工资总和。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_total_salary;
|
||||
CREATE PROCEDURE get_department_total_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT SUM(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_total_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 17: 查询职位工资总和
|
||||
|
||||
创建一个存储过程 `get_job_total_salary`,接受职位ID作为参数,返回该职位所有员工的工资总和。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_total_salary;
|
||||
CREATE PROCEDURE get_job_total_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT SUM(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_total_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 18: 查询员工入职年份分布
|
||||
|
||||
创建一个存储过程 `get_employees_by_hire_year`,接受年份作为参数,返回该年份入职的所有员工。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employees_by_hire_year;
|
||||
CREATE PROCEDURE get_employees_by_hire_year(IN y INT)
|
||||
BEGIN
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERE YEAR(e.hire_date) = y;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employees_by_hire_year(2020);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 19: 查询部门工资分布
|
||||
|
||||
创建一个存储过程 `get_department_salary_distribution`,接受部门ID作为参数,返回该部门工资的分布情况(如最高、最低、平均工资)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_salary_distribution;
|
||||
CREATE PROCEDURE get_department_salary_distribution(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary), MIN(e.salary), AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_salary_distribution(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 20: 查询职位工资分布
|
||||
|
||||
创建一个存储过程 `get_job_salary_distribution`,接受职位ID作为参数,返回该职位工资的分布情况(如最高、最低、平均工资)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_salary_distribution;
|
||||
CREATE PROCEDURE get_job_salary_distribution(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary), MIN(e.salary), AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_salary_distribution(1);
|
||||
```
|
||||
|
||||
+610
@@ -0,0 +1,610 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
CREATE TRIGGER trigger_name
|
||||
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
-- 触发器的逻辑代码
|
||||
-- 可以包含 SQL 语句、流程控制语句(如 IF、CASE 等)、变量声明等
|
||||
END//
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
### 表结构和数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
### `SIGNAL` 语句的基本语法
|
||||
|
||||
```sql
|
||||
SIGNAL SQLSTATE '状态码'
|
||||
SET MESSAGE_TEXT = '错误消息';
|
||||
```
|
||||
|
||||
- **SQLSTATE**:一个 5 字符的字符串,表示错误的状态码。MySQL 使用 `'45000'` 表示用户定义的错误。
|
||||
- **MESSAGE_TEXT**:自定义的错误消息,用于描述错误的原因。
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 工资范围验证
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据之前,检查员工的工资是否在其对应职位的 `min_salary` 和 `max_salary` 范围内。如果超出范围,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
|
||||
IF NEW.salary > (
|
||||
SELECT j.max_salary
|
||||
FROM job j
|
||||
WHERE j.job_id = NEW.job_id
|
||||
) OR NEW.salary < (
|
||||
SELECT j.min_salary
|
||||
FROM job j
|
||||
WHERE j.job_id = NEW.job_id
|
||||
) THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '工资值错误,不在职务工资范围内';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 0, NOW(), 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 2: 自动更新部门人数
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新 `department` 表中的部门人数(假设 `department` 表新增一个字段 `employee_count`)。
|
||||
|
||||
```sql
|
||||
ALTER TABLE department ADD employee_count INT UNSIGNED;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE department d
|
||||
SET d.employee_count = (
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = d.dept_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, NOW(), 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 3: 工资变更日志
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `salary` 字段后,将变更记录插入到一个新的日志表 `salary_log` 中,记录员工 ID、旧工资、新工资和变更时间。
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS salary_log;
|
||||
CREATE TABLE salary_log(
|
||||
emp_id INT,
|
||||
old_salary DECIMAL(10, 2),
|
||||
new_slaray DECIMAL(10, 2),
|
||||
update_date DATE
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
BEFORE UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.salary <> OLD.salary THEN
|
||||
INSERT INTO salary_log()
|
||||
VALUES(NEW.emp_id, OLD.salary, NEW.salary, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
UPDATE employee e
|
||||
SET e.salary = 10
|
||||
WHERE e.emp_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 4: 删除员工时备份数据
|
||||
|
||||
创建一个触发器 `before_employee_delete`,在删除 `employee` 表数据之前,将被删除的员工数据插入到一个备份表 `employee_backup` 中。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_backup AS
|
||||
SELECT *
|
||||
FROM employee
|
||||
WHERE 0;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_delete;
|
||||
CREATE TRIGGER before_employee_delete
|
||||
BEFORE DELETE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO employee_backup()
|
||||
VALUES(OLD.emp_id, OLD.emp_name, OLD.salary, OLD.hire_date, OLD.dept_id, OLD.job_id);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
DELETE FROM employee
|
||||
WHERE emp_id = 20;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 5: 自动设置默认职位
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,如果未指定 `job_id`,则自动将其设置为 `job` 表中的默认职位(假设默认职位的 `job_id` 为 1)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.job_id IS NULL THEN
|
||||
SET NEW.job_id = 1;
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, NOW(), 1, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 6: 防止修改入职日期
|
||||
|
||||
创建一个触发器 `before_employee_update`,在更新 `employee` 表数据时,防止修改 `hire_date` 字段。如果尝试修改,抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_update;
|
||||
CREATE TRIGGER before_employee_update
|
||||
BEFORE UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.hire_date <> OLD.hire_date THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT='不允许修改用户的入职时间';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
UPDATE employee e
|
||||
SET e.hire_date = '2025-3-20'
|
||||
WHERE e.emp_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 7: 自动计算工龄
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,自动计算员工的工龄(以年为单位),并将其存储到一个新字段 `years_of_service` 中。
|
||||
|
||||
```sql
|
||||
ALTER TABLE employee ADD years_of_service INT;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
SET NEW.years_of_service = TIMESTAMPDIFF(YEAR,NEW.hire_date,NOW());
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT TIMESTAMPDIFF(YEAR,e.hire_date,NOW())
|
||||
FROM employee e;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, '2022-12-31', 1, 1, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 8: 防止删除部门
|
||||
|
||||
创建一个触发器 `before_department_delete`,在删除 `department` 表数据之前,检查该部门是否还有员工。如果有员工,阻止删除并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_department_delete;
|
||||
CREATE TRIGGER before_department_delete
|
||||
BEFORE DELETE ON department
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM employee e WHERE e.dept_id = OLD.dept_id) > 0 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '该部门有员工无法删除';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
DELETE FROM department
|
||||
WHERE dept_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 9: 自动更新职位工资范围
|
||||
|
||||
创建一个触发器 `after_job_update`,在更新 `job` 表的 `min_salary` 或 `max_salary` 字段后,自动调整 `employee` 表中相关员工的工资,使其符合新的工资范围。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_job_update;
|
||||
CREATE TRIGGER after_job_update
|
||||
AFTER UPDATE ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE employee
|
||||
SET salary = IF(salary > NEW.max_salary, NEW.max_salary, IF(salary < NEW.min_salary, min_salary, salary))
|
||||
WHERE job_id = NEW.job_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 10: 记录部门变更
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `dept_id` 字段后,将变更记录插入到一个新的日志表 `department_change_log` 中,记录员工 ID、旧部门 ID、新部门 ID 和变更时间。
|
||||
|
||||
```sql
|
||||
CREATE TABLE department_change_log(
|
||||
emp_id INT,
|
||||
old_dept_id INT,
|
||||
new_dept_id INT,
|
||||
update_date DATE
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
AFTER UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.dept_id <> OLD.dept_id THEN
|
||||
INSERT INTO department_change_log()
|
||||
VALUES(NEW.emp_id, OLD.dept_id, NEW.dept_id, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 11: 防止插入重复职位
|
||||
|
||||
创建一个触发器 `before_job_insert`,在插入 `job` 表数据之前,检查职位名称是否已存在。如果存在,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_job_insert;
|
||||
CREATE TRIGGER before_job_insert
|
||||
BEFORE INSERT ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM job WHERE job_id = NEW.job_id) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '职位名称已存在';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 12: 自动更新员工总数
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新一个统计表 `employee_statistics` 中的员工总数。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_statistics(
|
||||
marking VARCHAR(20),
|
||||
num INT
|
||||
);
|
||||
INSERT INTO employee_statistics()
|
||||
VALUES('count', 0);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE employee_statistics
|
||||
SET num = (SELECT COUNT(*) FROM employee)
|
||||
WHERE marking = 'count';
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 13: 防止修改部门所在地
|
||||
|
||||
创建一个触发器 `before_department_update`,在更新 `department` 表数据时,防止修改 `location` 字段。如果尝试修改,抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_department_update;
|
||||
CREATE TRIGGER before_department_update
|
||||
BEFORE UPDATE ON department
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.location <> OLD.location THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '无法更新部分的位置';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 14: 自动调整工资
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,如果工资低于职位的最低工资,则自动将其调整为最低工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.salary < (SELECT min_salary FROM job WHERE job_id = NEW.job_id ) THEN
|
||||
SET NEW.salary = min_salary;
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 15: 记录职位变更
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `job_id` 字段后,将变更记录插入到一个新的日志表 `job_change_log` 中,记录员工 ID、旧职位 ID、新职位 ID 和变更时间。
|
||||
|
||||
```sql
|
||||
CREATE TABLE job_change_log(
|
||||
emp_id INT,
|
||||
old_job_id INT,
|
||||
new_job_id INT,
|
||||
update_date DATE
|
||||
);
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
AFTER UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.job_id <> OLD.job_id THEN
|
||||
INSERT INTO job_change_log()
|
||||
VALUES(NEW.emp_id, OLD.job_id, NEW.job_id, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 16: 防止删除职位
|
||||
|
||||
创建一个触发器 `before_job_delete`,在删除 `job` 表数据之前,检查该职位是否还有员工。如果有员工,阻止删除并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_job_delete;
|
||||
CREATE TRIGGER before_job_delete
|
||||
BEFORE DELETE ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM employee WHERE job_id = OLD.job_id) > 0 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '该职位还有员工';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 17: 自动更新部门平均工资
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新 `department` 表中的部门平均工资(假设 `department` 表新增一个字段 `avg_salary`)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE department d
|
||||
SET d.avg_salary = (SELECT AVG(e.salary) FROM employee e WHERE d.dept_id = e.dept_id)
|
||||
WHERE NEW.dept_id = d.dept_id;
|
||||
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 18: 防止插入未来入职日期
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,检查 `hire_date` 是否晚于当前日期。如果是,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.hire_date < CURDATE() THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '入职日期不得晚于当前日期';
|
||||
END IF;
|
||||
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 19: 自动生成员工编号
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,自动生成一个唯一的员工编号(格式为 `EMP-年份-序号`,例如 `EMP-2023-001`),并将其存储到一个新字段 `emp_code` 中。
|
||||
|
||||
```sql
|
||||
ALTER TABLE employee ADD emp_code VARCHAR(30);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
SET NEW.emp_code = CONCAT('EMP-',YEAR(NOW()),'-', (LAST_INSERT_ID()+1));
|
||||
END $$
|
||||
DELIMITER ;
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 0, NOW(), 1, 1, NULL, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 20: 记录员工离职
|
||||
|
||||
创建一个触发器 `after_employee_delete`,在删除 `employee` 表数据之后,将被删除的员工信息插入到一个离职记录表 `employee_exit_log` 中,记录员工 ID、姓名、离职时间和原因(假设原因由用户输入)。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_exit_log(
|
||||
emp_id INT,
|
||||
emp_name VARCHAR(20),
|
||||
quit_date DATE,
|
||||
quit_reason VARCHAR(50)
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_delete;
|
||||
CREATE TRIGGER after_employee_delete
|
||||
AFTER DELETE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO employee_exit_log()
|
||||
VALUES(OLD.emp_id, OLD.emp_name, NOW(), NULL);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,51 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
程序功能:输入带有数字和字母的字符串,使用指针,将数字放置在字母前面(按输入顺序)。
|
||||
样例1:
|
||||
输入字符串:jngk2025hello
|
||||
排序后的字符串: 2025jngkhello
|
||||
|
||||
样例2:
|
||||
输入字符串:123abc666def
|
||||
排序后的字符串: 123666abcdef
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容,仅在
|
||||
Program-End之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
void fn(char* str){
|
||||
char *p,*q,ch;
|
||||
p = str;
|
||||
q = str;
|
||||
/**********Program**********/
|
||||
while(*p != '\0'){//p用来遍历所有元素
|
||||
if(*p >= '0' && *p <= '9'){//当前位置指针的元素为数字
|
||||
ch = *p;//备份当前的数字
|
||||
q = p;//q存储当前这个数位置的地址
|
||||
while(q != str){//将p地址前所有的字母整体后移一位
|
||||
//到下一个元素地址为数组首地址或下一个元素为数字时停止
|
||||
if(*(q-1) >='0' && *(q-1) <= '9'){
|
||||
break;
|
||||
}
|
||||
*q = *(q-1);
|
||||
q--;
|
||||
}
|
||||
*q = ch;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
char s[100];
|
||||
printf("输入字符串:");
|
||||
gets(s);
|
||||
fn(s);
|
||||
printf("排序后的字符串: %s\n",s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
一名快递员有一个能承受最大重量为50公斤的送货箱。他需要依次接收若干个包裹,并将它们按顺序放入送货箱中进行配送。
|
||||
每个包裹的重量各不相同。如果在接收某个包裹后,送货箱内的总重量超过了其最大承重能力,
|
||||
则快递员需要先完成当前送货箱内所有包裹的配送,然后再开始接收新的包裹放入空的送货箱。
|
||||
请计算快递员需要几次才能将所有包裹配送完毕。
|
||||
(如果单个货物超过50公斤的(>50公斤),直接忽略不配送此货物)
|
||||
|
||||
示例1:
|
||||
请输入包裹的数量:4
|
||||
请依次输入每个包裹的重量(单位:公斤):
|
||||
第 1 个包裹的重量: 8
|
||||
第 2 个包裹的重量: 51
|
||||
第 3 个包裹的重量: 6
|
||||
第 4 个包裹的重量: 5
|
||||
需要1次才能将所有包裹配送完毕。
|
||||
|
||||
示例2:
|
||||
请输入包裹的数量:5
|
||||
请依次输入每个包裹的重量(单位:公斤):
|
||||
第 1 个包裹的重量: 8
|
||||
第 2 个包裹的重量: 7
|
||||
第 3 个包裹的重量: 50
|
||||
第 4 个包裹的重量: 1
|
||||
第 5 个包裹的重量: 2
|
||||
需要3次才能将所有包裹配送完毕。
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数main或其它函数中给出的内容,仅在
|
||||
Program-End之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
|
||||
// 函数用于计算所需的送货次数
|
||||
int calculateDeliveryTimes(int weights[], int size) {
|
||||
int currentWeight = 0;
|
||||
int deliveryTimes = 1;
|
||||
|
||||
/**********Program**********/
|
||||
int i;
|
||||
for(i=0;i<size;i++){
|
||||
if(weights[i] <= 50){
|
||||
if(currentWeight + weights[i] > 50){
|
||||
currentWeight=0;
|
||||
deliveryTimes++;
|
||||
}
|
||||
currentWeight += weights[i];
|
||||
}
|
||||
}
|
||||
/********** End **********/
|
||||
return deliveryTimes;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int size;
|
||||
|
||||
printf("请输入包裹的数量:");
|
||||
scanf("%d", &size);
|
||||
|
||||
int weights[size];
|
||||
|
||||
printf("请依次输入每个包裹的重量(单位:公斤):\n");
|
||||
for (int i = 0; i < size; ++i) {
|
||||
printf("第 %d 个包裹的重量: ", i + 1);
|
||||
scanf("%d", &weights[i]);
|
||||
}
|
||||
|
||||
int times = calculateDeliveryTimes(weights, size);
|
||||
|
||||
printf("需要%d次才能将所有包裹配送完毕。\n", times);
|
||||
|
||||
return 0;
|
||||
}
|
||||
+604
@@ -0,0 +1,604 @@
|
||||
### 表结构
|
||||
|
||||
```sql
|
||||
/*
|
||||
Navicat Premium Data Transfer
|
||||
|
||||
Source Server : localhost_3306
|
||||
Source Server Type : MySQL
|
||||
Source Server Version : 50743
|
||||
Source Host : localhost:3306
|
||||
Source Schema : db_education
|
||||
|
||||
Target Server Type : MySQL
|
||||
Target Server Version : 50743
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 27/03/2025 12:56:48
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for t_course
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `t_course`;
|
||||
CREATE TABLE `t_course` (
|
||||
`id` int(10) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
||||
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`period` int(10) NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 10005 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of t_course
|
||||
-- ----------------------------
|
||||
INSERT INTO `t_course` VALUES (10001, '语文', '高中语文课程', 48);
|
||||
INSERT INTO `t_course` VALUES (10002, '数学', '高中数学课程', 48);
|
||||
INSERT INTO `t_course` VALUES (10003, '英语', '高中英语课程', 48);
|
||||
INSERT INTO `t_course` VALUES (10004, '物理', '高中物理', 24);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for t_learn
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `t_learn`;
|
||||
CREATE TABLE `t_learn` (
|
||||
`id` int(10) NOT NULL AUTO_INCREMENT,
|
||||
`s_id` int(10) NOT NULL,
|
||||
`c_id` int(10) NOT NULL,
|
||||
`schedule` int(11) NULL DEFAULT 0,
|
||||
`createtime` datetime NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 10201 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of t_learn
|
||||
-- ----------------------------
|
||||
INSERT INTO `t_learn` VALUES (10001, 10025, 10001, 17, '2024-05-17 11:38:34');
|
||||
INSERT INTO `t_learn` VALUES (10002, 10032, 10001, 36, '2024-01-30 10:55:51');
|
||||
INSERT INTO `t_learn` VALUES (10003, 10072, 10001, 44, '2024-09-12 09:41:22');
|
||||
INSERT INTO `t_learn` VALUES (10004, 10010, 10001, 8, '2023-03-23 03:19:04');
|
||||
INSERT INTO `t_learn` VALUES (10005, 10045, 10001, 46, '2023-08-03 01:06:54');
|
||||
INSERT INTO `t_learn` VALUES (10006, 10086, 10001, 42, '2023-11-23 08:05:33');
|
||||
INSERT INTO `t_learn` VALUES (10007, 10050, 10001, 3, '2024-10-27 22:15:01');
|
||||
INSERT INTO `t_learn` VALUES (10008, 10046, 10001, 13, '2024-04-03 07:26:53');
|
||||
INSERT INTO `t_learn` VALUES (10009, 10011, 10001, 31, '2023-09-28 20:42:04');
|
||||
INSERT INTO `t_learn` VALUES (10010, 10055, 10001, 20, '2024-02-03 04:12:27');
|
||||
INSERT INTO `t_learn` VALUES (10011, 10044, 10001, 15, '2023-10-05 10:23:35');
|
||||
INSERT INTO `t_learn` VALUES (10013, 10040, 10001, 25, '2024-03-04 10:10:18');
|
||||
INSERT INTO `t_learn` VALUES (10014, 10074, 10001, 14, '2024-03-12 11:24:43');
|
||||
INSERT INTO `t_learn` VALUES (10015, 10069, 10001, 11, '2023-01-28 02:34:49');
|
||||
INSERT INTO `t_learn` VALUES (10016, 10067, 10001, 11, '2024-04-29 22:19:43');
|
||||
INSERT INTO `t_learn` VALUES (10017, 10087, 10001, 15, '2023-08-29 06:34:45');
|
||||
INSERT INTO `t_learn` VALUES (10018, 10080, 10001, 24, '2024-11-11 00:58:52');
|
||||
INSERT INTO `t_learn` VALUES (10019, 10093, 10001, 43, '2023-05-12 18:41:48');
|
||||
INSERT INTO `t_learn` VALUES (10020, 10028, 10001, 35, '2023-05-17 17:04:32');
|
||||
INSERT INTO `t_learn` VALUES (10021, 10062, 10001, 11, '2023-01-29 18:14:58');
|
||||
INSERT INTO `t_learn` VALUES (10022, 10049, 10001, 34, '2024-09-25 10:38:12');
|
||||
INSERT INTO `t_learn` VALUES (10023, 10039, 10001, 22, '2024-02-15 18:52:15');
|
||||
INSERT INTO `t_learn` VALUES (10024, 10005, 10001, 29, '2023-04-25 08:55:57');
|
||||
INSERT INTO `t_learn` VALUES (10025, 10065, 10001, 20, '2024-10-30 11:22:37');
|
||||
INSERT INTO `t_learn` VALUES (10026, 10047, 10001, 22, '2023-09-07 21:46:19');
|
||||
INSERT INTO `t_learn` VALUES (10027, 10012, 10001, 10, '2023-10-10 23:42:06');
|
||||
INSERT INTO `t_learn` VALUES (10028, 10037, 10001, 5, '2024-03-09 23:35:22');
|
||||
INSERT INTO `t_learn` VALUES (10029, 10018, 10001, 1, '2024-11-24 06:32:13');
|
||||
INSERT INTO `t_learn` VALUES (10030, 10066, 10001, 27, '2023-12-01 18:53:00');
|
||||
INSERT INTO `t_learn` VALUES (10031, 10063, 10001, 28, '2023-06-25 02:55:53');
|
||||
INSERT INTO `t_learn` VALUES (10032, 10090, 10001, 47, '2024-04-21 14:00:37');
|
||||
INSERT INTO `t_learn` VALUES (10033, 10085, 10001, 33, '2023-03-22 05:46:52');
|
||||
INSERT INTO `t_learn` VALUES (10034, 10092, 10001, 5, '2024-04-13 02:36:54');
|
||||
INSERT INTO `t_learn` VALUES (10035, 10060, 10001, 12, '2023-01-16 11:50:07');
|
||||
INSERT INTO `t_learn` VALUES (10036, 10088, 10001, 7, '2023-10-17 01:08:32');
|
||||
INSERT INTO `t_learn` VALUES (10037, 10071, 10001, 36, '2023-10-10 22:28:02');
|
||||
INSERT INTO `t_learn` VALUES (10038, 10079, 10001, 33, '2024-08-31 07:01:33');
|
||||
INSERT INTO `t_learn` VALUES (10039, 10091, 10001, 6, '2024-12-08 01:13:17');
|
||||
INSERT INTO `t_learn` VALUES (10040, 10003, 10001, 2, '2023-02-18 11:46:20');
|
||||
INSERT INTO `t_learn` VALUES (10041, 10083, 10001, 26, '2023-06-28 14:08:02');
|
||||
INSERT INTO `t_learn` VALUES (10042, 10054, 10001, 43, '2023-09-14 12:57:41');
|
||||
INSERT INTO `t_learn` VALUES (10043, 10017, 10001, 27, '2024-04-29 04:22:03');
|
||||
INSERT INTO `t_learn` VALUES (10044, 10021, 10001, 43, '2023-09-11 09:03:59');
|
||||
INSERT INTO `t_learn` VALUES (10045, 10014, 10001, 31, '2024-06-28 11:20:58');
|
||||
INSERT INTO `t_learn` VALUES (10046, 10051, 10001, 24, '2023-06-19 05:29:25');
|
||||
INSERT INTO `t_learn` VALUES (10047, 10035, 10001, 17, '2024-02-06 00:48:21');
|
||||
INSERT INTO `t_learn` VALUES (10048, 10008, 10001, 29, '2023-12-28 10:32:43');
|
||||
INSERT INTO `t_learn` VALUES (10049, 10100, 10001, 19, '2023-07-23 18:51:30');
|
||||
INSERT INTO `t_learn` VALUES (10050, 10016, 10001, 33, '2024-07-05 11:07:38');
|
||||
INSERT INTO `t_learn` VALUES (10051, 10033, 10001, 9, '2024-06-27 11:06:15');
|
||||
INSERT INTO `t_learn` VALUES (10052, 10022, 10001, 15, '2023-11-29 06:00:37');
|
||||
INSERT INTO `t_learn` VALUES (10053, 10082, 10001, 41, '2024-05-10 13:59:37');
|
||||
INSERT INTO `t_learn` VALUES (10054, 10096, 10001, 11, '2023-02-27 13:35:38');
|
||||
INSERT INTO `t_learn` VALUES (10055, 10030, 10001, 27, '2023-01-08 00:29:21');
|
||||
INSERT INTO `t_learn` VALUES (10056, 10029, 10001, 24, '2024-03-01 05:48:04');
|
||||
INSERT INTO `t_learn` VALUES (10057, 10075, 10001, 21, '2024-11-09 23:10:32');
|
||||
INSERT INTO `t_learn` VALUES (10058, 10053, 10001, 1, '2024-10-28 14:38:52');
|
||||
INSERT INTO `t_learn` VALUES (10059, 10041, 10001, 21, '2024-11-04 06:31:31');
|
||||
INSERT INTO `t_learn` VALUES (10060, 10027, 10001, 14, '2024-08-30 16:31:07');
|
||||
INSERT INTO `t_learn` VALUES (10061, 10031, 10001, 30, '2023-05-27 05:01:32');
|
||||
INSERT INTO `t_learn` VALUES (10062, 10052, 10001, 17, '2024-10-28 01:47:09');
|
||||
INSERT INTO `t_learn` VALUES (10063, 10026, 10001, 30, '2023-07-09 12:57:40');
|
||||
INSERT INTO `t_learn` VALUES (10064, 10089, 10001, 15, '2023-10-01 05:36:14');
|
||||
INSERT INTO `t_learn` VALUES (10065, 10043, 10001, 42, '2024-12-09 18:42:26');
|
||||
INSERT INTO `t_learn` VALUES (10066, 10070, 10001, 11, '2023-02-18 10:25:15');
|
||||
INSERT INTO `t_learn` VALUES (10067, 10059, 10001, 11, '2024-03-30 03:20:04');
|
||||
INSERT INTO `t_learn` VALUES (10068, 10001, 10001, 6, '2024-05-16 09:40:05');
|
||||
INSERT INTO `t_learn` VALUES (10069, 10023, 10001, 44, '2024-04-21 10:45:41');
|
||||
INSERT INTO `t_learn` VALUES (10070, 10004, 10001, 3, '2024-08-13 07:19:31');
|
||||
INSERT INTO `t_learn` VALUES (10071, 10076, 10001, 39, '2024-10-25 10:09:28');
|
||||
INSERT INTO `t_learn` VALUES (10072, 10056, 10001, 37, '2023-09-01 08:05:29');
|
||||
INSERT INTO `t_learn` VALUES (10073, 10019, 10001, 40, '2024-06-21 07:31:46');
|
||||
INSERT INTO `t_learn` VALUES (10074, 10002, 10001, 38, '2023-03-14 18:31:13');
|
||||
INSERT INTO `t_learn` VALUES (10075, 10064, 10001, 23, '2024-04-01 22:39:29');
|
||||
INSERT INTO `t_learn` VALUES (10076, 10036, 10001, 44, '2023-08-09 04:24:49');
|
||||
INSERT INTO `t_learn` VALUES (10077, 10078, 10001, 40, '2024-10-08 05:24:30');
|
||||
INSERT INTO `t_learn` VALUES (10078, 10081, 10001, 21, '2024-04-09 13:56:25');
|
||||
INSERT INTO `t_learn` VALUES (10079, 10084, 10001, 39, '2023-08-29 11:57:20');
|
||||
INSERT INTO `t_learn` VALUES (10080, 10038, 10001, 15, '2024-10-02 13:21:22');
|
||||
INSERT INTO `t_learn` VALUES (10081, 10025, 10002, 17, '2024-05-17 11:38:34');
|
||||
INSERT INTO `t_learn` VALUES (10082, 10032, 10002, 36, '2024-01-30 10:55:51');
|
||||
INSERT INTO `t_learn` VALUES (10083, 10072, 10002, 44, '2024-09-12 09:41:22');
|
||||
INSERT INTO `t_learn` VALUES (10084, 10010, 10002, 8, '2023-03-23 03:19:04');
|
||||
INSERT INTO `t_learn` VALUES (10085, 10045, 10002, 46, '2023-08-03 01:06:54');
|
||||
INSERT INTO `t_learn` VALUES (10086, 10086, 10002, 42, '2023-11-23 08:05:33');
|
||||
INSERT INTO `t_learn` VALUES (10087, 10050, 10002, 3, '2024-10-27 22:15:01');
|
||||
INSERT INTO `t_learn` VALUES (10088, 10046, 10002, 13, '2024-04-03 07:26:53');
|
||||
INSERT INTO `t_learn` VALUES (10089, 10011, 10002, 31, '2023-09-28 20:42:04');
|
||||
INSERT INTO `t_learn` VALUES (10090, 10055, 10002, 20, '2024-02-03 04:12:27');
|
||||
INSERT INTO `t_learn` VALUES (10091, 10044, 10002, 15, '2023-10-05 10:23:35');
|
||||
INSERT INTO `t_learn` VALUES (10092, 10098, 10002, 35, '2023-05-19 22:15:18');
|
||||
INSERT INTO `t_learn` VALUES (10093, 10040, 10002, 25, '2024-03-04 10:10:18');
|
||||
INSERT INTO `t_learn` VALUES (10094, 10074, 10002, 14, '2024-03-12 11:24:43');
|
||||
INSERT INTO `t_learn` VALUES (10095, 10069, 10002, 11, '2023-01-28 02:34:49');
|
||||
INSERT INTO `t_learn` VALUES (10096, 10067, 10002, 11, '2024-04-29 22:19:43');
|
||||
INSERT INTO `t_learn` VALUES (10097, 10087, 10002, 15, '2023-08-29 06:34:45');
|
||||
INSERT INTO `t_learn` VALUES (10098, 10080, 10002, 24, '2024-11-11 00:58:52');
|
||||
INSERT INTO `t_learn` VALUES (10099, 10093, 10002, 43, '2023-05-12 18:41:48');
|
||||
INSERT INTO `t_learn` VALUES (10100, 10028, 10002, 35, '2023-05-17 17:04:32');
|
||||
INSERT INTO `t_learn` VALUES (10101, 10062, 10002, 11, '2023-01-29 18:14:58');
|
||||
INSERT INTO `t_learn` VALUES (10102, 10049, 10002, 34, '2024-09-25 10:38:12');
|
||||
INSERT INTO `t_learn` VALUES (10103, 10039, 10002, 22, '2024-02-15 18:52:15');
|
||||
INSERT INTO `t_learn` VALUES (10104, 10005, 10002, 29, '2023-04-25 08:55:57');
|
||||
INSERT INTO `t_learn` VALUES (10105, 10065, 10002, 20, '2024-10-30 11:22:37');
|
||||
INSERT INTO `t_learn` VALUES (10106, 10047, 10002, 22, '2023-09-07 21:46:19');
|
||||
INSERT INTO `t_learn` VALUES (10107, 10012, 10002, 10, '2023-10-10 23:42:06');
|
||||
INSERT INTO `t_learn` VALUES (10108, 10037, 10002, 5, '2024-03-09 23:35:22');
|
||||
INSERT INTO `t_learn` VALUES (10109, 10018, 10002, 1, '2024-11-24 06:32:13');
|
||||
INSERT INTO `t_learn` VALUES (10110, 10066, 10002, 27, '2023-12-01 18:53:00');
|
||||
INSERT INTO `t_learn` VALUES (10111, 10063, 10002, 28, '2023-06-25 02:55:53');
|
||||
INSERT INTO `t_learn` VALUES (10112, 10090, 10002, 47, '2024-04-21 14:00:37');
|
||||
INSERT INTO `t_learn` VALUES (10113, 10085, 10002, 33, '2023-03-22 05:46:52');
|
||||
INSERT INTO `t_learn` VALUES (10114, 10092, 10002, 5, '2024-04-13 02:36:54');
|
||||
INSERT INTO `t_learn` VALUES (10115, 10060, 10002, 12, '2023-01-16 11:50:07');
|
||||
INSERT INTO `t_learn` VALUES (10116, 10088, 10002, 7, '2023-10-17 01:08:32');
|
||||
INSERT INTO `t_learn` VALUES (10117, 10071, 10002, 36, '2023-10-10 22:28:02');
|
||||
INSERT INTO `t_learn` VALUES (10118, 10079, 10002, 33, '2024-08-31 07:01:33');
|
||||
INSERT INTO `t_learn` VALUES (10119, 10091, 10002, 6, '2024-12-08 01:13:17');
|
||||
INSERT INTO `t_learn` VALUES (10120, 10003, 10002, 2, '2023-02-18 11:46:20');
|
||||
INSERT INTO `t_learn` VALUES (10121, 10083, 10002, 26, '2023-06-28 14:08:02');
|
||||
INSERT INTO `t_learn` VALUES (10122, 10054, 10002, 43, '2023-09-14 12:57:41');
|
||||
INSERT INTO `t_learn` VALUES (10123, 10017, 10002, 27, '2024-04-29 04:22:03');
|
||||
INSERT INTO `t_learn` VALUES (10124, 10021, 10002, 43, '2023-09-11 09:03:59');
|
||||
INSERT INTO `t_learn` VALUES (10125, 10014, 10002, 31, '2024-06-28 11:20:58');
|
||||
INSERT INTO `t_learn` VALUES (10126, 10051, 10002, 24, '2023-06-19 05:29:25');
|
||||
INSERT INTO `t_learn` VALUES (10127, 10035, 10002, 17, '2024-02-06 00:48:21');
|
||||
INSERT INTO `t_learn` VALUES (10128, 10008, 10002, 29, '2023-12-28 10:32:43');
|
||||
INSERT INTO `t_learn` VALUES (10129, 10100, 10002, 19, '2023-07-23 18:51:30');
|
||||
INSERT INTO `t_learn` VALUES (10130, 10016, 10002, 33, '2024-07-05 11:07:38');
|
||||
INSERT INTO `t_learn` VALUES (10131, 10033, 10002, 9, '2024-06-27 11:06:15');
|
||||
INSERT INTO `t_learn` VALUES (10132, 10022, 10002, 15, '2023-11-29 06:00:37');
|
||||
INSERT INTO `t_learn` VALUES (10133, 10082, 10002, 41, '2024-05-10 13:59:37');
|
||||
INSERT INTO `t_learn` VALUES (10134, 10096, 10002, 11, '2023-02-27 13:35:38');
|
||||
INSERT INTO `t_learn` VALUES (10135, 10030, 10002, 27, '2023-01-08 00:29:21');
|
||||
INSERT INTO `t_learn` VALUES (10136, 10029, 10002, 24, '2024-03-01 05:48:04');
|
||||
INSERT INTO `t_learn` VALUES (10137, 10075, 10002, 21, '2024-11-09 23:10:32');
|
||||
INSERT INTO `t_learn` VALUES (10138, 10053, 10002, 1, '2024-10-28 14:38:52');
|
||||
INSERT INTO `t_learn` VALUES (10139, 10041, 10002, 21, '2024-11-04 06:31:31');
|
||||
INSERT INTO `t_learn` VALUES (10140, 10027, 10002, 14, '2024-08-30 16:31:07');
|
||||
INSERT INTO `t_learn` VALUES (10141, 10031, 10002, 30, '2023-05-27 05:01:32');
|
||||
INSERT INTO `t_learn` VALUES (10142, 10052, 10002, 17, '2024-10-28 01:47:09');
|
||||
INSERT INTO `t_learn` VALUES (10143, 10026, 10002, 30, '2023-07-09 12:57:40');
|
||||
INSERT INTO `t_learn` VALUES (10144, 10089, 10002, 15, '2023-10-01 05:36:14');
|
||||
INSERT INTO `t_learn` VALUES (10145, 10043, 10002, 42, '2024-12-09 18:42:26');
|
||||
INSERT INTO `t_learn` VALUES (10146, 10070, 10002, 11, '2023-02-18 10:25:15');
|
||||
INSERT INTO `t_learn` VALUES (10147, 10059, 10002, 11, '2024-03-30 03:20:04');
|
||||
INSERT INTO `t_learn` VALUES (10148, 10001, 10002, 6, '2024-05-16 09:40:05');
|
||||
INSERT INTO `t_learn` VALUES (10149, 10023, 10002, 44, '2024-04-21 10:45:41');
|
||||
INSERT INTO `t_learn` VALUES (10150, 10004, 10002, 3, '2024-08-13 07:19:31');
|
||||
INSERT INTO `t_learn` VALUES (10151, 10025, 10003, 17, '2024-05-17 11:38:34');
|
||||
INSERT INTO `t_learn` VALUES (10152, 10032, 10003, 36, '2024-01-30 10:55:51');
|
||||
INSERT INTO `t_learn` VALUES (10153, 10072, 10003, 44, '2024-09-12 09:41:22');
|
||||
INSERT INTO `t_learn` VALUES (10154, 10010, 10003, 8, '2023-03-23 03:19:04');
|
||||
INSERT INTO `t_learn` VALUES (10155, 10045, 10003, 46, '2023-08-03 01:06:54');
|
||||
INSERT INTO `t_learn` VALUES (10156, 10086, 10003, 42, '2023-11-23 08:05:33');
|
||||
INSERT INTO `t_learn` VALUES (10157, 10050, 10003, 3, '2024-10-27 22:15:01');
|
||||
INSERT INTO `t_learn` VALUES (10158, 10046, 10003, 13, '2024-04-03 07:26:53');
|
||||
INSERT INTO `t_learn` VALUES (10159, 10011, 10003, 31, '2023-09-28 20:42:04');
|
||||
INSERT INTO `t_learn` VALUES (10160, 10055, 10003, 20, '2024-02-03 04:12:27');
|
||||
INSERT INTO `t_learn` VALUES (10161, 10044, 10003, 15, '2023-10-05 10:23:35');
|
||||
INSERT INTO `t_learn` VALUES (10162, 10098, 10003, 35, '2023-05-19 22:15:18');
|
||||
INSERT INTO `t_learn` VALUES (10163, 10040, 10003, 25, '2024-03-04 10:10:18');
|
||||
INSERT INTO `t_learn` VALUES (10164, 10074, 10003, 14, '2024-03-12 11:24:43');
|
||||
INSERT INTO `t_learn` VALUES (10165, 10069, 10003, 11, '2023-01-28 02:34:49');
|
||||
INSERT INTO `t_learn` VALUES (10166, 10067, 10003, 11, '2024-04-29 22:19:43');
|
||||
INSERT INTO `t_learn` VALUES (10167, 10087, 10003, 15, '2023-08-29 06:34:45');
|
||||
INSERT INTO `t_learn` VALUES (10168, 10080, 10003, 24, '2024-11-11 00:58:52');
|
||||
INSERT INTO `t_learn` VALUES (10169, 10093, 10003, 43, '2023-05-12 18:41:48');
|
||||
INSERT INTO `t_learn` VALUES (10170, 10028, 10003, 35, '2023-05-17 17:04:32');
|
||||
INSERT INTO `t_learn` VALUES (10171, 10062, 10003, 11, '2023-01-29 18:14:58');
|
||||
INSERT INTO `t_learn` VALUES (10172, 10049, 10003, 34, '2024-09-25 10:38:12');
|
||||
INSERT INTO `t_learn` VALUES (10173, 10039, 10003, 22, '2024-02-15 18:52:15');
|
||||
INSERT INTO `t_learn` VALUES (10174, 10005, 10003, 29, '2023-04-25 08:55:57');
|
||||
INSERT INTO `t_learn` VALUES (10175, 10065, 10003, 20, '2024-10-30 11:22:37');
|
||||
INSERT INTO `t_learn` VALUES (10176, 10047, 10003, 22, '2023-09-07 21:46:19');
|
||||
INSERT INTO `t_learn` VALUES (10177, 10012, 10003, 10, '2023-10-10 23:42:06');
|
||||
INSERT INTO `t_learn` VALUES (10178, 10037, 10003, 5, '2024-03-09 23:35:22');
|
||||
INSERT INTO `t_learn` VALUES (10179, 10018, 10003, 1, '2024-11-24 06:32:13');
|
||||
INSERT INTO `t_learn` VALUES (10180, 10066, 10003, 27, '2023-12-01 18:53:00');
|
||||
INSERT INTO `t_learn` VALUES (10181, 10063, 10003, 28, '2023-06-25 02:55:53');
|
||||
INSERT INTO `t_learn` VALUES (10182, 10090, 10003, 47, '2024-04-21 14:00:37');
|
||||
INSERT INTO `t_learn` VALUES (10183, 10085, 10003, 33, '2023-03-22 05:46:52');
|
||||
INSERT INTO `t_learn` VALUES (10184, 10092, 10003, 5, '2024-04-13 02:36:54');
|
||||
INSERT INTO `t_learn` VALUES (10185, 10060, 10003, 12, '2023-01-16 11:50:07');
|
||||
INSERT INTO `t_learn` VALUES (10186, 10088, 10003, 7, '2023-10-17 01:08:32');
|
||||
INSERT INTO `t_learn` VALUES (10187, 10071, 10003, 36, '2023-10-10 22:28:02');
|
||||
INSERT INTO `t_learn` VALUES (10188, 10079, 10003, 33, '2024-08-31 07:01:33');
|
||||
INSERT INTO `t_learn` VALUES (10189, 10091, 10003, 6, '2024-12-08 01:13:17');
|
||||
INSERT INTO `t_learn` VALUES (10190, 10003, 10003, 2, '2023-02-18 11:46:20');
|
||||
INSERT INTO `t_learn` VALUES (10191, 10083, 10003, 26, '2023-06-28 14:08:02');
|
||||
INSERT INTO `t_learn` VALUES (10192, 10054, 10003, 43, '2023-09-14 12:57:41');
|
||||
INSERT INTO `t_learn` VALUES (10193, 10017, 10003, 27, '2024-04-29 04:22:03');
|
||||
INSERT INTO `t_learn` VALUES (10194, 10021, 10003, 43, '2023-09-11 09:03:59');
|
||||
INSERT INTO `t_learn` VALUES (10195, 10014, 10003, 31, '2024-06-28 11:20:58');
|
||||
INSERT INTO `t_learn` VALUES (10196, 10051, 10003, 24, '2023-06-19 05:29:25');
|
||||
INSERT INTO `t_learn` VALUES (10197, 10035, 10003, 17, '2024-02-06 00:48:21');
|
||||
INSERT INTO `t_learn` VALUES (10198, 10008, 10003, 29, '2023-12-28 10:32:43');
|
||||
INSERT INTO `t_learn` VALUES (10199, 10100, 10003, 19, '2023-07-23 18:51:30');
|
||||
INSERT INTO `t_learn` VALUES (10200, 10016, 10003, 33, '2024-07-05 11:07:38');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for t_student
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `t_student`;
|
||||
CREATE TABLE `t_student` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
||||
`password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 10101 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of t_student
|
||||
-- ----------------------------
|
||||
INSERT INTO `t_student` VALUES (10001, '周岚', 'G1WGE2rmBJ', 'BnxWZAnSPk');
|
||||
INSERT INTO `t_student` VALUES (10002, '石晓明', 'O5UrHL3wAk', 'jXvPgYp6T7');
|
||||
INSERT INTO `t_student` VALUES (10003, '丁子韬', 'z6scv3YR39', 'Gkj7yea68K');
|
||||
INSERT INTO `t_student` VALUES (10004, '贾詩涵', 'dDRhbsIFld', '9S5wmKyd8u');
|
||||
INSERT INTO `t_student` VALUES (10005, '贾震南', 'yp6ONN6mPK', 'rESuH77r0D');
|
||||
INSERT INTO `t_student` VALUES (10006, '龚杰宏', '6mX9UUocUJ', 'Vbu9vJS9Eo');
|
||||
INSERT INTO `t_student` VALUES (10007, '金詩涵', 'J7CEMWLje5', '7XYgyIh7xR');
|
||||
INSERT INTO `t_student` VALUES (10008, '秦子异', 'szo1eVBizJ', 'dY2RfyIb1m');
|
||||
INSERT INTO `t_student` VALUES (10009, '袁宇宁', 'J5YrjzB2si', 'UAMXTO3rQ6');
|
||||
INSERT INTO `t_student` VALUES (10010, '姜秀英', '2MU2HeylW4', '1AfW3NhbgN');
|
||||
INSERT INTO `t_student` VALUES (10011, '汤杰宏', 'MpE4EPWxqG', 'oaNVhDmy7z');
|
||||
INSERT INTO `t_student` VALUES (10012, '韦安琪', 'Kdmd781EtP', 'KfjEMQxKep');
|
||||
INSERT INTO `t_student` VALUES (10013, '唐嘉伦', 'V0C7xf6fjc', 'e1r7KJIx8w');
|
||||
INSERT INTO `t_student` VALUES (10014, '韩詩涵', 'J273ldcncO', '8hcoDqM4G5');
|
||||
INSERT INTO `t_student` VALUES (10015, '邱睿', '5f2pShjufE', 'ABRfNTK0oD');
|
||||
INSERT INTO `t_student` VALUES (10016, '田云熙', 'r6GS6H1Y9i', 'QLPFuc1Ymo');
|
||||
INSERT INTO `t_student` VALUES (10017, '任璐', 'fOEFM89DMY', 'fgm3mOBTRs');
|
||||
INSERT INTO `t_student` VALUES (10018, '阎嘉伦', 'uf0T82j8vV', 'MVun8E08gr');
|
||||
INSERT INTO `t_student` VALUES (10019, '杨秀英', '3ZQyavexff', 'tne8w9hwyT');
|
||||
INSERT INTO `t_student` VALUES (10020, '贺岚', 'MUzeIJ2Zho', '3hTbEiOlcV');
|
||||
INSERT INTO `t_student` VALUES (10021, '贾安琪', 'hQKvLXLbdr', 'GxmMRZIVTq');
|
||||
INSERT INTO `t_student` VALUES (10022, '李震南', 'umEYhDRNCg', 'VIttqgl4h2');
|
||||
INSERT INTO `t_student` VALUES (10023, '张璐', 'MLmnE9XMrj', 'Vo0HRIunBH');
|
||||
INSERT INTO `t_student` VALUES (10024, '韦震南', 'g9pxVI84lQ', 'J59D4b8VVF');
|
||||
INSERT INTO `t_student` VALUES (10025, '严睿', 'GxDaQjWmSb', 'liZCUpGHfa');
|
||||
INSERT INTO `t_student` VALUES (10026, '姜杰宏', 'kygY1DCCEp', 'VEGVJlU6Ra');
|
||||
INSERT INTO `t_student` VALUES (10027, '尹震南', 'gDvPS0b24b', 'rjzJgMQWTc');
|
||||
INSERT INTO `t_student` VALUES (10028, '罗璐', 'S0jjEsFNQJ', 'C6stBhYttY');
|
||||
INSERT INTO `t_student` VALUES (10029, '姚云熙', 'vEr1jpIgKr', 'cyuhQPR8Lh');
|
||||
INSERT INTO `t_student` VALUES (10030, '黄子异', 'GRCYTc1DWx', 'kTTYbTor84');
|
||||
INSERT INTO `t_student` VALUES (10031, '何詩涵', 'gk2SUc1U35', 'ZRIAUeMSYs');
|
||||
INSERT INTO `t_student` VALUES (10032, '宋安琪', '35U0zOXWcV', 'Ab3HmKqiqv');
|
||||
INSERT INTO `t_student` VALUES (10033, '陶璐', 'BDNIQACb7W', 'qJD4q0lDsh');
|
||||
INSERT INTO `t_student` VALUES (10034, '顾睿', 'BdjipSZSh3', 'mtRT0VxhFe');
|
||||
INSERT INTO `t_student` VALUES (10035, '高杰宏', '4IhblDisF7', 'LKKHmwgBXD');
|
||||
INSERT INTO `t_student` VALUES (10036, '薛詩涵', 'Y8EEoaicyB', 'rCRrqBFJsv');
|
||||
INSERT INTO `t_student` VALUES (10037, '丁秀英', '9SlsI0PoyD', 'qsxw3ign25');
|
||||
INSERT INTO `t_student` VALUES (10038, '贾晓明', 'odNONklQs9', 'BiO5UOkdnW');
|
||||
INSERT INTO `t_student` VALUES (10039, '任嘉伦', 'VHuzfHBoBO', 'lTAovUC389');
|
||||
INSERT INTO `t_student` VALUES (10040, '胡震南', 'sv46bTnf0P', 'iBzeHjykYx');
|
||||
INSERT INTO `t_student` VALUES (10041, '萧睿', '0TDvbKZIoK', 'zZ9ZYbUS8y');
|
||||
INSERT INTO `t_student` VALUES (10042, '于子韬', 'ByZpvehylm', 'tFjQxRfu6v');
|
||||
INSERT INTO `t_student` VALUES (10043, '吴子韬', 'zgNIgSi0R6', 'NnCXSPGSG9');
|
||||
INSERT INTO `t_student` VALUES (10044, '袁子异', 'QofuPCZDj2', 'OQKCjRA6KL');
|
||||
INSERT INTO `t_student` VALUES (10045, '孙岚', 'RX9ReXfnDD', 'iaFxFUs3UR');
|
||||
INSERT INTO `t_student` VALUES (10046, '袁晓明', '9AnMs8NLT7', 'TBAHhl6HP4');
|
||||
INSERT INTO `t_student` VALUES (10047, '邹云熙', 'cVTK8Zk23n', 'sHZWvI31eg');
|
||||
INSERT INTO `t_student` VALUES (10048, '潘震南', 'sl9DcFJ7l0', 'mCKMLEAWnL');
|
||||
INSERT INTO `t_student` VALUES (10049, '侯安琪', 'y0yHJRlVD0', '8w14vG11Lo');
|
||||
INSERT INTO `t_student` VALUES (10050, '宋致远', 'mbj6fi5LVJ', 'EvI1OF2mUU');
|
||||
INSERT INTO `t_student` VALUES (10051, '向杰宏', 'rdTBGDlk1e', 'KLrEH5OIRV');
|
||||
INSERT INTO `t_student` VALUES (10052, '侯岚', 'vRIL8GezRB', 'BCnlCfMe3i');
|
||||
INSERT INTO `t_student` VALUES (10053, '郝震南', 'N5OHE7WNRd', 'YSEMSIBoF6');
|
||||
INSERT INTO `t_student` VALUES (10054, '田晓明', 'JFjgjbtPYw', 'C1GMv8jJI4');
|
||||
INSERT INTO `t_student` VALUES (10055, '金岚', 'gpRnYYtKUp', 'I7Ha61aFlW');
|
||||
INSERT INTO `t_student` VALUES (10056, '何晓明', 'mIUWaHvpVT', '0sGahlQonR');
|
||||
INSERT INTO `t_student` VALUES (10057, '吕睿', 'FfkVgyM5SS', 'ie36JBbaUq');
|
||||
INSERT INTO `t_student` VALUES (10058, '段岚', 'qZWlkeuZou', 'UxP4bndlVw');
|
||||
INSERT INTO `t_student` VALUES (10059, '宋詩涵', 'McHsYoxoix', 'QedjPd3cfE');
|
||||
INSERT INTO `t_student` VALUES (10060, '谢秀英', 'Pw2td9ptEO', 'YCdTBkV5u1');
|
||||
INSERT INTO `t_student` VALUES (10061, '姚睿', 't4zYkGf3fF', '848evloRxx');
|
||||
INSERT INTO `t_student` VALUES (10062, '贺安琪', '1RjkUEhkZY', '4f0WkjDBkk');
|
||||
INSERT INTO `t_student` VALUES (10063, '段嘉伦', 'qPY9LKYuqQ', 'jeBmxO9JHj');
|
||||
INSERT INTO `t_student` VALUES (10064, '唐震南', 'r6bXO95F2D', 'X3HbgEcK8Y');
|
||||
INSERT INTO `t_student` VALUES (10065, '谢岚', 'naL2KZrHwA', 'AkqosUcsuV');
|
||||
INSERT INTO `t_student` VALUES (10066, '杨安琪', 'AX8Deo1g7Q', 'qaF4nJ5WpP');
|
||||
INSERT INTO `t_student` VALUES (10067, '吴杰宏', 'GMzkfndLZv', 'tVfNr43Awi');
|
||||
INSERT INTO `t_student` VALUES (10068, '曹晓明', '3MhPP9Ba2T', 'WdLUDxvV4D');
|
||||
INSERT INTO `t_student` VALUES (10069, '赵杰宏', 'bifOEeXCWu', 'LOYM3jaDT2');
|
||||
INSERT INTO `t_student` VALUES (10070, '钟安琪', 'RaRkUvlMKo', 'YZvGiLMMPa');
|
||||
INSERT INTO `t_student` VALUES (10071, '向云熙', 'JLLo5dbzOE', 'dwjwJlsE2J');
|
||||
INSERT INTO `t_student` VALUES (10072, '雷晓明', 'SzkAnohkjE', 'vEI4b77pR7');
|
||||
INSERT INTO `t_student` VALUES (10073, '汪云熙', 'Dx0e0UItxA', 'phZtzNxzOq');
|
||||
INSERT INTO `t_student` VALUES (10074, '杨子异', 'fD9kEW1Sq6', 'zImkNQBSUQ');
|
||||
INSERT INTO `t_student` VALUES (10075, '郭睿', 'JnzPqdQDt8', 'gEcH8ew4sF');
|
||||
INSERT INTO `t_student` VALUES (10076, '沈子韬', 'ttt1sSrCzJ', '5ywB4pgDqm');
|
||||
INSERT INTO `t_student` VALUES (10077, '朱子异', 'XnNaK6Q9gu', '888888');
|
||||
INSERT INTO `t_student` VALUES (10078, '侯璐', 'FqbUPAxjR1', 'hTWsxzLogn');
|
||||
INSERT INTO `t_student` VALUES (10079, '许宇宁', 'LkzJ9oO3PV', 'sQ12axSWyz');
|
||||
INSERT INTO `t_student` VALUES (10080, '高云熙', '89PlIz8Y7B', 'h8VtFDBIgf');
|
||||
INSERT INTO `t_student` VALUES (10081, '杜安琪', 'EIeSoLwSW3', 'dla1wIhe3w');
|
||||
INSERT INTO `t_student` VALUES (10082, '冯嘉伦', 'Ot9OQzc5Tf', 'HpucsNAfnU');
|
||||
INSERT INTO `t_student` VALUES (10083, '彭子韬', 'UkeqT8NtJX', '3fPftOFs96');
|
||||
INSERT INTO `t_student` VALUES (10084, '史震南', 'C1ONnCOf1a', '2wTfHZYsnV');
|
||||
INSERT INTO `t_student` VALUES (10085, '尹云熙', 'pPD5hlAxiW', 'R9yAP19RJH');
|
||||
INSERT INTO `t_student` VALUES (10086, '许震南', 'tHPwJY3CDY', 'kwd4uH98o3');
|
||||
INSERT INTO `t_student` VALUES (10087, '李安琪', 'K2r0WllYzO', 'kNRVRYv0qr');
|
||||
INSERT INTO `t_student` VALUES (10088, '林子异', '8Ttbp7gc06', 'lj7SdtOYwS');
|
||||
INSERT INTO `t_student` VALUES (10089, '严嘉伦', 'PNIs8LHIUr', '7XVizBwqrW');
|
||||
INSERT INTO `t_student` VALUES (10090, '黎杰宏', 'rmjckwsCP6', 'O7BYlHG8A5');
|
||||
INSERT INTO `t_student` VALUES (10091, '梁杰宏', 'ya3q3e30R9', 'ZpToh85AMq');
|
||||
INSERT INTO `t_student` VALUES (10092, '张晓明', 'mkY7T8tpA6', 'PW3j7y3ZQS');
|
||||
INSERT INTO `t_student` VALUES (10093, '吴致远', 'ba5fmbCSUO', 'MMfkS9Lwr7');
|
||||
INSERT INTO `t_student` VALUES (10094, '陶詩涵', '7bWA6xXp1A', 'Tlo0LxVlVH');
|
||||
INSERT INTO `t_student` VALUES (10095, '曹睿', 'N08y7yJu15', '8ue93KnrvI');
|
||||
INSERT INTO `t_student` VALUES (10096, '方宇宁', 't9xDmfZaEQ', 'Xm9umRA1Uc');
|
||||
INSERT INTO `t_student` VALUES (10097, '曹安琪', 'vG4ZtAQanT', 'Vth5vsry9y');
|
||||
INSERT INTO `t_student` VALUES (10098, '杨子异', 'YUf12JCtO6', '8999nWETCU');
|
||||
INSERT INTO `t_student` VALUES (10099, '于杰宏', 'l3NbjhRoCR', 'qCPLVovMjL');
|
||||
INSERT INTO `t_student` VALUES (10100, '郑震南', 'G3nVY0YbM8', 'vLRejxC1Ve');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for t_video
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `t_video`;
|
||||
CREATE TABLE `t_video` (
|
||||
`id` int(10) NOT NULL AUTO_INCREMENT,
|
||||
`c_id` int(10) NOT NULL,
|
||||
`title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`link` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 10145 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of t_video
|
||||
-- ----------------------------
|
||||
INSERT INTO `t_video` VALUES (10001, 10001, 'Navicat Monitor requires ', 'https://video.nishiminat.com/CellPhonesAccessories');
|
||||
INSERT INTO `t_video` VALUES (10002, 10003, 'To successfully establish ', 'https://video.kamtl.cn/CenturionGardenOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10003, 10002, 'How we spend our days ', 'http://video.kjialun.net/CenturionGardenOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10004, 10003, 'To successfully establish ', 'https://video.hyhan56.net/Handcrafts');
|
||||
INSERT INTO `t_video` VALUES (10005, 10002, 'If the Show objects under ', 'http://video.shishih.xyz/SportsOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10006, 10003, 'Anyone who has ever made ', 'https://video.anme7.com/Books');
|
||||
INSERT INTO `t_video` VALUES (10007, 10002, 'To get a secure connection, ', 'http://video.manuelell60.info/HealthBabyCare');
|
||||
INSERT INTO `t_video` VALUES (10008, 10002, 'To successfully establish ', 'http://video.imi10.us/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10009, 10003, 'It provides strong authentication ', 'https://video.miutszching.org/Appliances');
|
||||
INSERT INTO `t_video` VALUES (10010, 10001, 'There is no way to happiness. ', 'http://video.vasquedwa.biz/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10011, 10001, 'Import Wizard allows ', 'http://video.stszhin.org/CDsVinyl');
|
||||
INSERT INTO `t_video` VALUES (10012, 10002, 'Flexible settings enable ', 'http://video.psarah.us/Others');
|
||||
INSERT INTO `t_video` VALUES (10013, 10001, 'To connect to a database ', 'http://video.yamadsara.jp/Food');
|
||||
INSERT INTO `t_video` VALUES (10014, 10002, 'If you wait, all that ', 'https://video.wfts1.co.jp/ToysGames');
|
||||
INSERT INTO `t_video` VALUES (10015, 10003, 'It wasn’t raining when ', 'http://video.cook77.net/ToysGames');
|
||||
INSERT INTO `t_video` VALUES (10016, 10002, 'Success consists of going ', 'http://video.zhiyuanding.us/CellPhonesAccessories');
|
||||
INSERT INTO `t_video` VALUES (10017, 10003, 'In other words, Navicat ', 'https://video.waiyeesiu.biz/BeautyPersonalCare');
|
||||
INSERT INTO `t_video` VALUES (10018, 10002, 'If the Show objects under ', 'http://video.sumwinglok.biz/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10019, 10001, 'I will greet this day ', 'https://video.carol3.net/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10020, 10002, 'SQL Editor allows you ', 'https://video.kad.xyz/MusicalInstrument');
|
||||
INSERT INTO `t_video` VALUES (10021, 10003, 'In the Objects tab, you ', 'https://video.luj.org/SportsOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10022, 10003, 'It collects process metrics ', 'https://video.laws10.jp/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10023, 10001, 'Navicat provides powerful ', 'https://video.xiaoming9.net/Appliances');
|
||||
INSERT INTO `t_video` VALUES (10024, 10002, 'A man’s best friends ', 'http://video.zhiyuliang8.jp/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10025, 10002, 'It wasn’t raining when ', 'https://video.hu1942.us/CDsVinyl');
|
||||
INSERT INTO `t_video` VALUES (10026, 10001, 'Anyone who has never ', 'https://video.shim.co.jp/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10027, 10001, 'The reason why a great ', 'http://video.hazukio.org/CollectiblesFineArt');
|
||||
INSERT INTO `t_video` VALUES (10028, 10002, 'Creativity is intelligence having fun.', 'http://video.matsudae07.cn/ToysGames');
|
||||
INSERT INTO `t_video` VALUES (10029, 10002, 'Optimism is the one quality ', 'https://video.zhenjiang711.jp/HouseholdKitchenAppliances');
|
||||
INSERT INTO `t_video` VALUES (10030, 10001, 'A query is used to extract ', 'http://video.karyanchoi.us/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10031, 10001, 'To successfully establish ', 'http://video.kaming43.xyz/SportsOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10032, 10001, 'To successfully establish ', 'http://video.ylu321.net/FilmSupplies');
|
||||
INSERT INTO `t_video` VALUES (10033, 10002, 'In other words, Navicat ', 'https://video.bt10.info/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10034, 10002, 'There is no way to happiness. ', 'http://video.hung9.co.jp/ClothingShoesandJewelry');
|
||||
INSERT INTO `t_video` VALUES (10035, 10002, 'The first step is as good as half over.', 'https://video.muran.jp/Baby');
|
||||
INSERT INTO `t_video` VALUES (10036, 10001, 'All the Navicat Cloud ', 'http://video.gonzalezbru85.cn/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10037, 10002, 'Navicat 15 has added ', 'https://video.jesusoto.co.jp/Appliances');
|
||||
INSERT INTO `t_video` VALUES (10038, 10001, 'It wasn’t raining when ', 'http://video.carant.co.jp/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10039, 10002, 'If your Internet Service ', 'http://video.edwards1.jp/CDsVinyl');
|
||||
INSERT INTO `t_video` VALUES (10040, 10002, 'You must be the change ', 'https://video.zhiyuan2.org/FilmSupplies');
|
||||
INSERT INTO `t_video` VALUES (10041, 10002, 'All journeys have secret ', 'https://video.tlwan4.net/BaggageTravelEquipment');
|
||||
INSERT INTO `t_video` VALUES (10042, 10001, 'It wasn’t raining when ', 'http://video.hanzit.xyz/HealthBabyCare');
|
||||
INSERT INTO `t_video` VALUES (10043, 10002, 'Import Wizard allows ', 'http://video.willimoore83.net/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10044, 10003, 'Navicat is a multi-connections ', 'https://video.porter620.cn/ToysGames');
|
||||
INSERT INTO `t_video` VALUES (10045, 10002, 'Navicat Data Modeler ', 'http://video.su715.com/Food');
|
||||
INSERT INTO `t_video` VALUES (10046, 10001, 'Remember that failure ', 'https://video.watsonapril.jp/FilmSupplies');
|
||||
INSERT INTO `t_video` VALUES (10047, 10003, 'Import Wizard allows ', 'http://video.sarahriv10.xyz/HouseholdKitchenAppliances');
|
||||
INSERT INTO `t_video` VALUES (10048, 10001, 'Navicat Cloud could not ', 'http://video.medw.org/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10049, 10002, 'It collects process metrics ', 'http://video.okamomo.com/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10050, 10003, 'Navicat 15 has added ', 'http://video.renaokada.xyz/Others');
|
||||
INSERT INTO `t_video` VALUES (10051, 10003, 'The On Startup feature ', 'https://video.rythomas104.info/Beauty');
|
||||
INSERT INTO `t_video` VALUES (10052, 10001, 'You will succeed because ', 'http://video.saitoaoshi.co.jp/BaggageTravelEquipment');
|
||||
INSERT INTO `t_video` VALUES (10053, 10001, 'Navicat is a multi-connections ', 'http://video.lzhen.info/MusicalInstrument');
|
||||
INSERT INTO `t_video` VALUES (10054, 10003, 'If it scares you, it ', 'https://video.barnes722.info/MusicalInstrument');
|
||||
INSERT INTO `t_video` VALUES (10055, 10002, 'HTTP Tunneling is a method ', 'http://video.man1.us/SportsOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10056, 10003, 'The On Startup feature ', 'https://video.he506.us/BeautyPersonalCare');
|
||||
INSERT INTO `t_video` VALUES (10057, 10001, 'Navicat Monitor requires ', 'https://video.myam.info/ToysGames');
|
||||
INSERT INTO `t_video` VALUES (10058, 10003, 'Import Wizard allows ', 'https://video.sy7.org/CellPhonesAccessories');
|
||||
INSERT INTO `t_video` VALUES (10059, 10002, 'Success consists of going ', 'https://video.itsuki521.net/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10060, 10003, 'It wasn’t raining when ', 'https://video.hsuankwokkuen1970.org/PetSupplies');
|
||||
INSERT INTO `t_video` VALUES (10061, 10003, 'Remember that failure ', 'http://video.cht.us/CenturionGardenOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10062, 10003, 'The Synchronize to Database ', 'https://video.nakayama17.biz/Baby');
|
||||
INSERT INTO `t_video` VALUES (10063, 10003, 'There is no way to happiness. ', 'http://video.albjohnson.net/HealthBabyCare');
|
||||
INSERT INTO `t_video` VALUES (10064, 10003, 'SQL Editor allows you ', 'http://video.kasumiarai.co.jp/ClothingShoesandJewelry');
|
||||
INSERT INTO `t_video` VALUES (10065, 10001, 'Navicat allows you to ', 'https://video.parker621.com/VideoGames');
|
||||
INSERT INTO `t_video` VALUES (10066, 10001, 'SQL Editor allows you ', 'http://video.sato1222.co.jp/MusicalInstrument');
|
||||
INSERT INTO `t_video` VALUES (10067, 10003, 'Difficult circumstances ', 'http://video.yli614.us/CDsVinyl');
|
||||
INSERT INTO `t_video` VALUES (10068, 10003, 'It wasn’t raining when ', 'http://video.miliksun.net/CellPhonesAccessories');
|
||||
INSERT INTO `t_video` VALUES (10069, 10003, 'In a Telnet session, ', 'https://video.debrama.cn/AutomotivePartsAccessories');
|
||||
INSERT INTO `t_video` VALUES (10070, 10001, 'If opportunity doesn’t ', 'http://video.eitamatsu.org/BaggageTravelEquipment');
|
||||
INSERT INTO `t_video` VALUES (10071, 10003, 'Typically, it is employed ', 'http://video.jamesaguilar.org/Baby');
|
||||
INSERT INTO `t_video` VALUES (10072, 10002, 'I will greet this day ', 'https://video.aokimis.com/Baby');
|
||||
INSERT INTO `t_video` VALUES (10073, 10002, 'The repository database ', 'https://video.kasumiwa2003.cn/ToysGames');
|
||||
INSERT INTO `t_video` VALUES (10074, 10001, 'In the middle of winter ', 'https://video.phillipsj.cn/CenturionGardenOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10075, 10001, 'Difficult circumstances ', 'https://video.lli627.jp/SportsOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10076, 10001, 'It wasn’t raining when ', 'http://video.nanaminishimura7.xyz/Handcrafts');
|
||||
INSERT INTO `t_video` VALUES (10077, 10001, 'A query is used to extract ', 'http://video.hasegak925.us/HouseholdKitchenAppliances');
|
||||
INSERT INTO `t_video` VALUES (10078, 10003, 'The Information Pane ', 'http://video.takasumi.jp/FilmSupplies');
|
||||
INSERT INTO `t_video` VALUES (10079, 10003, 'Always keep your eyes ', 'https://video.huimeicho75.info/CenturionGardenOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10080, 10002, 'In the Objects tab, you ', 'https://video.ashley66.com/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10081, 10002, 'You must be the change ', 'http://video.anqiwe.info/CDsVinyl');
|
||||
INSERT INTO `t_video` VALUES (10082, 10003, 'A man is not old until ', 'http://video.miuraitsuki.xyz/HealthBabyCare');
|
||||
INSERT INTO `t_video` VALUES (10083, 10002, 'In the middle of winter ', 'http://video.sad.biz/HealthBabyCare');
|
||||
INSERT INTO `t_video` VALUES (10084, 10003, 'Navicat Monitor can be ', 'http://video.sm513.xyz/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10085, 10001, 'Flexible settings enable ', 'http://video.rihi.xyz/PetSupplies');
|
||||
INSERT INTO `t_video` VALUES (10086, 10003, 'It provides strong authentication ', 'https://video.weddie.biz/ClothingShoesandJewelry');
|
||||
INSERT INTO `t_video` VALUES (10087, 10002, 'It provides strong authentication ', 'http://video.tsand.com/Baby');
|
||||
INSERT INTO `t_video` VALUES (10088, 10001, 'In the middle of winter ', 'http://video.matsusakura.org/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10089, 10002, 'Instead of wondering ', 'http://video.ayato129.com/ClothingShoesandJewelry');
|
||||
INSERT INTO `t_video` VALUES (10090, 10002, 'In a Telnet session, ', 'https://video.ngliksun44.net/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10091, 10001, 'In the middle of winter ', 'https://video.lanf80.cn/Books');
|
||||
INSERT INTO `t_video` VALUES (10092, 10003, 'Genius is an infinite ', 'http://video.wp9.co.jp/Baby');
|
||||
INSERT INTO `t_video` VALUES (10093, 10003, 'A man’s best friends ', 'https://video.tangcm1956.net/AppsGames');
|
||||
INSERT INTO `t_video` VALUES (10094, 10003, 'Navicat provides powerful ', 'http://video.mingyung2018.com/HouseholdKitchenAppliances');
|
||||
INSERT INTO `t_video` VALUES (10095, 10002, 'Monitored servers include ', 'https://video.wl01.net/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10096, 10001, 'Secure SHell (SSH) is ', 'https://video.yu713.info/PetSupplies');
|
||||
INSERT INTO `t_video` VALUES (10097, 10002, 'Navicat Monitor requires ', 'https://video.fongchiming901.biz/SportsOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10098, 10002, 'In other words, Navicat ', 'https://video.jose17.co.jp/Food');
|
||||
INSERT INTO `t_video` VALUES (10099, 10003, 'A comfort zone is a beautiful ', 'https://video.xiayuni.biz/FilmSupplies');
|
||||
INSERT INTO `t_video` VALUES (10100, 10001, 'There is no way to happiness. ', 'http://video.mo1997.xyz/Beauty');
|
||||
INSERT INTO `t_video` VALUES (10101, 10001, 'SSH serves to prevent ', 'http://video.lsha6.us/CenturionGardenOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10102, 10003, 'It can also manage cloud ', 'http://video.txiuy51.jp/Beauty');
|
||||
INSERT INTO `t_video` VALUES (10103, 10003, 'If you wait, all that ', 'http://video.arthurmo.biz/CenturionGardenOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10104, 10001, 'The first step is as good as half over.', 'http://video.kwokyin306.org/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10105, 10003, 'Remember that failure ', 'http://video.qiuzit4.us/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10106, 10002, 'Navicat Monitor requires ', 'http://video.ricet.jp/HouseholdKitchenAppliances');
|
||||
INSERT INTO `t_video` VALUES (10107, 10002, 'To open a query using ', 'https://video.hashino.us/Others');
|
||||
INSERT INTO `t_video` VALUES (10108, 10003, 'The Synchronize to Database ', 'http://video.nelsondavid10.xyz/ToysGames');
|
||||
INSERT INTO `t_video` VALUES (10109, 10003, 'Genius is an infinite ', 'https://video.lauwl1958.info/MusicalInstrument');
|
||||
INSERT INTO `t_video` VALUES (10110, 10002, 'Navicat Monitor is a ', 'https://video.jia915.co.jp/HealthBabyCare');
|
||||
INSERT INTO `t_video` VALUES (10111, 10003, 'The first step is as good as half over.', 'https://video.sanakayama.xyz/BeautyPersonalCare');
|
||||
INSERT INTO `t_video` VALUES (10112, 10001, 'Export Wizard allows ', 'https://video.watam.co.jp/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10113, 10001, 'Remember that failure ', 'http://video.ntsub.biz/CellPhonesAccessories');
|
||||
INSERT INTO `t_video` VALUES (10114, 10001, 'Secure Sockets Layer(SSL) ', 'http://video.tsubas.us/FilmSupplies');
|
||||
INSERT INTO `t_video` VALUES (10115, 10001, 'You will succeed because ', 'https://video.moralrub.cn/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10116, 10001, 'If you wait, all that ', 'http://video.kathreynolds.biz/Appliances');
|
||||
INSERT INTO `t_video` VALUES (10117, 10003, 'If the Show objects under ', 'https://video.rche.us/ClothingShoesandJewelry');
|
||||
INSERT INTO `t_video` VALUES (10118, 10002, 'After logged in the Navicat ', 'http://video.sefukud3.biz/CDsVinyl');
|
||||
INSERT INTO `t_video` VALUES (10119, 10002, 'The reason why a great ', 'https://video.yinchiehlun.jp/CollectiblesFineArt');
|
||||
INSERT INTO `t_video` VALUES (10120, 10001, 'A query is used to extract ', 'http://video.jialungu.xyz/CDsVinyl');
|
||||
INSERT INTO `t_video` VALUES (10121, 10001, 'To clear or reload various ', 'http://video.soto5.cn/SportsOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10122, 10001, 'How we spend our days ', 'http://video.shingkm.xyz/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10123, 10001, 'A man is not old until ', 'https://video.karenbryant.com/ToysGames');
|
||||
INSERT INTO `t_video` VALUES (10124, 10001, 'You will succeed because ', 'http://video.yanshih4.jp/BaggageTravelEquipment');
|
||||
INSERT INTO `t_video` VALUES (10125, 10003, 'SQL Editor allows you ', 'http://video.fskwok4.xyz/SportsOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10126, 10002, 'To open a query using ', 'https://video.chenrich.cn/VideoGames');
|
||||
INSERT INTO `t_video` VALUES (10127, 10003, 'Always keep your eyes ', 'http://video.hyliao6.cn/HouseholdKitchenAppliances');
|
||||
INSERT INTO `t_video` VALUES (10128, 10003, 'You will succeed because ', 'https://video.mao45.org/CellPhonesAccessories');
|
||||
INSERT INTO `t_video` VALUES (10129, 10001, 'I may not have gone where ', 'http://video.oghikari.net/Books');
|
||||
INSERT INTO `t_video` VALUES (10130, 10003, 'It provides strong authentication ', 'https://video.onhaz2.org/VideoGames');
|
||||
INSERT INTO `t_video` VALUES (10131, 10003, 'Success consists of going ', 'http://video.rikuwa.info/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10132, 10002, 'The repository database ', 'https://video.yuna9.info/AutomotivePartsAccessories');
|
||||
INSERT INTO `t_video` VALUES (10133, 10002, 'All the Navicat Cloud ', 'https://video.johnngar.com/Beauty');
|
||||
INSERT INTO `t_video` VALUES (10134, 10001, 'Export Wizard allows ', 'http://video.zyuan.com/HealthBabyCare');
|
||||
INSERT INTO `t_video` VALUES (10135, 10003, 'The Information Pane ', 'https://video.xuerui9.biz/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10136, 10003, 'The Main Window consists ', 'https://video.ruixu.xyz/ArtsHandicraftsSewing');
|
||||
INSERT INTO `t_video` VALUES (10137, 10001, 'In the middle of winter ', 'https://video.wstang.co.jp/CenturionGardenOutdoor');
|
||||
INSERT INTO `t_video` VALUES (10138, 10003, 'If the plan doesn’t ', 'https://video.mc93.us/BaggageTravelEquipment');
|
||||
INSERT INTO `t_video` VALUES (10139, 10002, 'It can also manage cloud ', 'https://video.ntingfung.info/ToolsHomeDecoration');
|
||||
INSERT INTO `t_video` VALUES (10140, 10001, 'If the Show objects under ', 'http://video.myunxi43.info/Handcrafts');
|
||||
INSERT INTO `t_video` VALUES (10141, 10001, 'If it scares you, it ', 'http://video.endh54.xyz/CellPhonesAccessories');
|
||||
INSERT INTO `t_video` VALUES (10142, 10002, 'The Information Pane ', 'http://video.takwahmok9.us/IndustrialScientificSupplies');
|
||||
INSERT INTO `t_video` VALUES (10143, 10002, 'To connect to a database ', 'http://video.miuramomoe.cn/Appliances');
|
||||
INSERT INTO `t_video` VALUES (10144, 10002, 'Navicat is a multi-connections ', 'http://video.lishiha.net/Appliances');
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
```
|
||||
|
||||
### 题目
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
### 答案
|
||||
|
||||
```sql
|
||||
#1
|
||||
CREATE TABLE t_teacher(
|
||||
id INT(8) PRIMARY KEY,
|
||||
`name` VARCHAR(10),
|
||||
nikename VARCHAR(20),
|
||||
introduce text
|
||||
);
|
||||
|
||||
#2
|
||||
INSERT INTO t_student()
|
||||
VALUES(10101, '王梓星', 'username123', 'password123');
|
||||
|
||||
#3
|
||||
DELETE FROM t_course
|
||||
WHERE id = 10004;
|
||||
|
||||
#4
|
||||
UPDATE t_video v
|
||||
SET v.link = 'www.shipin.mp4'
|
||||
WHERE v.id = 10005;
|
||||
|
||||
#5 tj11
|
||||
SELECT COUNT(*) 'total_students'
|
||||
FROM t_student;
|
||||
|
||||
#6
|
||||
SELECT v.id '视频编号', v.title '标题', v.link '链接地址'
|
||||
FROM t_video v, t_course c
|
||||
WHERE v.c_id = c.id AND c.`name` = '语文';
|
||||
|
||||
#7
|
||||
CREATE VIEW v_education AS
|
||||
SELECT s.`name` '学生姓名', c.`name` '课程名称', l.`schedule` '学习进度', l.createtime '创建时间'
|
||||
FROM t_student s, t_learn l, t_course c
|
||||
WHERE s.id = l.s_id AND l.c_id = c.id;
|
||||
|
||||
#8
|
||||
CREATE TRIGGER tri_insert_student_learn
|
||||
AFTER INSERT ON t_student
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO t_learn (s_id, c_id, schedule, createtime)
|
||||
VALUES (NEW.id, 10001, 0, '2025-01-01');
|
||||
END
|
||||
|
||||
#9
|
||||
CREATE PROCEDURE `sp_get_student_courses`(
|
||||
IN in_student_id INT,
|
||||
OUT out_course_count INT
|
||||
)
|
||||
BEGIN
|
||||
SELECT COUNT(DISTINCT c_id) INTO out_course_count
|
||||
FROM t_learn
|
||||
WHERE s_id = in_student_id ;
|
||||
END
|
||||
```
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
CREATE PROCEDURE `sp_get_student_courses`(
|
||||
IN 【 】 INT,
|
||||
【 】 out_course_count INT
|
||||
)
|
||||
BEGIN
|
||||
SELECT COUNT(DISTINCT c_id) 【 】 out_course_count
|
||||
FROM t_learn
|
||||
WHERE s_id = 【 】 ;
|
||||
END
|
||||
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
CREATE 【 】 tri_insert_student_learn
|
||||
AFTER 【 】 ON t_student
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT 【 】 t_learn (s_id, c_id, schedule, createtime)
|
||||
VALUES (【 】, 10001, 0, '2025-01-01');
|
||||
END
|
||||
+1460
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
@@ -1 +1 @@
|
||||

|
||||

|
||||
|
||||
+1035
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,47 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-------------------------------------------------------------------------
|
||||
题目:在此程序中,函数fun 的功能是:将十进制正整数m 转换成k(1<k<26)进制
|
||||
数,并按位输出。例如,若输入8 和2,则应输出1000
|
||||
(即十进制数8 转换成二进制表示是1000)。
|
||||
------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,不能定义新变量。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
// 函数声明
|
||||
void fun(int m, int k);
|
||||
int main()
|
||||
{
|
||||
int m, k;
|
||||
printf("【请输入十进制正整数m 和进制k(1 < k < 26):】");
|
||||
scanf("%d %d", &m, &k);
|
||||
if (k <= 1 || k >= 26)
|
||||
{
|
||||
printf("错误:k 的值必须在 2 到 25 之间。\n");
|
||||
return 1;
|
||||
}
|
||||
fun(m, k);
|
||||
return 0;
|
||||
}
|
||||
void fun(int m, int k)
|
||||
{
|
||||
char result[65];
|
||||
int remainder, i;
|
||||
int index = 63;
|
||||
result[64] = '\0';
|
||||
/**********Program**********/
|
||||
while(m>0){
|
||||
if(m%k<9){
|
||||
result[index--] = m%k +48;
|
||||
}else{
|
||||
result[index--] = m%k -10+65;
|
||||
}
|
||||
m/=k;
|
||||
}
|
||||
index++;
|
||||
for(;index <65;index++){
|
||||
printf("%c",result[index]);
|
||||
}
|
||||
/********** End **********/
|
||||
printf("\n");
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-------------------------------------------------------------------------
|
||||
题目:键盘输入一个整数n,由这n 个人围成一圈,顺序排号。从第一个人开始报数
|
||||
(从1 到3 报数),凡报到3 的人退出圈子,问最后留下的是原来第几号的那位
|
||||
输入输出如下
|
||||
【请输入整数n: 】99
|
||||
最后留下的是原来第88 号的那位
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,函数中所需变量根据需要自定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
int josephus(int n)
|
||||
{
|
||||
/**********Program**********/
|
||||
int a[n],i,count = 0,k=0;
|
||||
i=n-1;
|
||||
while(i>=0){
|
||||
a[i]=1;
|
||||
i--;
|
||||
}
|
||||
while(count<n){
|
||||
if(a[i]!= 0){
|
||||
k++;
|
||||
if(k%3 == 0){
|
||||
a[i] = 0;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
i=(i+1)%n;
|
||||
}
|
||||
return i;
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n;
|
||||
int result;
|
||||
printf("【请输入整数n: 】");
|
||||
scanf("%d", &n);
|
||||
result = josephus(n);
|
||||
printf("最后留下的是原来第%d 号的那位\n", result);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
请编写函数 fun, 函数的功能是: 移动一维数组中的内容; 若数组中有 n 个整数,
|
||||
要求把下标从 0 到 p(含 p,p 小于等于 n-1 )的数组元素平移到数组的最后,最后
|
||||
输出移动后的数组。
|
||||
示例:
|
||||
【请输入数组元素的个数: 】10
|
||||
【请输入10 个整数:】1 2 3 4 5 6 7 8 9 10
|
||||
【请输入p 的值 (p <= 9):】 5
|
||||
【移动后的数组为: 】7 8 9 10 1 2 3 4 5 6
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
void fun(int *w, int p, int n)
|
||||
{
|
||||
int temp[p + 1];
|
||||
/**********Program**********/
|
||||
int i,k=0;
|
||||
for(i=0;i<p+1;i++){
|
||||
temp[i] = w[i];
|
||||
}
|
||||
for(;i<n;i++){
|
||||
w[k++]=w[i];
|
||||
}
|
||||
for(i=0;k<n;k++){
|
||||
w[k]=temp[i++];
|
||||
}
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int n, p;
|
||||
printf("【请输入数组元素的个数: 】");
|
||||
scanf("%d", &n);
|
||||
int a[n];
|
||||
printf("【请输入%d 个整数:】", n);
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
scanf("%d", &a[i]);
|
||||
}
|
||||
printf("【请输入p 的值 (p <= %d): 】", n - 1);
|
||||
scanf("%d", &p);
|
||||
fun(a, p, n);
|
||||
printf("【移动后的数组为: 】");
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
printf("%d ", a[i]);
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
编写一个 C 语言程序,输入由中括号 [数字和小写字母]组成且无中括号嵌套的字
|
||||
符串。规则如下:[nx](n 为正整数,x 为小写字母)表示将 x 重复 n 次;[nxy]
|
||||
(n 为正整数,x、y 为小写字母)表示将 xy 重复 n 次。实现 fun 函数对输入
|
||||
字符串解码并生成原始字符串。
|
||||
示例1:
|
||||
【请输入符合规则的字符串:】[5wh]
|
||||
【原始字符串:】whwhwhwhwh
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 `main` 或其它函数中给出的内容,
|
||||
仅在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
char *fun(char input[])
|
||||
{
|
||||
int len = strlen(input);
|
||||
char *output = (char *)malloc(1000 * sizeof(char));
|
||||
if (output == NULL)
|
||||
{
|
||||
printf("内存分配失败!\n");
|
||||
return NULL;
|
||||
}
|
||||
int outputIndex = 0;
|
||||
/**********Program**********/
|
||||
int i, s=0, t=1, j, k;
|
||||
for(i=0;i<len;i++){
|
||||
if(input[i] == '['){
|
||||
s = 0;
|
||||
t = 1;
|
||||
while(input[i+1] >= '0' && input[i+1] <= '9'){
|
||||
i++;
|
||||
}
|
||||
while(input[i] != '['){
|
||||
s+=(input[i]-48)*t;
|
||||
t*=10;
|
||||
i--;
|
||||
}
|
||||
i++;
|
||||
while(input[i] >= '0' && input[i] <= '9') i++;
|
||||
for(j=0;j<s;j++){
|
||||
k = i;
|
||||
while(input[k] != ']'){
|
||||
output[outputIndex++] = input[k];
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
output[outputIndex] = '\0';
|
||||
/********** End **********/
|
||||
return output;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
char input[1000];
|
||||
printf("【请输入符合规则的字符串:】\n");
|
||||
scanf("%s", input);
|
||||
char *result = fun(input);
|
||||
if (result != NULL)
|
||||
{
|
||||
printf("【原始字符串:】%s\n", result);
|
||||
free(result);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-----------------------------------------------------------------------
|
||||
键盘输入五个正整数,编写函数求其中偶数之和,并输出结果
|
||||
示例:
|
||||
【请输入五个正整数:】100 222 656 899 65
|
||||
【这五个正整数中的偶数之和为:】978
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,请勿重新定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
int sum_of_even(int arr[], int size);
|
||||
int main()
|
||||
{
|
||||
int numbers[5];
|
||||
int i;
|
||||
int even_sum;
|
||||
printf("【请输入五个正整数:】");
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
if (scanf("%d", &numbers[i]) != 1)
|
||||
{
|
||||
printf("输入有误,请确保输入了五个整数。\n");
|
||||
return 1;
|
||||
}
|
||||
if (numbers[i] <= 0)
|
||||
{
|
||||
printf("输入有误!请确保输入的是正数。\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
even_sum = sum_of_even(numbers, 5);
|
||||
printf("【这五个正整数中的偶数之和为:】%d\n", even_sum);
|
||||
return 0;
|
||||
}
|
||||
int sum_of_even(int arr[], int size)
|
||||
{
|
||||
int sum = 0;
|
||||
int i;
|
||||
/**********Program**********/
|
||||
for(i=0;i<size;i++){
|
||||
if(arr[i]%2 == 0){
|
||||
sum+=arr[i];
|
||||
}
|
||||
}
|
||||
return sum;
|
||||
/********** End **********/
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-----------------------------------------------------------------------
|
||||
规定输入的字符串中只包含字母和*号。编写函数fun,其功能是:将字符串中的前
|
||||
导*号全部
|
||||
删除, 中间和尾部的* 号不删除。例如, 字符串中的内
|
||||
容:"*******A*BC*DEF*G****",删除
|
||||
后字符串编写函中的内容应当是:"A*BC*DEF*G****"编写函数时,不得使用C 语
|
||||
言提供的字符
|
||||
串函数。
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动主函数main 和其它函数中的任何内容,
|
||||
仅在函数fun 的花括号中填入你编写的若干语句,根据情况可以定义新变量。
|
||||
根据情况可以自定义变量
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
void fun(char *a)
|
||||
{
|
||||
/**********Program**********/
|
||||
char *p;
|
||||
p=a;
|
||||
while(*p == '*'){
|
||||
p++;
|
||||
}
|
||||
while(*p != '\0'){
|
||||
*(a++) = *(p++);
|
||||
}
|
||||
*a = '\0';
|
||||
/********** End **********/
|
||||
}
|
||||
main()
|
||||
{
|
||||
char s[81];
|
||||
printf("【Enter a string:】\n");
|
||||
gets(s);
|
||||
fun(s);
|
||||
printf("【The string after deleted:】\n");
|
||||
puts(s);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-----------------------------------------------------------------------
|
||||
编写函数找出能同时满足用3 除余2,用5 除余3,用7 除余2 的所有整数并输出。
|
||||
输入输出如下:
|
||||
【请输入区间的起始值: 】1
|
||||
【请输入区间的结束值:】 100
|
||||
23
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动主函数main 和其它函数中的任何内容,
|
||||
仅在函数isMeetCondition 的花括号中填入你编写的若干语句,根据情况可以定义新变量。
|
||||
根据情况可以自定义变量
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
int isMeetCondition(int num);
|
||||
int main()
|
||||
{
|
||||
int start, end;
|
||||
int i;
|
||||
printf("【请输入区间的起始值: 】");
|
||||
scanf("%d", &start);
|
||||
printf("【请输入区间的结束值: 】");
|
||||
scanf("%d", &end);
|
||||
for (i = start; i <= end; i++)
|
||||
{
|
||||
if (isMeetCondition(i))
|
||||
{
|
||||
printf("%d\n", i);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int isMeetCondition(int num)
|
||||
{
|
||||
/**********Program**********/
|
||||
if(num%3==2&&num%5==3&&num%7==2){
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
/********** End **********/
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-----------------------------------------------------------------------
|
||||
定义一个函数判断一个字符串是否是另一个字符串的子字符串,要求用指针实现。
|
||||
输入输出如下:
|
||||
【请输入第一个字符串:】abcdefg1234qwert
|
||||
【请输入第二个字符串:】4q
|
||||
字符串'4q'是字符串'abcdefg1234qwert'的子字符串
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,请勿重新定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
// 函数声明,用于判断子字符串
|
||||
int isSubstring(char *str1, char *str2);
|
||||
int main()
|
||||
{
|
||||
char str1[100], str2[100];
|
||||
printf("【请输入第一个字符串:】");
|
||||
gets(str1);
|
||||
printf("【请输入第二个字符串:】");
|
||||
gets(str2);
|
||||
if (isSubstring(str1, str2))
|
||||
{
|
||||
printf("字符串'%s'是字符串'%s'的子字符串\n", str2, str1);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("字符串'%s'不是字符串'%s'的子字符串\n", str2, str1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int isSubstring(char *str1, char *str2)
|
||||
{
|
||||
int len1 = strlen(str1);
|
||||
int len2 = strlen(str2);
|
||||
int i, j;
|
||||
/**********Program**********/
|
||||
for(i=0;i<len1;i++){
|
||||
j=0;
|
||||
while(str1[i] == str2[j] && str2[j] != '\0'){
|
||||
i++;
|
||||
j++;
|
||||
}
|
||||
if(j != 0){
|
||||
i-=j;
|
||||
}
|
||||
if(str2[j] == '\0'){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/********** End **********/
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-------------------------------------------------------------------------
|
||||
题目:随机输入一字符串(不包含空格,长度不超过100),删除字符串中的数字
|
||||
字符后输出。
|
||||
例如
|
||||
【请输入字符串:】I will graduate from high school in June 2025
|
||||
【去掉数字后的字符串为:】I will graduate from high school in June
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,请勿重新定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
int main()
|
||||
{
|
||||
char a[100], b[100];
|
||||
int l, i, j;
|
||||
printf("【请输入字符串:】");
|
||||
gets(a);
|
||||
l = strlen(a);
|
||||
j = 0;
|
||||
/**********Program**********/
|
||||
for(i=0;i<l;i++){
|
||||
if(a[i]<'0'||a[i]>'9'){
|
||||
b[j++] = a[i];
|
||||
}
|
||||
}
|
||||
/********** End **********/
|
||||
b[j] = '\0';
|
||||
printf("【去掉数字后的字符串为:】");
|
||||
puts(b);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-------------------------------------------------------------------------
|
||||
题目:以下程序的功能是删去一维数组str 中所有相同的数,使之只剩一个。数组
|
||||
中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。
|
||||
若一维数组中的数据是:
|
||||
2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 7 7 7 8 8 9
|
||||
结果是:2 3 4 5 6 7 8 9
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,请勿重新定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
int del(int str[], int n)
|
||||
{
|
||||
int i, j = 1;
|
||||
/**********Program**********/
|
||||
for(i=2;i<n;i++){
|
||||
if(str[i] != str[j]){
|
||||
str[++j] = str[i];
|
||||
}
|
||||
}
|
||||
j++;
|
||||
return j;
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int str[] = {2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9};
|
||||
int i, m, n = sizeof(str) / sizeof(int);
|
||||
for (i = 0; i < n; i++)
|
||||
printf("%d ", str[i]);
|
||||
m = del(str, n);
|
||||
printf("\n");
|
||||
for (i = 0; i < m; i++)
|
||||
printf("%d ", str[i]);
|
||||
printf("\n");
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*---------------------------------------------------------------------
|
||||
程序设计
|
||||
---------------------------------------------------------------------
|
||||
王老师通过课题专利研发赚到了人生的第一个100 万,他存入银行账户用于理财,
|
||||
每年可以
|
||||
获得4%的收益,在每年的最后一天,他会取出10 万来消费,剩下的继续理财。编
|
||||
写程序计算
|
||||
过多少年以后,账户上的钱会被取完(使用do....while)。
|
||||
---------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
---------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
int main()
|
||||
{
|
||||
int money = 100;
|
||||
int year = 1;
|
||||
/**********Program**********/
|
||||
do{
|
||||
money = money *(1+0.04);
|
||||
money-=10;
|
||||
year++;
|
||||
}while(money > 0);
|
||||
/********** End **********/
|
||||
printf("%d 年后账户上的钱会被花完", year);
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*---------------------------------------------------------------------
|
||||
程序设计
|
||||
---------------------------------------------------------------------
|
||||
通过指针传递实现将一数组中的数据按相反顺序存放。
|
||||
例如:输入20 24 4 13 11
|
||||
输出:11 13 4 24 20
|
||||
---------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
---------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
void sort(int *, int);
|
||||
void main()
|
||||
{
|
||||
int a[5], i;
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
scanf("%d,", &a[i]);
|
||||
}
|
||||
sort(a, 5);
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
printf("%d ", a[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
void sort(int *p, int n)
|
||||
{
|
||||
int i, j, temp;
|
||||
/**********Program**********/
|
||||
for(i=0,j=n-1;i<j;i++,j--){
|
||||
temp = p[i];
|
||||
p[i] = p[j];
|
||||
p[j] = temp;
|
||||
}
|
||||
/********** End **********/
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-------------------------------------------------------------------------
|
||||
题目:编写函数实现输入一串字符串,删除字符串中的重复的字符,然后输出新的
|
||||
字符串(重复字符保留第一次出现的字符)
|
||||
输入输出如下所示
|
||||
请输入一串字符串: mn,mn.,mzxcv,nkh021215468796468765465
|
||||
去除重复字符后的字符串为: mn,.zxcvkh021546879
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,请勿重新定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
void removeDuplicates(char *str);
|
||||
int main()
|
||||
{
|
||||
char str[100];
|
||||
printf("【请输入一个字符串: 】");
|
||||
fgets(str, sizeof(str), stdin);
|
||||
str[strcspn(str, "\n")] = 0;
|
||||
removeDuplicates(str);
|
||||
printf("【去除重复字符后的字符串为:】 %s\n", str);
|
||||
return 0;
|
||||
}
|
||||
void removeDuplicates(char *str)
|
||||
{
|
||||
int seen[256] = {0};
|
||||
int writeIdx = 0;
|
||||
int i;
|
||||
int len = strlen(str);
|
||||
if (str == NULL)
|
||||
return;
|
||||
if (len <= 1)
|
||||
return;
|
||||
/**********Program**********/
|
||||
for(i=0;i<len-1;i++){
|
||||
for(writeIdx=i+1;writeIdx<len;writeIdx++){
|
||||
if(str[i] == str[writeIdx]){
|
||||
seen[writeIdx] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
writeIdx = 0;
|
||||
for(i=0;i<len;i++){
|
||||
if(seen[i]==0){
|
||||
str[writeIdx++] = str[i];
|
||||
}
|
||||
}
|
||||
/********** End **********/
|
||||
str[writeIdx] = '\0';
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-------------------------------------------------------------------------
|
||||
题目:编写函数实现用除二取余的方法,把任意一个十进制正数的二进制序列输出
|
||||
(不考虑溢出)
|
||||
程序输入输出如下所示
|
||||
Enter a decimal number: 2
|
||||
The binary representation is: 10
|
||||
-------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
void decimalToBinary(int decimal)
|
||||
{
|
||||
int remainder;
|
||||
int len = 0;
|
||||
char binary[32];
|
||||
int i;
|
||||
if (decimal == 0)
|
||||
{
|
||||
printf("0");
|
||||
return;
|
||||
}
|
||||
/**********Program**********/
|
||||
for(i=0;decimal>0;i++,decimal/=2){
|
||||
binary[i] = decimal%2+48;
|
||||
}
|
||||
binary[i] = '\0';
|
||||
i--;
|
||||
for(;i>len;i--){
|
||||
remainder = binary[len];
|
||||
binary[len] = binary[i];
|
||||
binary[i] = remainder;
|
||||
len++;
|
||||
}
|
||||
/********** End **********/
|
||||
printf("%s\n", binary);
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int number;
|
||||
printf("【Enter a decimal number: 】");
|
||||
scanf("%d", &number);
|
||||
printf("【The binary representation is: 】");
|
||||
decimalToBinary(number);
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-------------------------------------------------------------------------
|
||||
题目:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第
|
||||
二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩
|
||||
下的一半零一个。直到最后一天早上想再吃时,见只剩下一个桃子了。通过输入来
|
||||
控制吃桃的最后一天,编写函数求第一天共摘了多少桃子。
|
||||
输入输出如下所示:
|
||||
【输入猴子还剩1 个桃子的最后一天: 】10
|
||||
猴子第一天摘了1534 个桃子
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,请勿重新定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
int countPeaches(int lastDay)
|
||||
{
|
||||
int peaches = 1;
|
||||
int day;
|
||||
/**********Program**********/
|
||||
day = lastDay;
|
||||
while(day>1){
|
||||
peaches = (peaches+1)*2;
|
||||
day--;
|
||||
}
|
||||
return peaches;
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int lastDay;
|
||||
int totalPeaches;
|
||||
printf("【输入猴子还剩1 个桃子的最后一天:】 ");
|
||||
scanf("%d", &lastDay);
|
||||
totalPeaches = countPeaches(lastDay);
|
||||
printf("猴子第一天摘了%d 个桃子\n", totalPeaches);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-------------------------------------------------------------------------
|
||||
题目:一瓶汽水一元,两个空瓶子可以换一瓶汽水,输入购买汽水的金额,编写函
|
||||
数计算出一共可以喝多少瓶汽水
|
||||
输入输出如下所示:
|
||||
【请输入购买汽水的金额(元):】 3
|
||||
总共可以喝 5 瓶汽水
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,请勿重新定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
int totalBottles(int money)
|
||||
{
|
||||
int totalBottlesDrank = 0;
|
||||
int boughtBottles = money;
|
||||
int newBottles;
|
||||
/**********Program**********/
|
||||
totalBottlesDrank= money;
|
||||
while(boughtBottles > 1){
|
||||
boughtBottles-=2;
|
||||
boughtBottles++;
|
||||
totalBottlesDrank++;
|
||||
}
|
||||
return totalBottlesDrank;
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int money;
|
||||
int result;
|
||||
printf("【请输入购买汽水的金额(元): 】");
|
||||
scanf("%d", &money);
|
||||
result = totalBottles(money);
|
||||
printf("总共可以喝 %d 瓶汽水\n", result);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
编写函数 fun, 函数 fun 的功能是:求出数组中最大数和次最大数,并把最大数
|
||||
和 a[0]中的数对调、次最大数和 a[1]中的数对调,输出对调后的结果。
|
||||
例如原数组为{3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5},对调后的结果为9 6 4 1 5 3 2 1 5 3 5
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
void fun(int *a, int n)
|
||||
{
|
||||
int max_index = 0;
|
||||
int second_max_index = 0;
|
||||
int i;
|
||||
/**********Program**********/
|
||||
for(i=1;i<n;i++){
|
||||
if(a[i]>a[max_index]){
|
||||
max_index = i;
|
||||
}
|
||||
}
|
||||
i=a[0];
|
||||
a[0]=a[max_index];
|
||||
a[max_index]=i;
|
||||
second_max_index = 1;
|
||||
for(i=1;i<n;i++){
|
||||
if(a[i]>a[second_max_index]){
|
||||
second_max_index = i;
|
||||
}
|
||||
}
|
||||
i=a[1];
|
||||
a[1]=a[second_max_index];
|
||||
a[second_max_index]=i;
|
||||
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int arr[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};
|
||||
int size = sizeof(arr) / sizeof(arr[0]);
|
||||
int i;
|
||||
fun(arr, size);
|
||||
printf("【Modified array: 】");
|
||||
for (i = 0; i < size; i++)
|
||||
{
|
||||
printf("%d ", arr[i]);
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
请编写C 代码,完成计算数组 A 与数组 B 的对称差集(即只属于 A 或者只属
|
||||
于 B 的元素)。提示:可以先将数组 A 和 B 变为递增排序,然后可以使用双指
|
||||
针法来高效地找到它们的对称差集。
|
||||
示例1
|
||||
【请输入数组 A 的大小: 】5
|
||||
【请输入数组 A 的 5 个元素: 】6 5 4 3 2
|
||||
【请输入数组 B 的大小: 】4
|
||||
【请输入数组 B 的 4 个元素: 】7 6 3 8
|
||||
【数组 A 与数组 B 的对称差集为: 】2 4 5 7 8
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
void bubbleSort(int arr[], int size)
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < size - 1; i++)
|
||||
{
|
||||
for (j = 0; j < size - i - 1; j++)
|
||||
{
|
||||
if (arr[j] > arr[j + 1])
|
||||
{
|
||||
// 交换 arr[j] 和 arr[j + 1]
|
||||
int temp = arr[j];
|
||||
arr[j] = arr[j + 1];
|
||||
arr[j + 1] = temp;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int computeSymmetricDifference(int A[], int sizeA, int B[], int sizeB, int C[])
|
||||
{
|
||||
int i = 0, j = 0, k = 0;
|
||||
/**********Program**********/
|
||||
while(i<sizeA){
|
||||
j=0;
|
||||
while(j<sizeB){
|
||||
if(A[i]==B[j]){
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
if(j==sizeB){
|
||||
C[k++]=A[i];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
j=i=0;
|
||||
while(j<sizeB){
|
||||
i=0;
|
||||
while(i<sizeA){
|
||||
if(A[i]==B[j]){
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if(i==sizeA){
|
||||
C[k++]=B[j];
|
||||
}
|
||||
j++;
|
||||
}
|
||||
bubbleSort(C,k);
|
||||
return k;
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int sizeA, sizeB;
|
||||
int i;
|
||||
printf("【请输入数组 A 的大小: 】");
|
||||
scanf("%d", &sizeA);
|
||||
int A[100];
|
||||
printf("【请输入数组 A 的 %d 个元素: 】", sizeA);
|
||||
for (i = 0; i < sizeA; i++)
|
||||
{
|
||||
scanf("%d", &A[i]);
|
||||
}
|
||||
printf("【请输入数组 B 的大小: 】");
|
||||
scanf("%d", &sizeB);
|
||||
int B[100];
|
||||
printf("【请输入数组 B 的 %d 个元素: 】", sizeB);
|
||||
for (i = 0; i < sizeB; i++)
|
||||
{
|
||||
scanf("%d", &B[i]);
|
||||
}
|
||||
int C[200]; // 假设结果数组最大长度为 200,为 A 和 B 长度之和
|
||||
int diffSize = computeSymmetricDifference(A, sizeA, B, sizeB, C);
|
||||
printf("【数组 A 与数组 B 的对称差集为: 】");
|
||||
for (i = 0; i < diffSize; i++)
|
||||
{
|
||||
printf("%d ", C[i]);
|
||||
}
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
函数 fun 的功能是: 将 输入的字符串中的字母转换为按字母序列的后续字母(但
|
||||
Z 转换为 A, z 转换为 a),其它字符不变,最后输出转换后的字符串。
|
||||
示例1:
|
||||
【请输入一个字符串: 】12345QAZWSXrfvtgb!!@!@@¥
|
||||
【转换后的字符串为: 】12345RBAXTYsgwuhc!!@!@@¥
|
||||
------------------------------------------------------------------------
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
void fun(char *str)
|
||||
{
|
||||
/**********Program**********/
|
||||
char *p;
|
||||
p=str;
|
||||
while(*p != '\0'){
|
||||
if(*p>='a'&&*p<='z'){
|
||||
*p=((*p+1)<'z'?(*p+1):'a');
|
||||
}
|
||||
if(*p>='A'&&*p<='Z'){
|
||||
*p=((*p+1)<'Z'?(*p+1):'A');
|
||||
}
|
||||
p++;
|
||||
}
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
char input[100];
|
||||
printf("【请输入一个字符串: 】");
|
||||
fgets(input, sizeof(input), stdin);
|
||||
input[strcspn(input, "\n")] = '\0';
|
||||
fun(input);
|
||||
printf("【转换后的字符串为: 】%s\n", input);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
要求编写一个程序来计算给定整数的平方根的整数部分,功能类似于 C 语言标准
|
||||
库中的 sqrt 函数,但仅返回整数部分结果。
|
||||
示例1:
|
||||
【请输入一个非负整数: 】12
|
||||
【12 的平方根的整数部分是: 】3
|
||||
------------------------------------------------------------------------
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
int mySqrt(int x)
|
||||
{
|
||||
/**********Program**********/
|
||||
int i;
|
||||
for(i=1;;i++){
|
||||
if(i*i==x){
|
||||
return i;
|
||||
}
|
||||
if(i*i>x){
|
||||
return i-1;
|
||||
}
|
||||
}
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int num;
|
||||
while (1)
|
||||
{
|
||||
printf("【请输入一个非负整数: 】");
|
||||
if (scanf("%d", &num) != 1 || num < 0)
|
||||
{
|
||||
while (getchar() != '\n')
|
||||
;
|
||||
printf("输入无效,请输入一个非负整数。\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
int sqrtResult = mySqrt(num);
|
||||
printf("【%d 的平方根的整数部分是: 】%d\n", num, sqrtResult);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
编写一个 C 语言函数,函数接收一个整数数组 arr 以及数组的长度 size 作为参
|
||||
数,使用 bool 类型返回该数组中是否存在重复的元素。在 main 函数中,输入多
|
||||
个正整数(输入非数字字符表示输入结束)并调用该函数,根据返回结果输出相应
|
||||
的提示信息。
|
||||
示例:
|
||||
【请输入多个整数(输入非数字字符结束输入):】1 2 3 4 5 5 6 a
|
||||
数组中存在重复元素。
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
bool hasDuplicates(int arr[], int size)
|
||||
{
|
||||
/**********Program**********/
|
||||
int i,j;
|
||||
for(i=0;i<size-1;i++){
|
||||
for(j=i+1;j<size;j++){
|
||||
if(arr[i]==arr[j]){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
/********** End **********/
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int capacity = 10;
|
||||
int *arr = (int *)malloc(capacity * sizeof(int));
|
||||
if (arr == NULL)
|
||||
{
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
int size = 0;
|
||||
int num;
|
||||
printf("【请输入多个整数(输入非数字字符结束输入):】");
|
||||
while (scanf("%d", &num) == 1)
|
||||
{
|
||||
if (size == capacity)
|
||||
{
|
||||
capacity *= 2;
|
||||
arr = (int *)realloc(arr, capacity * sizeof(int));
|
||||
if (arr == NULL)
|
||||
{
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
arr[size++] = num;
|
||||
}
|
||||
while (getchar() != '\n');
|
||||
if (hasDuplicates(arr, size))
|
||||
{
|
||||
printf("数组中存在重复元素。\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("数组中不存在重复元素。\n");
|
||||
}
|
||||
free(arr);
|
||||
return 0;
|
||||
}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
现在有一位赛车手要驾驶一台电动摩托车去完成多段赛程。这台电动摩托车的电
|
||||
池电量存储
|
||||
上限是 100 度电哦,它有一个标称的平均电耗,也就是每行驶 100 公里,就会消
|
||||
耗 10 度
|
||||
电。这里有个很重要的前提条件要大家牢记呀,每一段赛程的距离都是小于 600
|
||||
公里的哦,
|
||||
并且每次出发的时候,电动摩托车的电池都是充满电的状态呢。还有一个关键的规
|
||||
则得注意
|
||||
哦,如果电动摩托车到达某个地点之后,赛车手查看发现电池内剩余的电量低于电
|
||||
池总电量
|
||||
的 10%(也就是 100×10% = 10 度电或者更少啦),那这个时候就必须得在这个
|
||||
地方给电
|
||||
动摩托车充电了呢,请帮忙计算一下,这名驾驶员在赛程中的哪几段赛程前是需要
|
||||
充电的。
|
||||
示例1:
|
||||
【请输入赛程段数:】
|
||||
5
|
||||
【请输入各段赛程距离,单位公里:】
|
||||
380 200 390 400 300
|
||||
【需要在以下几段赛程前充电:】
|
||||
第 3 段赛程前
|
||||
第 5 段赛程前
|
||||
示例2:
|
||||
【请输入赛程段数:】
|
||||
4
|
||||
【请输入各段赛程距离,单位公里:】
|
||||
190 140 110 80
|
||||
无需充电。
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> // 引入stdlib.h 用于动态内存分配相关操作
|
||||
#define TANK_CAPACITY 100 // 电池总容量(单位:度)
|
||||
#define LOW_FUEL_LIMIT (0.10 * TANK_CAPACITY) // 低电量阈值(10%)
|
||||
#define AVG_CONSUMPTION_PER_100KM 10 // 平均电耗(单位:度/百公里)
|
||||
#define FUEL_CONSUMPTION_PER_KM (AVG_CONSUMPTION_PER_100KM / 100.0) // 每公里电耗(单位:度/公里)
|
||||
int checkRefuelStops(int trips[], int count, int results[])
|
||||
{
|
||||
int refuel_count = 0;
|
||||
double current_fuel = TANK_CAPACITY;
|
||||
/**********Program**********/
|
||||
int i;
|
||||
for(i=0;i<count;i++){
|
||||
current_fuel = current_fuel-FUEL_CONSUMPTION_PER_KM*trips[i];
|
||||
if(current_fuel<=LOW_FUEL_LIMIT){
|
||||
results[refuel_count++]=i+1;
|
||||
current_fuel=TANK_CAPACITY - FUEL_CONSUMPTION_PER_KM*trips[i];
|
||||
}
|
||||
}
|
||||
/********** End **********/
|
||||
return refuel_count;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
int num_trips;
|
||||
printf("【请输入赛程段数:】\n");
|
||||
scanf("%d", &num_trips);
|
||||
int *trips = (int *)malloc(num_trips * sizeof(int));
|
||||
if (trips == NULL)
|
||||
{
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
printf("【请输入各段赛程距离,单位公里:】\n");
|
||||
for (int i = 0; i < num_trips; ++i)
|
||||
{
|
||||
scanf("%d", &trips[i]);
|
||||
}
|
||||
int *results = (int *)malloc(num_trips * sizeof(int));
|
||||
if (results == NULL)
|
||||
{
|
||||
printf("内存分配失败!\n");
|
||||
free(trips);
|
||||
return 1;
|
||||
}
|
||||
int refuel_count = checkRefuelStops(trips, num_trips, results);
|
||||
if (refuel_count > 0)
|
||||
{
|
||||
printf("【需要在以下几段赛程前充电:】\n");
|
||||
for (int i = 0; i < refuel_count; i++)
|
||||
{
|
||||
printf("第 %d 段赛程前\n", results[i]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("无需充电。\n");
|
||||
}
|
||||
free(trips);
|
||||
free(results);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
编写一个 C 语言程序,输入由中括号 [数字和小写字母]组成且无中括号嵌套的字
|
||||
符串。规则如下:[nx](n 为正整数,x 为小写字母)表示将 x 重复 n 次;[nxy]
|
||||
(n 为正整数,x、y 为小写字母)表示将 xy 重复 n 次。实现 fun 函数对输入
|
||||
字符串解码并生成原始字符串。
|
||||
示例1:
|
||||
【请输入符合规则的字符串:】[5wh]
|
||||
【原始字符串:】whwhwhwhwh
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 `main` 或其它函数中给出的内容,
|
||||
仅在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
char *fun(char input[])
|
||||
{
|
||||
int len = strlen(input);
|
||||
char *output = (char *)malloc(1000 * sizeof(char));
|
||||
if (output == NULL)
|
||||
{
|
||||
printf("内存分配失败!\n");
|
||||
return NULL;
|
||||
}
|
||||
int outputIndex = 0;
|
||||
/**********Program**********/
|
||||
int i,s,t;
|
||||
for(i=0;i<len;i++){
|
||||
if(input[i]=='['){
|
||||
i++;
|
||||
s=0;
|
||||
while(input[i] <'a'||input[i]>'z'){
|
||||
s=s*10+(input[i] - 48);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
while(s>0){
|
||||
t=i;
|
||||
while(input[t] != ']'){
|
||||
output[outputIndex++] = input[t++];
|
||||
}
|
||||
s--;
|
||||
}
|
||||
}
|
||||
output[outputIndex] = '\0';
|
||||
/********** End **********/
|
||||
return output;
|
||||
}
|
||||
int main()
|
||||
{
|
||||
char input[1000];
|
||||
printf("【请输入符合规则的字符串:】\n");
|
||||
scanf("%s", input);
|
||||
char *result = fun(input);
|
||||
if (result != NULL)
|
||||
{
|
||||
printf("【原始字符串:】%s\n", result);
|
||||
free(result);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/*-----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
-----------------------------------------------------------------------
|
||||
定义一个函数判断一个字符串是否是另一个字符串的子字符串,要求用指针实现。
|
||||
输入输出如下:
|
||||
【请输入第一个字符串:】abcdefg1234qwert
|
||||
【请输入第二个字符串:】4q
|
||||
字符串'4q'是字符串'abcdefg1234qwert'的子字符串
|
||||
-------------------------------------------------------------------------
|
||||
注意:请勿改动程序中的其他内容,请勿重新定义变量名。
|
||||
------------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
// 函数声明,用于判断子字符串
|
||||
int isSubstring(char *str1, char *str2);
|
||||
int main()
|
||||
{
|
||||
char str1[100], str2[100];
|
||||
printf("【请输入第一个字符串:】");
|
||||
gets(str1);
|
||||
printf("【请输入第二个字符串:】");
|
||||
gets(str2);
|
||||
if (isSubstring(str1, str2))
|
||||
{
|
||||
printf("字符串'%s'是字符串'%s'的子字符串\n", str2, str1);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("字符串'%s'不是字符串'%s'的子字符串\n", str2, str1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
int isSubstring(char *str1, char *str2)
|
||||
{
|
||||
int len1 = strlen(str1);
|
||||
int len2 = strlen(str2);
|
||||
int i, j;
|
||||
/**********Program**********/
|
||||
for(i=0;i<len1;i++){
|
||||
j=0;
|
||||
while(str1[i] == str2[j]&&str2[j] != '\0'){
|
||||
j++;
|
||||
i++;
|
||||
}
|
||||
if(j != len2){
|
||||
i-=j;
|
||||
}
|
||||
if(j == len2){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
/********** End **********/
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
/*---------------------------------------------------------------------
|
||||
程序设计
|
||||
---------------------------------------------------------------------
|
||||
王老师通过课题专利研发赚到了人生的第一个100 万,他存入银行账户用于理财,
|
||||
每年可以
|
||||
获得4%的收益,在每年的最后一天,他会取出10 万来消费,剩下的继续理财。编
|
||||
写程序计算
|
||||
过多少年以后,账户上的钱会被取完(使用do....while)。
|
||||
---------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
---------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
int main()
|
||||
{
|
||||
int money = 100;
|
||||
int year = 1;
|
||||
/**********Program**********/
|
||||
do{
|
||||
money = money *(1+0.04);
|
||||
money-=10;
|
||||
year++;
|
||||
}while(money > 0);
|
||||
/********** End **********/
|
||||
printf("%d 年后账户上的钱会被花完", year);
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*---------------------------------------------------------------------
|
||||
程序设计
|
||||
---------------------------------------------------------------------
|
||||
通过指针传递实现将一数组中的数据按相反顺序存放。
|
||||
例如:输入20 24 4 13 11
|
||||
输出:11 13 4 24 20
|
||||
---------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数main 或其它函数中给出的内容,仅
|
||||
在
|
||||
Program-End 之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End 之外的内容否则不得分。
|
||||
---------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
void sort(int *, int);
|
||||
void main()
|
||||
{
|
||||
int a[5], i;
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
scanf("%d,", &a[i]);
|
||||
}
|
||||
sort(a, 5);
|
||||
for (i = 0; i < 5; i++)
|
||||
{
|
||||
printf("%d ", a[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
void sort(int *p, int n)
|
||||
{
|
||||
int i, j, temp;
|
||||
/**********Program**********/
|
||||
for(i=0,j=n-1;i<j;i++,j--){
|
||||
temp = p[i];
|
||||
p[i] = p[j];
|
||||
p[j] = temp;
|
||||
}
|
||||
/********** End **********/
|
||||
}
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
### 冒泡排序
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void bubblingSort(int *a, int n, int flag){
|
||||
int i, j, t;
|
||||
for(i=0;i<n-1;i++){
|
||||
for(j=0;j<n-1-i;j++){
|
||||
if(flag>0?a[j]>a[j+1]:a[j]<a[j+1]){
|
||||
t = a[j];
|
||||
a[j] = a[j+1];
|
||||
a[j+1] = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void printArray(int *a, int n){
|
||||
int i;
|
||||
for(i=0;i<n;i++){
|
||||
printf("%d ", a[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int main(){
|
||||
int a[] = {100, 1, 3, 2, 9, -1, 20, 30, 10, 50};
|
||||
int n = sizeof(a)/4;
|
||||
bubblingSort(a, n, 1);
|
||||
printArray(a, n);
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 选择排序
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void selectSort(int *a, int n, int flag){
|
||||
int i, j, t;
|
||||
for(i=0;i<n-1;i++){
|
||||
for(j=i;j<n;j++){
|
||||
if(flag > 0?a[i] > a[j]:a[i] < a[j]){
|
||||
t = a[i];
|
||||
a[i] = a[j];
|
||||
a[j] = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void printArray(int *a, int n){
|
||||
int i;
|
||||
for(i=0;i<n;i++){
|
||||
printf("%d ", a[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int main(){
|
||||
int a[] = {100, 1, 3, 2, 9, -1, 20, 30, 10, 50};
|
||||
int n = sizeof(a)/4;
|
||||
selectSort(a, n, 0);
|
||||
printArray(a, n);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 插入排序
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
void insertSort(int *a, int n, int flag){
|
||||
int i, j, t;
|
||||
for(i=1;i<n;i++){//假设前i位已经有序
|
||||
t = a[i];//备份当前需要排序的数
|
||||
j=i-1;//计算出当前位置前一项
|
||||
while((flag>0?a[j] > t:a[j] < t) && j>=0) {
|
||||
a[j+1] = a[j];
|
||||
j--;
|
||||
}
|
||||
a[j+1] = t;
|
||||
}
|
||||
}
|
||||
|
||||
void printArray(int *a, int n){
|
||||
int i;
|
||||
for(i=0;i<n;i++){
|
||||
printf("%d ", a[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
int main(){
|
||||
int a[] = {100, 1, 3, 2, 9, -1, 20, 30, 10, 50};
|
||||
int n = sizeof(a)/4;
|
||||
insertSort(a, n, 0);
|
||||
printArray(a, n);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
+1051
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,37 @@
|
||||
## C语言中的关键字
|
||||
|
||||

|
||||
|
||||
## GCC中数据类型占内存的字节数和表数范围
|
||||
|
||||

|
||||
|
||||
## 运算符的优先级与结合性
|
||||
|
||||

|
||||
|
||||
### 常用字符的ASCII码对照表
|
||||
|
||||

|
||||
|
||||
## 输入输出格式转换说明
|
||||
|
||||
### 表 1 函数 printf() 的格式转换说明
|
||||
|
||||

|
||||

|
||||
|
||||
### 表 2 函数 printf() 的格式修饰符
|
||||
|
||||

|
||||
|
||||
### 表 3 函数 scanf() 的格式转换说明
|
||||
|
||||

|
||||
|
||||
### 表 4 函数 scanf() 的格式修饰符
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
```sql
|
||||
/*
|
||||
1-9题 40分
|
||||
1-4 创建表、修改、添加、删除字段,记录插入、记录删除、记录更新
|
||||
创建主键、外键、唯一约束
|
||||
5.tj11 查询
|
||||
6.tj12 查询
|
||||
7.查询+视图
|
||||
8.触发器
|
||||
9.存储过程、存储函数
|
||||
*/
|
||||
#1-4
|
||||
#创建表(最后一个字段后没有,)
|
||||
CREATE TABLE 表名(
|
||||
字段名 数据类型 约束 [ZEROFILL] DEFAULT 默认值 COMMENT 备注,
|
||||
字段名 数据类型 约束 [ZEROFILL] DEFAULT 默认值 COMMENT 备注
|
||||
);
|
||||
#插入记录
|
||||
INSERT INTO 表名(字段1, 字段2)
|
||||
VALUES(数值1, 数值2);
|
||||
#删除表
|
||||
DROP TABLE 表名;
|
||||
#清空表
|
||||
TRUNCATE 表名;
|
||||
#修改字段数据类型
|
||||
ALTER TABLE 表名 MODIFY 字段名 数据类型 约束;
|
||||
#修改字段名+数据类型
|
||||
ALTER TABLE 表名 CHANGE 字段名 新字段名 数据类型 约束;
|
||||
#删除字段
|
||||
ALTER TABLE 表名 DROP 字段名;
|
||||
#添加字段
|
||||
ALTER TABLE 表名 ADD 字段名 数据类型 约束;
|
||||
#添加主键
|
||||
ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY;
|
||||
ALTER TABLE 表名 ADD CONSTRAINT 主键名 PRIMARY KEY(字段名);
|
||||
#添加自动增长(字段已为主键)
|
||||
ALTER TABLE 表名 MODIFY 字段名 数据类型 AUTO_INCREMENT;
|
||||
#添加自动增长(字段不为主键)
|
||||
ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY AUTO_INCREMENT;
|
||||
#设置自动增长的起始值
|
||||
ALTER TABLE 表名 AUTO_INCREMENT = 数值;
|
||||
#设置默认值
|
||||
ALTER TABLE 表名 ALTER SET DEFAULT 默认值;
|
||||
#添加外键约束
|
||||
ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(字段名) REFERENCES 外键表(主键) [ON UPDATE CASCADE/SET NULL ON DELETE CASCADE/SET NULL]
|
||||
#添加唯一约束
|
||||
ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;
|
||||
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(字段名);
|
||||
#插入记录
|
||||
INSERT INTO 表名()
|
||||
VALUES(DEFAULT, 数值, 数值);
|
||||
INSERT INTO 表名()
|
||||
SET 字段名=数值, 字段名=数值, 字段名=数值;
|
||||
#更新记录
|
||||
UPDATE 表名
|
||||
SET 字段名 = 数值
|
||||
WHERE 条件;
|
||||
#删除记录
|
||||
DELETE FROM 表名
|
||||
WHERE 条件;
|
||||
|
||||
#5-7题 查询、视图
|
||||
SELECT 字段名
|
||||
FROM 表名
|
||||
WHERE 分组前条件
|
||||
GROUP BY 分组字段
|
||||
HAVING 分组后条件
|
||||
ORDER BY 排序的字段名/字段的位置编号(1、2、3)
|
||||
LIMIT 起始位置,记录个数 #位置和C语言数组一样 起始从0开始
|
||||
|
||||
#创建视图
|
||||
CREATE VIEW 视图名 AS
|
||||
查询;
|
||||
#修改视图
|
||||
ALTER VIEW 视图名 AS
|
||||
查询;
|
||||
#删除视图
|
||||
DROP VIEW 视图名;
|
||||
|
||||
#8 触发器
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS 触发器名;
|
||||
CREATE TRIGGER 触发器名
|
||||
BEFORE/AFTER UPDATE/DELETE/INSERT ON 表
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
#需要附带的操作写在BEGIN END 之间
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
#9 存储过程、存储函数
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS 存储过程名;
|
||||
CREATE PROCEDURE 存储过程名(IN/OUT 参数名 数据类型, IN/OUT 参数名 数据类型)
|
||||
BEGIN
|
||||
#需要执行的操作写在BEGIN END 之间
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS 存储函数名;
|
||||
CREATE FUNCTION 存储函数名(参数名 数据类型, 参数名 数据类型)
|
||||
RETURNS 返回值类型
|
||||
DETERMINISTIC/NOT DETERMINISTIC #相同参数返回值确定或者不确定
|
||||
BEGIN
|
||||
RETURN 返回值;#存储函数必须有返回值
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
@@ -0,0 +1,651 @@
|
||||
### 练习一
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#(1)创建数据库
|
||||
CREATE DATABASE test04_Market DEFAULT CHARACTER SET utf8;
|
||||
USE test04_Market;
|
||||
#(2)创建数据表
|
||||
CREATE TABLE customers(
|
||||
c_num INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
c_name VARCHAR(50),
|
||||
c_contact VARCHAR(50),
|
||||
c_city VARCHAR(50),
|
||||
c_birth DATETIME NOT NULL
|
||||
);
|
||||
#(3)更改字段的位置
|
||||
#AFTER/BEFORE 字段名 设置位置在指定字段前/后
|
||||
ALTER TABLE 表名 MODIFY 字段名 数据类型 AFTER/BEFORE 字段名;
|
||||
ALTER TABLE customers MODIFY c_contact VARCHAR(50) AFTER c_birth;
|
||||
#(4)更改字段的数据类型
|
||||
ALTER TABLE customers MODIFY c_name VARCHAR(70);
|
||||
#(5)更改字段名
|
||||
ALTER TABLE customers CHANGE c_contact c_phone VARCHAR(50);
|
||||
#(6)添加字段
|
||||
ALTER TABLE customers ADD c_gender CHAR(1);
|
||||
#(7)更改表名
|
||||
ALTER TABLE customers RENAME TO customers_info;
|
||||
#(8)删除字段
|
||||
ALTER TABLE customers_info DROP c_city;
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#(1)创建表时 添加外键约束并指定外键约束名称
|
||||
CREATE TABLE orders(
|
||||
o_num INT(11) PRIMARY KEY AUTO_INCREMENT,
|
||||
o_date DATE,
|
||||
c_id INT(11),
|
||||
CONSTRAINT fk_cid FOREIGN KEY(c_id) REFERENCES customers_info(c_num)
|
||||
);
|
||||
#(2)
|
||||
#删除指定外键
|
||||
ALTER TABLE orders DROP FOREIGN KEY orders_ibfk_1;
|
||||
#删除指定表
|
||||
DROP TABLE orders;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习二
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#(1)创建表、插入记录
|
||||
CREATE TABLE pet(
|
||||
`name` VARCHAR(20) NOT NULL COMMENT '宠物名称',
|
||||
`owner` VARCHAR(20) COMMENT '宠物主人',
|
||||
species VARCHAR(20) NOT NULL COMMENT '种类',
|
||||
sex CHAR(1) NOT NULL COMMENT '性别',
|
||||
birth YEAR NOT NULL COMMENT '出生日期',
|
||||
death YEAR COMMENT '死亡日期'
|
||||
);
|
||||
INSERT INTO pet()
|
||||
VALUES
|
||||
('Fluffy', 'Harold', 'cat', 'f', 2003, 2010),
|
||||
('Claws', 'Gwen', 'cat', 'm', 2004,NULL ),
|
||||
('Buffy', NULL, 'dog', 'f', 2009, NULL),
|
||||
('Fang', 'Benny', 'dog', 'm', 2000, NULL),
|
||||
('Bowser', 'Diane', 'dog', 'm', 2003, 2009),
|
||||
('Chirpy', NULL, 'bird', 'f', 2008, NULL);
|
||||
#(2)更新记录
|
||||
UPDATE pet
|
||||
SET `owner` = 'Kevin'
|
||||
WHERE `name` = 'Fang';
|
||||
#(3)
|
||||
UPDATE pet
|
||||
SET `owner` = 'Kevin'
|
||||
WHERE `owner` IS NULL;
|
||||
#(4)
|
||||
DELETE FROM pet
|
||||
WHERE death IS NOT NULL;
|
||||
#(5)
|
||||
TRUNCATE pet;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习三
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#1.创建数据库
|
||||
CREATE DATABASE test_compay DEFAULT CHARACTER SET utf8;
|
||||
|
||||
#2.创建表
|
||||
CREATE TABLE department(
|
||||
depid INT PRIMARY KEY AUTO_INCREMENT,
|
||||
depname VARCHAR(20) NOT NULL,
|
||||
deinfo VARCHAR(50)
|
||||
);
|
||||
CREATE TABLE employee(
|
||||
empid INT PRIMARY KEY AUTO_INCREMENT,
|
||||
`name` VARCHAR(20) NOT NULL,
|
||||
sex CHAR(1) NOT NULL DEFAULT '男',
|
||||
title VARCHAR(20) NOT NULL,
|
||||
birthday DATE NOT NULL,
|
||||
depid INT,
|
||||
CONSTRAINT fk_eid_did FOREIGN KEY(depid) REFERENCES department(depid)
|
||||
);
|
||||
CREATE TABLE salary(
|
||||
empid INT,
|
||||
basesalary DECIMAL(10, 2),
|
||||
titleSalary DECIMAL(10, 2),
|
||||
decuction DECIMAL(10, 2)
|
||||
);
|
||||
#3添加外键并设置级联更新、级联删除
|
||||
ALTER TABLE salary ADD CONSTRAINT fk_sal_eid FOREIGN KEY(empid)
|
||||
REFERENCES employee(empid) ON UPDATE CASCADE ON DELETE CASCADE;
|
||||
#4插入记录
|
||||
INSERT INTO department (depid, depname, deinfo)
|
||||
VALUES
|
||||
(111, '生产部', NULL),
|
||||
(222, '销售部', NULL),
|
||||
(333, '人事部', NULL),
|
||||
(444, '财务部', '负责公司财务管理'),
|
||||
(555, '技术部', '负责技术研发与支持'),
|
||||
(666, '市场部', '负责市场推广与品牌建设'),
|
||||
(777, '客服部', '负责客户服务与支持'),
|
||||
(888, '采购部', '负责公司物资采购'),
|
||||
(999, '法务部', '负责公司法律事务'),
|
||||
(1010, '行政部', '负责公司日常行政管理'),
|
||||
(1011, '研发部', '负责新产品研发'),
|
||||
(1012, '培训部', '负责员工培训与发展');
|
||||
|
||||
INSERT INTO employee (empid, name, sex, title, birthday, depid)
|
||||
VALUES
|
||||
(1001, '张三', '男', '高级工程师', '1975-1-1', 111),
|
||||
(1002, '李四', '女', '助工', '1985-1-1', 111),
|
||||
(1003, '王五', '男', '工程师', '1978-11-11', 222),
|
||||
(1004, '赵六', '男', '工程师', '1999-1-1', 222),
|
||||
(1005, '陈七', '女', '会计师', '1980-5-15', 444),
|
||||
(1006, '刘八', '男', '软件工程师', '1990-8-20', 555),
|
||||
(1007, '孙九', '女', '市场经理', '1985-12-25', 666),
|
||||
(1008, '周十', '男', '客服专员', '1992-3-10', 777),
|
||||
(1009, '吴十一', '女', '采购经理', '1988-7-22', 888),
|
||||
(1010, '郑十二', '男', '法务顾问', '1983-9-30', 999),
|
||||
(1011, '王十三', '女', '行政助理', '1995-4-18', 1010),
|
||||
(1012, '李十四', '男', '研发工程师', '1991-11-5', 1011),
|
||||
(1013, '赵十五', '女', '培训讲师', '1987-6-12', 1012),
|
||||
(1014, '孙十六', '男', '技术支持', '1993-2-14', 555),
|
||||
(1015, '杨十七', '女', '销售代表', '1994-8-8', 222);
|
||||
|
||||
INSERT INTO salary (empid, basesalary, titleSalary, decuction)
|
||||
VALUES
|
||||
(1001, 2200, 1100, 200),
|
||||
(1002, 1200, 200, NULL),
|
||||
(1003, 2900, 700, 200),
|
||||
(1004, 1950, 700, 150),
|
||||
(1005, 2500, 800, 100),
|
||||
(1006, 3000, 1200, 250),
|
||||
(1007, 2800, 1000, 200),
|
||||
(1008, 1800, 300, 50),
|
||||
(1009, 3200, 900, 300),
|
||||
(1010, 3500, 1000, 400),
|
||||
(1011, 2000, 400, 100),
|
||||
(1012, 3100, 1100, 200),
|
||||
(1013, 2700, 800, 150),
|
||||
(1014, 2300, 700, 100),
|
||||
(1015, 2600, 600, 200);
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#5
|
||||
SELECT e.empid, e.`name`, e.title, d.depname, s.basesalary + s.titleSalary, s.basesalary + s.titleSalary-IFNULL(s.decuction, 0)
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid;
|
||||
#6
|
||||
SELECT e.`name`, s.basesalary
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid AND d.depname = '销售部';
|
||||
#7
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERe e.`name` LIKE '张%' AND TIMESTAMPDIFF(YEAR,e.birthday, NOW()) < 40;
|
||||
#8
|
||||
SELECT e.`name`, s.basesalary, s.titleSalary
|
||||
FROM employee e, salary s
|
||||
WHERE e.sex = '男' AND e.empid AND s.empid;
|
||||
#9
|
||||
SELECT e.`name`, e.title, d.depname
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid AND s.basesalary < 2000;
|
||||
#10
|
||||
SELECT COUNT(*)
|
||||
FROM employee;
|
||||
#11
|
||||
SELECT COUNT(*)
|
||||
FROM department d;
|
||||
#12
|
||||
SELECT AVG(s.basesalary + s.titleSalary), MAX(s.basesalary + s.titleSalary), MIN(s.basesalary + s.titleSalary)
|
||||
FROM employee e, salary s
|
||||
WHERE e.empid = s.empid;
|
||||
#13
|
||||
SELECT d.depname, AVG(s.basesalary + s.titleSalary)
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
GROUP BY d.depid;
|
||||
#14
|
||||
SELECT d.depname, AVG(s.basesalary + s.titleSalary) avg
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
GROUP BY d.depid
|
||||
HAVING avg<2000;
|
||||
#15
|
||||
SELECT e.empid, e.`name`, s.basesalary, s.titleSalary, s.decuction
|
||||
FROM employee e, salary s, department d
|
||||
WHERE e.empid = s.empid AND e.depid = d.depid
|
||||
ORDER BY s.titleSalary, s.basesalary;
|
||||
#16
|
||||
SELECT e.empid, e.`name`, e.birthday,
|
||||
IF(YEAR(e.birthday) < 1980, '老年',
|
||||
IF(YEAR(e.birthday)< 1990, '中年', '青壮年'))
|
||||
FROM employee e;
|
||||
#17
|
||||
SELECT e.*, depname
|
||||
FROM employee e, department d
|
||||
WHERE e.depid = d.depid;
|
||||
#18
|
||||
SELECT d.*, e.*
|
||||
FROM employee e, department d
|
||||
WHERE e.depid = d.depid;
|
||||
#19
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERE e.title LIKE '%工程师%' AND e.sex = '男';
|
||||
#20
|
||||
SELECT d.depname, e.sex, COUNT(*), AVG(s.basesalary)
|
||||
FROM employee e, department d, salary s
|
||||
WHERE e.depid = d.depid AND e.empid = s.empid
|
||||
GROUP BY d.depid, e.sex;
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 练习四
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#1
|
||||
CREATE DATABASE test_school DEFAULT CHARACTER SET 'UTF8';
|
||||
#2
|
||||
DROP TABLE department;
|
||||
CREATE TABLE department(
|
||||
depNo INT(10) PRIMARY KEY COMMENT '部门号',
|
||||
depName VARCHAR(50) NOT NULL COMMENT '部门名称',
|
||||
depNote VARCHAR(20) COMMENT '部门备注'
|
||||
);
|
||||
CREATE TABLE teacher(
|
||||
number INT PRIMARY KEY COMMENT '教工号',
|
||||
`name` VARCHAR(30) NOT NULL COMMENT '姓名',
|
||||
sex VARCHAR(4) COMMENT '性别',
|
||||
birth DATE COMMENT '出生日期',
|
||||
depNo INT COMMENT '部门号',
|
||||
salary FLOAT COMMENT '工资',
|
||||
address VARCHAR(100) COMMENT '家庭住址'
|
||||
);
|
||||
INSERT INTO department()
|
||||
VALUES
|
||||
(601, '软件技术系', '软件技术等专业'),
|
||||
(602, '网络技术系', '多媒体技术等专业'),
|
||||
(603, '艺术设计系', '广告艺术设计等专业'),
|
||||
(604, '管理工程系', '连锁经营管理等专业');
|
||||
|
||||
INSERT INTO teacher()
|
||||
VALUES
|
||||
(2001, 'Tom', '女', '1970-01-10', 602, 4500, '四川省绵阳市'),
|
||||
(2002, 'Lucy', '男', '1983-12-18', 601, 2500, '北京市昌平区'),
|
||||
(2003, 'Mike', '男', '1990-06-01', 604, 1500, '重庆市渝中区'),
|
||||
(2004, 'James', '女', '1980-10-20', 602, 3500, '四川省成都市'),
|
||||
(2005, 'Jack', '男', '1975-05-30', 603, 1200, '重庆市南岸区');
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#4
|
||||
SELECT *
|
||||
FROM teacher;
|
||||
#5
|
||||
SELECT t.number '教工号', d.depName '部门名称'
|
||||
FROM teacher t, department d
|
||||
WHERE t.depNo = d.depNo AND t.address LIKE '%北京%';
|
||||
#6
|
||||
SELECT t.number, t.`name`
|
||||
FROM teacher t
|
||||
ORDER BY t.salary DESC
|
||||
LIMIT 1;
|
||||
#7
|
||||
SELECT t.number, t.`name`
|
||||
FROM teacher t
|
||||
WHERE t.salary BETWEEN 2500 AND 4000;
|
||||
#8
|
||||
SELECT t.`name`, t.sex, t.salary
|
||||
FROM teacher t, department d
|
||||
WHERE t.depNo = d.depNo AND d.depName = '网络技术系';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习五
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_student CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_student;
|
||||
|
||||
-- 创建表 Classes
|
||||
CREATE TABLE Classes (
|
||||
专业 VARCHAR(50),
|
||||
班级 VARCHAR(50),
|
||||
姓名 VARCHAR(50),
|
||||
性别 VARCHAR(10),
|
||||
座位 INT
|
||||
);
|
||||
|
||||
-- 向表 Classes 插入数据
|
||||
INSERT INTO Classes (专业, 班级, 姓名, 性别, 座位) VALUES
|
||||
('计算机网络', '1班', '张三', '男', 8),
|
||||
('软件工程', '2班', '李四', '男', 12),
|
||||
('计算机维护', '1班', '王五', '男', 9),
|
||||
('计算机网络', '2班', 'LILY', '女', 15),
|
||||
('软件工程', '1班', '小强', '男', 20),
|
||||
('计算机维护', '1班', 'CoCo', '女', 18);
|
||||
|
||||
-- 创建表 Score
|
||||
CREATE TABLE Score (
|
||||
姓名 VARCHAR(50),
|
||||
英语 INT,
|
||||
数学 INT,
|
||||
语文 INT
|
||||
);
|
||||
|
||||
-- 向表 Score 插入数据
|
||||
INSERT INTO Score (姓名, 英语, 数学, 语文) VALUES
|
||||
('张三', 65, 75, 98),
|
||||
('李四', 87, 45, 86),
|
||||
('王五', 98, 85, 65),
|
||||
('LILY', 75, 86, 87),
|
||||
('小强', 85, 60, 58),
|
||||
('CoCo', 96, 87, 70);
|
||||
|
||||
-- 创建表 Records
|
||||
CREATE TABLE Records (
|
||||
姓名 VARCHAR(50),
|
||||
记录 VARCHAR(50)
|
||||
);
|
||||
|
||||
-- 向表 Records 插入数据
|
||||
INSERT INTO Records (姓名, 记录) VALUES
|
||||
('小强', '迟到'),
|
||||
('小强', '事假'),
|
||||
('李四', '旷课'),
|
||||
('李四', '旷课'),
|
||||
('李四', '迟到'),
|
||||
('CoCo', '病假'),
|
||||
('LILY', '事假');
|
||||
```
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
#3
|
||||
UPDATE score s
|
||||
SET s.`语文` = 88
|
||||
WHERE s.`姓名` = '张三';
|
||||
|
||||
#4
|
||||
SELECT AVG(s.`英语`), AVG(s.`数学`), AVG(s.`语文`)
|
||||
FROM classes c, score s
|
||||
WHERE c.`姓名` = s.`姓名` AND c.`班级` = 1 AND c.`专业` = '计算机维护';
|
||||
|
||||
#5
|
||||
SELECT *
|
||||
FROM score s
|
||||
WHERE s.`数学` < 60 OR s.`英语` < 60 OR s.`语文` < 60;
|
||||
|
||||
#6
|
||||
SELECT *
|
||||
FROM score s
|
||||
WHERE s.`姓名` IN (
|
||||
SELECT r.`姓名`
|
||||
FROM records r
|
||||
GROUP BY r.`姓名`
|
||||
HAVING COUNT(*) > 2
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习六
|
||||
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_xuankedb 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_xuankedb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_xuankedb;
|
||||
|
||||
-- 创建学生表 Student
|
||||
CREATE TABLE Student (
|
||||
Sn0 VARCHAR(20) PRIMARY KEY, -- 学号,主键
|
||||
Sname VARCHAR(50), -- 姓名
|
||||
Ssex VARCHAR(10), -- 性别
|
||||
Sage INT, -- 年龄
|
||||
Sdept VARCHAR(50) -- 所在系
|
||||
);
|
||||
|
||||
-- 创建课程表 Course
|
||||
CREATE TABLE Course (
|
||||
Cn0 VARCHAR(20) PRIMARY KEY, -- 课程号,主键
|
||||
Cname VARCHAR(100), -- 课程名
|
||||
Cpn0 VARCHAR(20), -- 选修课号
|
||||
Ccredit INT -- 学分
|
||||
);
|
||||
|
||||
-- 创建成绩表 SG
|
||||
CREATE TABLE SG (
|
||||
Sn0 VARCHAR(20), -- 学号
|
||||
Cn0 VARCHAR(20), -- 课程号
|
||||
Grade INT, -- 成绩
|
||||
PRIMARY KEY (Sn0, Cn0), -- 复合主键 (学号, 课程号)
|
||||
FOREIGN KEY (Sn0) REFERENCES Student(Sn0), -- 外键,引用 Student 表
|
||||
FOREIGN KEY (Cn0) REFERENCES Course(Cn0) -- 外键,引用 Course 表
|
||||
);
|
||||
|
||||
INSERT INTO Student (Sno, Sname, Ssex, Sage, Sdept, Scome) VALUES
|
||||
('05001', '张三', '男', 20, '计算机系', '2021-09-01'),
|
||||
('05002', '李四', '女', 21, '数学系', '2021-09-01'),
|
||||
('05003', '王五', '男', 22, '计算机系', '2021-09-01'),
|
||||
('05004', '李洋', '男', 19, '物理系', '2021-09-01'),
|
||||
('05019', '赵六', '女', 20, '计算机系', '2021-09-01');
|
||||
|
||||
INSERT INTO Course (Cno, Cname, Cpno, Ccredit) VALUES
|
||||
('1', '数据库', NULL, 4),
|
||||
('2', '数学', NULL, 3),
|
||||
('3', '物理', NULL, 3),
|
||||
('4', '操作系统', '1', 4);
|
||||
|
||||
INSERT INTO SG (Sno, Cno, Grade) VALUES
|
||||
('05001', '1', 85),
|
||||
('05001', '2', 90),
|
||||
('05002', '1', 78),
|
||||
('05002', '3', 88),
|
||||
('05003', '1', 92),
|
||||
('05003', '4', 76),
|
||||
('05004', '3', 95),
|
||||
('05019', '1', 80),
|
||||
('05019', '4', 85);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习七
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_library 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_library CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_library;
|
||||
|
||||
-- 创建表 press(出版社)
|
||||
CREATE TABLE press (
|
||||
pressid INT PRIMARY KEY, -- 出版社编号,主键
|
||||
pressname VARCHAR(100), -- 出版社名称
|
||||
address VARCHAR(100) -- 出版社地址
|
||||
);
|
||||
|
||||
-- 创建表 sort(种类)
|
||||
CREATE TABLE sort (
|
||||
sortno INT PRIMARY KEY, -- 种类编号,主键
|
||||
scount INT, -- 数量
|
||||
describes VARCHAR(100) -- 描述
|
||||
);
|
||||
|
||||
-- 创建表 book(图书)
|
||||
CREATE TABLE book (
|
||||
bid INT PRIMARY KEY, -- 图书编号,主键
|
||||
bname VARCHAR(100), -- 图书名称
|
||||
bsortno INT, -- 种类编号
|
||||
pressid INT, -- 出版社编号
|
||||
FOREIGN KEY (bsortno) REFERENCES sort(sortno), -- 外键,引用 sort 表
|
||||
FOREIGN KEY (pressid) REFERENCES press(pressid) -- 外键,引用 press 表
|
||||
);
|
||||
|
||||
-- 向 press 表插入数据
|
||||
INSERT INTO press (pressid, pressname, address) VALUES
|
||||
(100, '外研社', '上海'),
|
||||
(101, '北大出版社', '北京'),
|
||||
(102, '教育出版社', '北京');
|
||||
|
||||
-- 向 sort 表插入数据
|
||||
INSERT INTO sort (sortno, scount, describes) VALUES
|
||||
(11, 50, '小说'),
|
||||
(12, 100, '科幻'),
|
||||
(13, 100, '神话');
|
||||
|
||||
-- 向 book 表插入数据
|
||||
INSERT INTO book (bid, bname, bsortno, pressid) VALUES
|
||||
(1, '红与黑', 11, 100),
|
||||
(2, '幻城', 12, 102),
|
||||
(3, '希腊神话', 13, 102);
|
||||
|
||||
#5
|
||||
SELECT b.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid AND p.pressid = 100;
|
||||
|
||||
#6
|
||||
SELECT b.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid AND p.pressname = '外研社';
|
||||
|
||||
#7
|
||||
SELECT *
|
||||
FROM sort s
|
||||
WHERE s.scount > 100;
|
||||
|
||||
#8
|
||||
SELECT p.*
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid
|
||||
GROUP BY b.pressid
|
||||
HAVING COUNT(*) = (
|
||||
SELECT COUNT(*)
|
||||
FROM book b, press p
|
||||
WHERE p.pressid = b.pressid
|
||||
GROUP BY b.pressid
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 1
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 练习八
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
```sql
|
||||
-- 创建数据库 test_tour 并设置字符集为 utf8mb4
|
||||
CREATE DATABASE test_tour CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
USE test_tour;
|
||||
|
||||
-- 创建表 agency(旅行社表)
|
||||
CREATE TABLE agency (
|
||||
id INT PRIMARY KEY, -- 旅行社编号,主键
|
||||
name VARCHAR(100) NOT NULL, -- 旅行社名
|
||||
address VARCHAR(100) NOT NULL, -- 旅行社地址
|
||||
areaid INT -- 所属区域编号
|
||||
);
|
||||
|
||||
-- 创建表 travel(旅行线路表)
|
||||
CREATE TABLE travel (
|
||||
tid INT PRIMARY KEY, -- 旅行线路编号,主键
|
||||
time VARCHAR(50) NOT NULL, -- 所需时间
|
||||
position VARCHAR(100) NOT NULL, -- 目的地
|
||||
money FLOAT, -- 花费
|
||||
aid INT NOT NULL, -- 所属旅行社编号
|
||||
count INT, -- 报名人数
|
||||
FOREIGN KEY (aid) REFERENCES agency(id) -- 外键,引用 agency 表
|
||||
);
|
||||
|
||||
-- 向 agency 表插入数据
|
||||
INSERT INTO agency (id, name, address) VALUES
|
||||
(101, '青年旅行社', '北京海淀'),
|
||||
(102, '天天旅行社', '天津海院');
|
||||
|
||||
-- 向 travel 表插入数据
|
||||
INSERT INTO travel (tid, time, position, money, aid, count) VALUES
|
||||
(1, '5天', '八达岭', 3000, 101, 10),
|
||||
(2, '7天', '水长城', 5000, 101, 14),
|
||||
(3, '8天', '水长城', 6000, 102, 11);
|
||||
|
||||
#4
|
||||
SELECT a.*
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
GROUP BY a.id
|
||||
HAVING COUNT(*) = (
|
||||
SELECT COUNT(*)
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
GROUP BY a.id
|
||||
ORDER BY COUNT(*) DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#5
|
||||
SELECT t.*
|
||||
FROM travel t
|
||||
WHERE t.count = (
|
||||
SELECT t.count
|
||||
FROM travel t
|
||||
ORDER BY t.count DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#6
|
||||
SELECT *
|
||||
FROM travel t
|
||||
WHERE t.money < 5000;
|
||||
|
||||
#7
|
||||
SELECT a.`name`
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id AND t.money = (
|
||||
SELECT t.money
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id
|
||||
ORDER BY t.money DESC
|
||||
LIMIT 1
|
||||
);
|
||||
|
||||
#8
|
||||
SELECT SUM(t.time)
|
||||
FROM travel t, agency a
|
||||
WHERE t.aid =a.id AND a.`name` = '青年旅行社';
|
||||
```
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+341
@@ -0,0 +1,341 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
|
||||
CREATE FUNCTION calculate_annual_salary (
|
||||
monthly_salary DECIMAL(10, 2)
|
||||
)
|
||||
RETURNS DECIMAL(10, 2)
|
||||
DETERMINISTIC | NOT DETERMINISTIC #结果确定/不确定
|
||||
BEGIN
|
||||
RETURN monthly_salary * 12;
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 表结构与数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 计算员工年薪
|
||||
|
||||
创建一个存储函数 `calculate_annual_salary`,接受员工的月薪作为参数,返回其年薪(假设年薪为月薪的 12 倍)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS calculate_annual_salary;
|
||||
CREATE FUNCTION calculate_annual_salary(sal DECIMAL(10, 2))
|
||||
RETURNS DECIMAL(10, 2)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN sal*12;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
SELECT calculate_annual_salary(3000);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 2: 计算员工工龄
|
||||
|
||||
创建一个存储函数 `calculate_years_of_service`,接受员工的入职日期作为参数,返回该员工的工龄(以年为单位)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS calculate_years_of_service;
|
||||
CREATE FUNCTION calculate_years_of_service(hire_date DATE)
|
||||
RETURNS INT
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN TIMESTAMPDIFF(YEAR,hire_date,NOW());
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT calculate_years_of_service('2023-12-31');
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 3: 根据部门计算平均工资
|
||||
|
||||
创建一个存储函数 `calculate_avg_salary_by_dept`,接受部门 ID 作为参数,返回该部门的平均工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS calculate_avg_salary_by_dept;
|
||||
CREATE FUNCTION calculate_avg_salary_by_dept(dept_id INT)
|
||||
RETURNS DECIMAL(10,2)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN (
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = dept_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT calculate_avg_salary_by_dept(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 4: 根据职位计算平均工资
|
||||
|
||||
创建一个存储函数 `calculate_avg_salary_by_job`,接受职位 ID 作为参数,返回该职位的平均工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS calculate_avg_salary_by_job;
|
||||
CREATE FUNCTION calculate_avg_salary_by_job(job_id INT)
|
||||
RETURNS DECIMAL(10,2)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN (
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = job_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT calculate_avg_salary_by_job(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 5: 计算员工税后工资
|
||||
|
||||
创建一个存储函数 `calculate_net_salary`,接受员工的工资作为参数,返回其税后工资(假设税率为 15%)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS calculate_net_salary;
|
||||
CREATE FUNCTION calculate_net_salary(sal DECIMAL(10, 2))
|
||||
RETURNS DECIMAL(10, 2)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN sal*0.85;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT calculate_net_salary(3000);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 6: 判断员工是否满足加薪条件
|
||||
|
||||
创建一个存储函数 `is_eligible_for_raise`,接受员工的工资和工龄作为参数,返回一个布尔值(1 或 0)。加薪条件如下:
|
||||
|
||||
- 如果工资低于 60000 且工龄大于等于 3 年,返回 1(满足条件)。
|
||||
- 否则返回 0(不满足条件)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS is_eligible_for_raise;
|
||||
CREATE FUNCTION is_eligible_for_raise(sal DECIMAL(10, 2), work_age INT)
|
||||
RETURNS INT
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
IF sal < 60000 AND work_age >= 3 THEN
|
||||
RETURN 1;
|
||||
ELSE
|
||||
RETURN 0;
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT is_eligible_for_raise(3000, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 7: 计算部门总工资
|
||||
|
||||
创建一个存储函数 `calculate_total_salary_by_dept`,接受部门 ID 作为参数,返回该部门所有员工的总工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS calculate_total_salary_by_dept;
|
||||
CREATE FUNCTION calculate_total_salary_by_dept(dept_id INT)
|
||||
RETURNS DECIMAL(10,2)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN (
|
||||
SELECT SUM(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = dept_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT calculate_total_salary_by_dept(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 8: 计算职位总工资
|
||||
|
||||
创建一个存储函数 `calculate_total_salary_by_job`,接受职位 ID 作为参数,返回该职位所有员工的总工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS calculate_total_salary_by_job;
|
||||
CREATE FUNCTION calculate_total_salary_by_job(job_id INT)
|
||||
RETURNS DECIMAL(10,2)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN (
|
||||
SELECT SUM(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = job_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT calculate_total_salary_by_job(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 9: 判断员工是否属于高薪部门
|
||||
|
||||
创建一个存储函数 `is_high_salary_department`,接受部门 ID 作为参数,返回一个布尔值(1 或 0)。如果该部门的平均工资大于等于 70000,返回 1(高薪部门),否则返回 0(非高薪部门)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS is_high_salary_department;
|
||||
CREATE FUNCTION is_high_salary_department(dept_id INT)
|
||||
RETURNS INT
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
IF(
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = dept_id
|
||||
) > 70000 THEN
|
||||
RETURN 1;
|
||||
ELSE
|
||||
RETURN 0;
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT is_high_salary_department(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 10: 计算员工的总收入
|
||||
|
||||
创建一个存储函数 `calculate_total_income`,接受员工的工资和奖金(假设奖金为工资的 10%)作为参数,返回其总收入(工资 + 奖金)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP FUNCTION IF EXISTS calculate_total_income;
|
||||
CREATE FUNCTION calculate_total_income(sal DECIMAL(10, 2))
|
||||
RETURNS DECIMAL(10, 2)
|
||||
DETERMINISTIC
|
||||
BEGIN
|
||||
RETURN sal*1.2;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT calculate_total_income(3000);
|
||||
```
|
||||
|
||||
+529
@@ -0,0 +1,529 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
|
||||
CREATE PROCEDURE GetEmployeeCountByDept (
|
||||
IN dept_id INT,
|
||||
OUT employee_count INT
|
||||
)
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO employee_count
|
||||
FROM employee
|
||||
WHERE dept_id = dept_id;
|
||||
END //
|
||||
|
||||
DELIMITER ;
|
||||
|
||||
IF condition THEN
|
||||
-- 条件为真时执行的代码
|
||||
ELSEIF another_condition THEN
|
||||
-- 另一个条件为真时执行的代码
|
||||
ELSE
|
||||
-- 所有条件都不满足时执行的代码
|
||||
END IF;
|
||||
|
||||
CASE expression
|
||||
WHEN value1 THEN
|
||||
-- 当 expression = value1 时执行的代码
|
||||
WHEN value2 THEN
|
||||
-- 当 expression = value2 时执行的代码
|
||||
ELSE
|
||||
-- 当 expression 不匹配任何值时执行的代码
|
||||
END CASE;
|
||||
|
||||
CASE
|
||||
WHEN condition1 THEN
|
||||
-- 当 condition1 为真时执行的代码
|
||||
WHEN condition2 THEN
|
||||
-- 当 condition2 为真时执行的代码
|
||||
ELSE
|
||||
-- 当所有条件都不满足时执行的代码
|
||||
END CASE;
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 表结构与数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
|
||||
|
||||
---
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 插入新员工
|
||||
|
||||
创建一个存储过程 `add_employee`,接受员工姓名、工资、入职日期、部门ID和职位ID作为参数,并将其插入到 `employee` 表中。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS add_employee;
|
||||
CREATE PROCEDURE add_employee(IN emp_name VARCHAR(100), IN salary DECIMAL(10,2), IN hire_date DATE, IN dept_id INT, IN job_id INT)
|
||||
BEGIN
|
||||
INSERT INTO employee()
|
||||
VALUES(DEFAULT, emp_name, salary, hire_date, dept_id, job_id);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL add_employee('李泽龙', 6666, '2025-3-20', 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 2: 更新员工工资
|
||||
|
||||
创建一个存储过程 `update_employee_salary`,接受员工ID和新的工资作为参数,更新该员工的工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS update_employee_salary;
|
||||
CREATE PROCEDURE update_employee_salary(IN emp_id INT, IN salary DECIMAL(10, 2))
|
||||
BEGIN
|
||||
UPDATE employee e
|
||||
SET e.salary = salary
|
||||
WHERE e.emp_id = emp_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL update_employee_salary(1, 60000);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 3: 删除员工
|
||||
|
||||
创建一个存储过程 `delete_employee`,接受员工ID作为参数,删除该员工的记录。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS delete_employee;
|
||||
CREATE PROCEDURE delete_employee(IN id INT)
|
||||
BEGIN
|
||||
DELETE FROM employee
|
||||
WHERE emp_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL delete_employee(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 4: 查询部门员工
|
||||
|
||||
创建一个存储过程 `get_department_employees`,接受部门ID作为参数,返回该部门所有员工的详细信息。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_employees;
|
||||
CREATE PROCEDURE get_department_employees(IN id INT)
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_employees(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 5: 查询职位员工
|
||||
|
||||
创建一个存储过程 `get_job_employees`,接受职位ID作为参数,返回该职位所有员工的详细信息。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_employees;
|
||||
CREATE PROCEDURE get_job_employees(IN id INT)
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_employees(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 6: 计算部门平均工资
|
||||
|
||||
创建一个存储过程 `calculate_avg_salary_by_dept`,接受部门ID作为参数,返回该部门的平均工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS calculate_avg_salary_by_dept;
|
||||
CREATE PROCEDURE calculate_avg_salary_by_dept(IN id INT)
|
||||
BEGIN
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL calculate_avg_salary_by_dept(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 7: 计算职位平均工资
|
||||
|
||||
创建一个存储过程 `calculate_avg_salary_by_job`,接受职位ID作为参数,返回该职位的平均工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS calculate_avg_salary_by_job;
|
||||
CREATE PROCEDURE calculate_avg_salary_by_job(IN id INT)
|
||||
BEGIN
|
||||
SELECT AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL calculate_avg_salary_by_job(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 8: 查询高薪员工
|
||||
|
||||
创建一个存储过程 `get_high_salary_employees`,接受一个工资阈值作为参数,返回所有工资高于该阈值的员工。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_high_salary_employees;
|
||||
CREATE PROCEDURE get_high_salary_employees(IN sal DECIMAL(10, 2))
|
||||
BEGIN
|
||||
SELECT e.*
|
||||
FROM employee e
|
||||
WHERE e.salary > sal;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_high_salary_employees(50000);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 9: 查询员工工龄
|
||||
|
||||
创建一个存储过程 `get_employee_years_of_service`,接受员工ID作为参数,返回该员工的工龄(以年为单位)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_years_of_service;
|
||||
CREATE PROCEDURE get_employee_years_of_service(IN id INT)
|
||||
BEGIN
|
||||
SELECT -TIMESTAMPDIFF(YEAR,NOW(),e.hire_date)
|
||||
FROM employee e
|
||||
WHERE e.emp_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employee_years_of_service(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 10: 查询部门员工总数
|
||||
|
||||
创建一个存储过程 `get_department_employee_count`,接受部门ID作为参数,返回该部门的员工总数。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_employee_count;
|
||||
CREATE PROCEDURE get_department_employee_count(IN id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_employee_count(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 11: 查询职位员工总数
|
||||
|
||||
创建一个存储过程 `get_job_employee_count`,接受职位ID作为参数,返回该职位的员工总数。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_employee_count;
|
||||
CREATE PROCEDURE get_job_employee_count(IN id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_employee_count(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 12: 查询员工详细信息
|
||||
|
||||
创建一个存储过程 `get_employee_details`,接受员工ID作为参数,返回该员工的姓名、工资、部门名称和职位名称。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_details;
|
||||
CREATE PROCEDURE get_employee_details(IN emp_id INT)
|
||||
BEGIN
|
||||
SELECT e.emp_name, e.salary, d.dept_name, j.job_title
|
||||
FROM employee e, department d, job j
|
||||
WHERE e.emp_id = emp_id AND e.dept_id = d.dept_id AND e.job_id = j.job_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employee_details(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 13: 查询部门最高工资
|
||||
|
||||
创建一个存储过程 `get_department_max_salary`,接受部门ID作为参数,返回该部门的最高工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_max_salary;
|
||||
CREATE PROCEDURE get_department_max_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_max_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 14: 查询职位最低工资
|
||||
|
||||
创建一个存储过程 `get_job_min_salary`,接受职位ID作为参数,返回该职位的最低工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_min_salary;
|
||||
CREATE PROCEDURE get_job_min_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT MIN(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_min_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 15: 查询员工工资排名
|
||||
|
||||
创建一个存储过程 `get_employee_salary_rank`,接受员工ID作为参数,返回该员工在公司中的工资排名。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employee_salary_rank;
|
||||
CREATE PROCEDURE get_employee_salary_rank(IN emp_id INT)
|
||||
BEGIN
|
||||
SELECT COUNT(*) + 1
|
||||
FROM employee e
|
||||
WHERE e.salary > (
|
||||
SELECT e.salary
|
||||
FROM employee e
|
||||
WHERE e.emp_id = emp_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
CALL get_employee_salary_rank(2);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 16: 查询部门工资总和
|
||||
|
||||
创建一个存储过程 `get_department_total_salary`,接受部门ID作为参数,返回该部门所有员工的工资总和。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_total_salary;
|
||||
CREATE PROCEDURE get_department_total_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT SUM(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_total_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 17: 查询职位工资总和
|
||||
|
||||
创建一个存储过程 `get_job_total_salary`,接受职位ID作为参数,返回该职位所有员工的工资总和。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_total_salary;
|
||||
CREATE PROCEDURE get_job_total_salary(IN id INT)
|
||||
BEGIN
|
||||
SELECT SUM(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_total_salary(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 18: 查询员工入职年份分布
|
||||
|
||||
创建一个存储过程 `get_employees_by_hire_year`,接受年份作为参数,返回该年份入职的所有员工。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_employees_by_hire_year;
|
||||
CREATE PROCEDURE get_employees_by_hire_year(IN y INT)
|
||||
BEGIN
|
||||
SELECT *
|
||||
FROM employee e
|
||||
WHERE YEAR(e.hire_date) = y;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_employees_by_hire_year(2020);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 19: 查询部门工资分布
|
||||
|
||||
创建一个存储过程 `get_department_salary_distribution`,接受部门ID作为参数,返回该部门工资的分布情况(如最高、最低、平均工资)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_department_salary_distribution;
|
||||
CREATE PROCEDURE get_department_salary_distribution(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary), MIN(e.salary), AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_department_salary_distribution(1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 20: 查询职位工资分布
|
||||
|
||||
创建一个存储过程 `get_job_salary_distribution`,接受职位ID作为参数,返回该职位工资的分布情况(如最高、最低、平均工资)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP PROCEDURE IF EXISTS get_job_salary_distribution;
|
||||
CREATE PROCEDURE get_job_salary_distribution(IN id INT)
|
||||
BEGIN
|
||||
SELECT MAX(e.salary), MIN(e.salary), AVG(e.salary)
|
||||
FROM employee e
|
||||
WHERE e.job_id = id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
CALL get_job_salary_distribution(1);
|
||||
```
|
||||
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
+610
@@ -0,0 +1,610 @@
|
||||
### 语法结构
|
||||
|
||||
```sql
|
||||
DELIMITER //
|
||||
CREATE TRIGGER trigger_name
|
||||
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
-- 触发器的逻辑代码
|
||||
-- 可以包含 SQL 语句、流程控制语句(如 IF、CASE 等)、变量声明等
|
||||
END//
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
### 表结构和数据
|
||||
|
||||
```sql
|
||||
-- 创建数据库
|
||||
CREATE DATABASE company CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- 使用数据库
|
||||
USE company;
|
||||
|
||||
-- 创建 department 表
|
||||
CREATE TABLE department (
|
||||
dept_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '部门ID,主键',
|
||||
dept_name VARCHAR(100) NOT NULL COMMENT '部门名称',
|
||||
location VARCHAR(100) NOT NULL COMMENT '部门所在地'
|
||||
);
|
||||
|
||||
-- 创建 job 表
|
||||
CREATE TABLE job (
|
||||
job_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '职位ID,主键',
|
||||
job_title VARCHAR(100) NOT NULL COMMENT '职位名称',
|
||||
min_salary DECIMAL(10, 2) NOT NULL COMMENT '最低工资',
|
||||
max_salary DECIMAL(10, 2) NOT NULL COMMENT '最高工资'
|
||||
);
|
||||
|
||||
-- 创建 employee 表
|
||||
CREATE TABLE employee (
|
||||
emp_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID,主键',
|
||||
emp_name VARCHAR(100) NOT NULL COMMENT '员工姓名',
|
||||
salary DECIMAL(10, 2) NOT NULL COMMENT '员工工资',
|
||||
hire_date DATE NOT NULL COMMENT '入职日期',
|
||||
dept_id INT COMMENT '部门ID,外键',
|
||||
job_id INT COMMENT '职位ID,外键',
|
||||
FOREIGN KEY (dept_id) REFERENCES department(dept_id),
|
||||
FOREIGN KEY (job_id) REFERENCES job(job_id)
|
||||
);
|
||||
|
||||
INSERT INTO department (dept_name, location) VALUES
|
||||
('HR', 'New York'),
|
||||
('IT', 'San Francisco'),
|
||||
('Finance', 'Chicago'),
|
||||
('Marketing', 'Los Angeles'),
|
||||
('Sales', 'Boston'),
|
||||
('Operations', 'Houston'),
|
||||
('Research', 'Seattle'),
|
||||
('Customer Support', 'Austin');
|
||||
|
||||
INSERT INTO job (job_title, min_salary, max_salary) VALUES
|
||||
('Manager', 60000.00, 100000.00),
|
||||
('Developer', 50000.00, 80000.00),
|
||||
('Analyst', 45000.00, 70000.00),
|
||||
('Designer', 40000.00, 65000.00),
|
||||
('Sales Executive', 35000.00, 60000.00),
|
||||
('HR Specialist', 40000.00, 70000.00),
|
||||
('Finance Analyst', 50000.00, 75000.00),
|
||||
('Marketing Coordinator', 45000.00, 70000.00),
|
||||
('Operations Manager', 55000.00, 90000.00),
|
||||
('Research Scientist', 60000.00, 95000.00),
|
||||
('Customer Support Representative', 35000.00, 55000.00);
|
||||
|
||||
INSERT INTO employee (emp_name, salary, hire_date, dept_id, job_id) VALUES
|
||||
('Alice', 70000.00, '2020-01-15', 1, 1),
|
||||
('Bob', 65000.00, '2019-03-22', 2, 2),
|
||||
('Charlie', 55000.00, '2018-07-30', 2, 3),
|
||||
('David', 60000.00, '2021-05-10', 3, 4),
|
||||
('Eva', 50000.00, '2017-11-05', 4, 5),
|
||||
('Frank', 75000.00, '2016-09-12', 5, 1),
|
||||
('Grace', 48000.00, '2022-02-20', 1, 2),
|
||||
('Henry', 52000.00, '2021-08-15', 2, 3),
|
||||
('Ivy', 58000.00, '2020-04-10', 3, 4),
|
||||
('Jack', 62000.00, '2019-12-01', 4, 5),
|
||||
('Katie', 53000.00, '2021-07-25', 5, 6),
|
||||
('Leo', 67000.00, '2018-05-18', 6, 7),
|
||||
('Mona', 49000.00, '2020-11-30', 7, 8),
|
||||
('Nina', 71000.00, '2019-02-14', 8, 9),
|
||||
('Oscar', 56000.00, '2022-03-05', 1, 10),
|
||||
('Paul', 63000.00, '2021-09-12', 2, 11),
|
||||
('Quincy', 54000.00, '2020-06-20', 3, 1),
|
||||
('Rachel', 59000.00, '2019-08-15', 4, 2),
|
||||
('Steve', 68000.00, '2018-12-10', 5, 3),
|
||||
('Tina', 51000.00, '2022-01-22', 6, 4),
|
||||
('Uma', 72000.00, '2021-04-18', 7, 5),
|
||||
('Victor', 57000.00, '2020-07-30', 8, 6),
|
||||
('Wendy', 64000.00, '2019-10-05', 1, 7),
|
||||
('Xander', 50000.00, '2022-05-12', 2, 8),
|
||||
('Yara', 69000.00, '2021-03-25', 3, 9),
|
||||
('Zack', 55000.00, '2020-09-15', 4, 10),
|
||||
('Amy', 61000.00, '2019-06-20', 5, 11),
|
||||
('Brian', 74000.00, '2018-04-10', 6, 1),
|
||||
('Cathy', 52000.00, '2022-07-18', 7, 2),
|
||||
('Derek', 67000.00, '2021-12-01', 8, 3);
|
||||
```
|
||||
|
||||
### `SIGNAL` 语句的基本语法
|
||||
|
||||
```sql
|
||||
SIGNAL SQLSTATE '状态码'
|
||||
SET MESSAGE_TEXT = '错误消息';
|
||||
```
|
||||
|
||||
- **SQLSTATE**:一个 5 字符的字符串,表示错误的状态码。MySQL 使用 `'45000'` 表示用户定义的错误。
|
||||
- **MESSAGE_TEXT**:自定义的错误消息,用于描述错误的原因。
|
||||
|
||||
### 练习题
|
||||
|
||||
#### 练习题 1: 工资范围验证
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据之前,检查员工的工资是否在其对应职位的 `min_salary` 和 `max_salary` 范围内。如果超出范围,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
|
||||
IF NEW.salary > (
|
||||
SELECT j.max_salary
|
||||
FROM job j
|
||||
WHERE j.job_id = NEW.job_id
|
||||
) OR NEW.salary < (
|
||||
SELECT j.min_salary
|
||||
FROM job j
|
||||
WHERE j.job_id = NEW.job_id
|
||||
) THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '工资值错误,不在职务工资范围内';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 0, NOW(), 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 2: 自动更新部门人数
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新 `department` 表中的部门人数(假设 `department` 表新增一个字段 `employee_count`)。
|
||||
|
||||
```sql
|
||||
ALTER TABLE department ADD employee_count INT UNSIGNED;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE department d
|
||||
SET d.employee_count = (
|
||||
SELECT COUNT(*)
|
||||
FROM employee e
|
||||
WHERE e.dept_id = d.dept_id
|
||||
);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, NOW(), 1, 1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 3: 工资变更日志
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `salary` 字段后,将变更记录插入到一个新的日志表 `salary_log` 中,记录员工 ID、旧工资、新工资和变更时间。
|
||||
|
||||
```sql
|
||||
DROP TABLE IF EXISTS salary_log;
|
||||
CREATE TABLE salary_log(
|
||||
emp_id INT,
|
||||
old_salary DECIMAL(10, 2),
|
||||
new_slaray DECIMAL(10, 2),
|
||||
update_date DATE
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
BEFORE UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.salary <> OLD.salary THEN
|
||||
INSERT INTO salary_log()
|
||||
VALUES(NEW.emp_id, OLD.salary, NEW.salary, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
UPDATE employee e
|
||||
SET e.salary = 10
|
||||
WHERE e.emp_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 4: 删除员工时备份数据
|
||||
|
||||
创建一个触发器 `before_employee_delete`,在删除 `employee` 表数据之前,将被删除的员工数据插入到一个备份表 `employee_backup` 中。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_backup AS
|
||||
SELECT *
|
||||
FROM employee
|
||||
WHERE 0;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_delete;
|
||||
CREATE TRIGGER before_employee_delete
|
||||
BEFORE DELETE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO employee_backup()
|
||||
VALUES(OLD.emp_id, OLD.emp_name, OLD.salary, OLD.hire_date, OLD.dept_id, OLD.job_id);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
DELETE FROM employee
|
||||
WHERE emp_id = 20;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 5: 自动设置默认职位
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,如果未指定 `job_id`,则自动将其设置为 `job` 表中的默认职位(假设默认职位的 `job_id` 为 1)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.job_id IS NULL THEN
|
||||
SET NEW.job_id = 1;
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, NOW(), 1, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 6: 防止修改入职日期
|
||||
|
||||
创建一个触发器 `before_employee_update`,在更新 `employee` 表数据时,防止修改 `hire_date` 字段。如果尝试修改,抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_update;
|
||||
CREATE TRIGGER before_employee_update
|
||||
BEFORE UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.hire_date <> OLD.hire_date THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT='不允许修改用户的入职时间';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
UPDATE employee e
|
||||
SET e.hire_date = '2025-3-20'
|
||||
WHERE e.emp_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 7: 自动计算工龄
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,自动计算员工的工龄(以年为单位),并将其存储到一个新字段 `years_of_service` 中。
|
||||
|
||||
```sql
|
||||
ALTER TABLE employee ADD years_of_service INT;
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
SET NEW.years_of_service = TIMESTAMPDIFF(YEAR,NEW.hire_date,NOW());
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
SELECT TIMESTAMPDIFF(YEAR,e.hire_date,NOW())
|
||||
FROM employee e;
|
||||
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 60000.00, '2022-12-31', 1, 1, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 8: 防止删除部门
|
||||
|
||||
创建一个触发器 `before_department_delete`,在删除 `department` 表数据之前,检查该部门是否还有员工。如果有员工,阻止删除并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_department_delete;
|
||||
CREATE TRIGGER before_department_delete
|
||||
BEFORE DELETE ON department
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM employee e WHERE e.dept_id = OLD.dept_id) > 0 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '该部门有员工无法删除';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
|
||||
DELETE FROM department
|
||||
WHERE dept_id = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 9: 自动更新职位工资范围
|
||||
|
||||
创建一个触发器 `after_job_update`,在更新 `job` 表的 `min_salary` 或 `max_salary` 字段后,自动调整 `employee` 表中相关员工的工资,使其符合新的工资范围。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_job_update;
|
||||
CREATE TRIGGER after_job_update
|
||||
AFTER UPDATE ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE employee
|
||||
SET salary = IF(salary > NEW.max_salary, NEW.max_salary, IF(salary < NEW.min_salary, min_salary, salary))
|
||||
WHERE job_id = NEW.job_id;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 10: 记录部门变更
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `dept_id` 字段后,将变更记录插入到一个新的日志表 `department_change_log` 中,记录员工 ID、旧部门 ID、新部门 ID 和变更时间。
|
||||
|
||||
```sql
|
||||
CREATE TABLE department_change_log(
|
||||
emp_id INT,
|
||||
old_dept_id INT,
|
||||
new_dept_id INT,
|
||||
update_date DATE
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
AFTER UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.dept_id <> OLD.dept_id THEN
|
||||
INSERT INTO department_change_log()
|
||||
VALUES(NEW.emp_id, OLD.dept_id, NEW.dept_id, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 11: 防止插入重复职位
|
||||
|
||||
创建一个触发器 `before_job_insert`,在插入 `job` 表数据之前,检查职位名称是否已存在。如果存在,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_job_insert;
|
||||
CREATE TRIGGER before_job_insert
|
||||
BEFORE INSERT ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM job WHERE job_id = NEW.job_id) = 1 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '职位名称已存在';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 12: 自动更新员工总数
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新一个统计表 `employee_statistics` 中的员工总数。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_statistics(
|
||||
marking VARCHAR(20),
|
||||
num INT
|
||||
);
|
||||
INSERT INTO employee_statistics()
|
||||
VALUES('count', 0);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE employee_statistics
|
||||
SET num = (SELECT COUNT(*) FROM employee)
|
||||
WHERE marking = 'count';
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 13: 防止修改部门所在地
|
||||
|
||||
创建一个触发器 `before_department_update`,在更新 `department` 表数据时,防止修改 `location` 字段。如果尝试修改,抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_department_update;
|
||||
CREATE TRIGGER before_department_update
|
||||
BEFORE UPDATE ON department
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.location <> OLD.location THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '无法更新部分的位置';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 14: 自动调整工资
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,如果工资低于职位的最低工资,则自动将其调整为最低工资。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.salary < (SELECT min_salary FROM job WHERE job_id = NEW.job_id ) THEN
|
||||
SET NEW.salary = min_salary;
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 15: 记录职位变更
|
||||
|
||||
创建一个触发器 `after_employee_update`,在更新 `employee` 表的 `job_id` 字段后,将变更记录插入到一个新的日志表 `job_change_log` 中,记录员工 ID、旧职位 ID、新职位 ID 和变更时间。
|
||||
|
||||
```sql
|
||||
CREATE TABLE job_change_log(
|
||||
emp_id INT,
|
||||
old_job_id INT,
|
||||
new_job_id INT,
|
||||
update_date DATE
|
||||
);
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_update;
|
||||
CREATE TRIGGER after_employee_update
|
||||
AFTER UPDATE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.job_id <> OLD.job_id THEN
|
||||
INSERT INTO job_change_log()
|
||||
VALUES(NEW.emp_id, OLD.job_id, NEW.job_id, NOW());
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 16: 防止删除职位
|
||||
|
||||
创建一个触发器 `before_job_delete`,在删除 `job` 表数据之前,检查该职位是否还有员工。如果有员工,阻止删除并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_job_delete;
|
||||
CREATE TRIGGER before_job_delete
|
||||
BEFORE DELETE ON job
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF (SELECT COUNT(*) FROM employee WHERE job_id = OLD.job_id) > 0 THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '该职位还有员工';
|
||||
END IF;
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 17: 自动更新部门平均工资
|
||||
|
||||
创建一个触发器 `after_employee_insert`,在插入 `employee` 表数据之后,自动更新 `department` 表中的部门平均工资(假设 `department` 表新增一个字段 `avg_salary`)。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_insert;
|
||||
CREATE TRIGGER after_employee_insert
|
||||
AFTER INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE department d
|
||||
SET d.avg_salary = (SELECT AVG(e.salary) FROM employee e WHERE d.dept_id = e.dept_id)
|
||||
WHERE NEW.dept_id = d.dept_id;
|
||||
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 18: 防止插入未来入职日期
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,检查 `hire_date` 是否晚于当前日期。如果是,阻止插入并抛出错误。
|
||||
|
||||
```sql
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF NEW.hire_date < CURDATE() THEN
|
||||
SIGNAL SQLSTATE '45000'
|
||||
SET MESSAGE_TEXT = '入职日期不得晚于当前日期';
|
||||
END IF;
|
||||
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 19: 自动生成员工编号
|
||||
|
||||
创建一个触发器 `before_employee_insert`,在插入 `employee` 表数据时,自动生成一个唯一的员工编号(格式为 `EMP-年份-序号`,例如 `EMP-2023-001`),并将其存储到一个新字段 `emp_code` 中。
|
||||
|
||||
```sql
|
||||
ALTER TABLE employee ADD emp_code VARCHAR(30);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS before_employee_insert;
|
||||
CREATE TRIGGER before_employee_insert
|
||||
BEFORE INSERT ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
SET NEW.emp_code = CONCAT('EMP-',YEAR(NOW()),'-', (LAST_INSERT_ID()+1));
|
||||
END $$
|
||||
DELIMITER ;
|
||||
INSERT INTO employee
|
||||
VALUES(DEFAULT, '雷昊', 0, NOW(), 1, 1, NULL, NULL);
|
||||
```
|
||||
|
||||
|
||||
|
||||
#### 练习题 20: 记录员工离职
|
||||
|
||||
创建一个触发器 `after_employee_delete`,在删除 `employee` 表数据之后,将被删除的员工信息插入到一个离职记录表 `employee_exit_log` 中,记录员工 ID、姓名、离职时间和原因(假设原因由用户输入)。
|
||||
|
||||
```sql
|
||||
CREATE TABLE employee_exit_log(
|
||||
emp_id INT,
|
||||
emp_name VARCHAR(20),
|
||||
quit_date DATE,
|
||||
quit_reason VARCHAR(50)
|
||||
);
|
||||
|
||||
DELIMITER $$
|
||||
DROP TRIGGER IF EXISTS after_employee_delete;
|
||||
CREATE TRIGGER after_employee_delete
|
||||
AFTER DELETE ON employee
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
INSERT INTO employee_exit_log()
|
||||
VALUES(OLD.emp_id, OLD.emp_name, NOW(), NULL);
|
||||
END $$
|
||||
DELIMITER ;
|
||||
```
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
### 创建数据库
|
||||
|
||||
```sql
|
||||
CREATE DATABASE `emp`;
|
||||
|
||||
|
||||
USE emp;
|
||||
-- 建dept表
|
||||
CREATE TABLE `dept`( `deptno` INT(2) NOT NULL, `dname` VARCHAR(14), `loc` VARCHAR(13), CONSTRAINT pk_dept PRIMARY KEY(deptno) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- 键emp表
|
||||
CREATE TABLE `emp` ( `empno` int(4) NOT NULL PRIMARY KEY, `ename` VARCHAR(10), `job` VARCHAR(9), `mgr` int(4), `hiredate` DATE, `sal` float(7,2), `comm` float(7,2), `deptno` int(2), CONSTRAINT fk_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- 建salgrade表
|
||||
CREATE TABLE `salgrade` ( `grade` int, `losal` int, `hisal` int ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
-- 插入数据
|
||||
INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
|
||||
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
|
||||
INSERT INTO dept VALUES (30,'SALES','CHICAGO');
|
||||
INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');
|
||||
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
|
||||
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
|
||||
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
|
||||
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
|
||||
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
|
||||
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
|
||||
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
|
||||
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,'1987-07-13',3000,NULL,20);
|
||||
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,'1981-11-07',5000,NULL,10);
|
||||
INSERT INTO EMP VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
|
||||
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20);
|
||||
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
|
||||
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
|
||||
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
|
||||
INSERT INTO SALGRADE VALUES (1,700,1200);
|
||||
INSERT INTO SALGRADE VALUES (2,1201,1400);
|
||||
INSERT INTO SALGRADE VALUES (3,1401,2000);
|
||||
INSERT INTO SALGRADE VALUES (4,2001,3000);
|
||||
INSERT INTO SALGRADE VALUES (5,3001,9999);
|
||||
```
|
||||
|
||||
### 练习题
|
||||
|
||||
1.列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数。
|
||||
|
||||
2.列出公司各个工资等级雇员的数量、平均工资。
|
||||
|
||||
3.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称。
|
||||
|
||||
4.列出在每个部门工作的员工数量、平均工资和平均服务期限。
|
||||
|
||||
5.列出所有员工的姓名、部门名称和工资。
|
||||
|
||||
6.列出所有部门的详细信息和部门人数。
|
||||
|
||||
7.列出各种工作的最低工资及从事此工作的雇员姓名。
|
||||
|
||||
8.列出各个部门的MANAGER(经理)的最低薪金、姓名、部门名称、部门人数。
|
||||
|
||||
9.列出所有员工的年工资,所在部门名称,按年薪从低到高排序。
|
||||
|
||||
10.查出某个员工的上级主管及所在部门名称,并要求出这些主管中的薪水超过3000
|
||||
|
||||
11.求出部门名称中,带‘S’字符的部门员工的、工资合计、部门人数。
|
||||
|
||||
12.给任职日期超过30年或者在87年雇佣的雇员加薪,加薪原则:10部门增长10%,20部门增长20%, 30部门增长30%,依次类推。
|
||||
|
||||
13.列出至少有一个员工的所有部门的信息:
|
||||
|
||||
14.列出薪金比SMITH对的所有员工:
|
||||
|
||||
15.列出所有员工的姓名以及其直接上级的姓名:
|
||||
|
||||
16.列出受雇日期早于其直接上级的所有员工的编号、姓名,部门名称
|
||||
|
||||
17.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
|
||||
|
||||
18.列出所有"CLERK(职员)"的姓名以及部门名称,部门的人数
|
||||
|
||||
19.列出最低薪金大于1500的各种工作以及从事此工作的全部雇员人数
|
||||
|
||||
20.列出在部门"SALES"工作的员工的姓名,假定不知道销售部的部门编号
|
||||
|
||||
21.列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级
|
||||
|
||||
22.列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工 资。
|
||||
|
||||
23.列出薪金比“SMITH”或“ALLEN”多的所有员工的编号、姓名、部门名称、其领导姓名。
|
||||
|
||||
24.列出所有员工的编号、姓名及其直接上级的编号、姓名,显示的结果按领导年工资的降序排列。
|
||||
|
||||
25.列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数。
|
||||
|
||||
26.列出部门名称和这些部门的员工信息(数量、平均工资),同时列出那些没有员工的部门。
|
||||
|
||||
27.列出所有“CLERK”(办事员)的姓名及其部门名称,部门的人数,工资等级。
|
||||
|
||||
28.列出最低薪金大于1500的各种工作及此从事此工作的全部雇员人数及所在部门名称、位置、平均工 资。
|
||||
|
||||
29.列出在部门“SALES”(销售部)工作的员工的姓名、基本工资、雇佣日期、部门名称,假定不知道 销售部的部门编号。
|
||||
|
||||
30.列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级。
|
||||
|
||||
31.列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数。
|
||||
|
||||
32.查询dept表的结构
|
||||
|
||||
33.检索emp表,用is a 这个字符串来连接员工姓名和工种两个字段
|
||||
|
||||
34.检索emp表中有提成的员工姓名、月收入及提成。
|
||||
@@ -0,0 +1,111 @@
|
||||
```c
|
||||
/*
|
||||
这段代码实现的是经典的 汉诺塔问题 的递归解法。
|
||||
汉诺塔问题 是一个数学问题,具体描述如下:
|
||||
给定三个柱子:A、B、C;
|
||||
有若干个大小不等的圆盘(通常为n个),初始时所有圆盘都堆叠在A柱子上,从小到大按顺序叠放;
|
||||
目标是将这些圆盘从A柱子移动到C柱子上,并且每次只能移动一个圆盘,且大的圆盘不能放在小的圆盘上面。
|
||||
在这段代码中,hanoi 函数递归地解决了这个问题,参数 n 表示要移动的圆盘数,x、y、z 分别表示源柱子、辅助柱子和目标柱子。
|
||||
代码详解:
|
||||
基本思路:
|
||||
如果只有一个盘子(n == 1),直接从 x 移动到 z。
|
||||
如果有多个盘子(n > 1),可以通过以下步骤完成: 先将前 n-1 个盘子从 x 移到 y,这时 z 作为辅助柱子。
|
||||
将第 n 个盘子从 x 移动到 z。
|
||||
最后将 n-1 个盘子从 y 移到 z,这时 x 作为辅助柱子。
|
||||
函数 hanoi 的参数:
|
||||
n:表示要移动的圆盘的数量。
|
||||
x:源柱子。
|
||||
y:辅助柱子。
|
||||
z:目标柱子。
|
||||
递归过程:
|
||||
对于每个递归调用,问题规模逐渐减小,最终会到达只有一个盘子的情况(基准条件)。
|
||||
程序输出:
|
||||
A -> C
|
||||
A -> B
|
||||
C -> B
|
||||
这个输出表示了将两个圆盘从A柱子移动到C柱子所需的步骤。输出结果每一行表示一个移动的操作。
|
||||
总结:
|
||||
这段代码是解决汉诺塔问题的经典递归解法。通过分而治之的策略,把问题分解为更小的子问题来求解。
|
||||
*/
|
||||
```
|
||||
|
||||
### 函数递归打印汉诺塔移动步骤
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
n:盘片数
|
||||
x:源柱子
|
||||
y:中间柱子
|
||||
z:目标柱子
|
||||
|
||||
判断盘子个数:
|
||||
如果只有一个盘子,那么直接搬到目标柱子
|
||||
否则先将上面的n-1的盘子通过目标柱子移
|
||||
动到非目标柱子上后再将剩下的最大的盘子移动到目标柱子
|
||||
|
||||
*/
|
||||
//n的盘子从x通过y移动到z
|
||||
void hanoi(int n, char x, char y, char z){
|
||||
if(n == 1){
|
||||
printf("%c -> %c\n", x, z);
|
||||
}else{
|
||||
hanoi(n-1, x, z, y);
|
||||
printf("%c -> %c\n", x, z);
|
||||
hanoi(n-1, y, x, z);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void){
|
||||
|
||||
hanoi(3, 'A', 'B', 'C');
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 函数递归求汉诺塔移动的次数
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
/*
|
||||
n:盘片数
|
||||
x:源柱子
|
||||
y:中间柱子
|
||||
z:目标柱子
|
||||
|
||||
判断盘子个数:
|
||||
如果只有一个盘子,那么直接搬到目标柱子
|
||||
否则先将上面的n-1的盘子通过目标柱子移
|
||||
动到非目标柱子上后再将剩下的最大的盘子移动到目标柱子
|
||||
|
||||
*/
|
||||
//n的盘子从x通过y移动到z
|
||||
//int count = 0;//移动盘片的次数
|
||||
//而不是只经过B柱子的次数
|
||||
int hanoi(int n, char x, char y, char z){
|
||||
int count = 0;//局部变量 用来存储当前这次函数调用中的移动盘子的次数
|
||||
if(n == 1){
|
||||
//printf("%c -> %c\n", x, z);
|
||||
count++;
|
||||
}else{
|
||||
count += hanoi(n-1, x, z, y);
|
||||
//printf("%c -> %c\n", x, z);
|
||||
count++;
|
||||
count += hanoi(n-1, y, x, z);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
int main(void){
|
||||
|
||||
printf("%d\n", hanoi(3, 'A', 'B', 'C'));
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
Binary file not shown.
@@ -0,0 +1,183 @@
|
||||
### 试题-1
|
||||
|
||||
```c
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
编写一个 C 语言函数,函数接收一个整数数组 arr 以及数组的长度 size 作为参数,使用 bool 类型返回该数组中是否存在重复的元素。在 main 函数中,输入多个正整数(输入非数字字符表示输入结束)并调用该函数,根据返回结果输出相应的提示信息。
|
||||
示例:
|
||||
【请输入多个整数(输入非数字字符结束输入):】1 2 3 4 5 5 6 a
|
||||
数组中存在重复元素。
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅在
|
||||
Program-End之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
bool hasDuplicates(int arr[], int size) {
|
||||
/**********Program**********/
|
||||
int i, j;
|
||||
for(i=0;i<size-1;i++){
|
||||
for(j=i+1;j<size;j++){
|
||||
if(arr[i] == arr[j]){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
/********** End **********/
|
||||
}
|
||||
|
||||
int main() {
|
||||
int capacity = 10;
|
||||
int *arr = (int *)malloc(capacity * sizeof(int));
|
||||
|
||||
if (arr == NULL) {
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
int size = 0;
|
||||
int num;
|
||||
printf("【请输入多个整数(输入非数字字符结束输入):】");
|
||||
|
||||
while (scanf("%d", &num) == 1) {
|
||||
|
||||
if (size == capacity) {
|
||||
capacity *= 2;
|
||||
arr = (int *)realloc(arr, capacity * sizeof(int));
|
||||
|
||||
if (arr == NULL) {
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
arr[size++] = num;
|
||||
}
|
||||
|
||||
while (getchar() != '\n');
|
||||
|
||||
|
||||
if (hasDuplicates(arr, size)) {
|
||||
printf("数组中存在重复元素。\n");
|
||||
} else {
|
||||
printf("数组中不存在重复元素。\n");
|
||||
}
|
||||
|
||||
|
||||
free(arr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
### 试题-2
|
||||
|
||||
```c
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
现在有一位赛车手要驾驶一台电动摩托车去完成多段赛程。这台电动摩托车的电池电量存储
|
||||
上限是 100 度电哦,它有一个标称的平均电耗,也就是每行驶 100 公里,就会消耗 10度
|
||||
电。这里有个很重要的前提条件要大家牢记呀,每一段赛程的距离都是小于 600 公里的哦,
|
||||
并且每次出发的时候,电动摩托车的电池都是充满电的状态呢。还有一个关键的规则得注意
|
||||
哦,如果电动摩托车到达某个地点之后,赛车手查看发现电池内剩余的电量低于电池总电量
|
||||
的 10%(也就是 100×10% = 10 度电或者更少啦),那这个时候就必须得在这个地方给电
|
||||
动摩托车充电了呢,请帮忙计算一下,这名驾驶员在赛程中的哪几段赛程前是需要充电的。
|
||||
|
||||
示例1:
|
||||
【请输入赛程段数:】
|
||||
5
|
||||
【请输入各段赛程距离,单位公里:】
|
||||
380 200 390 400 300
|
||||
【需要在以下几段赛程前充电:】
|
||||
第 3 段赛程前
|
||||
第 5 段赛程前
|
||||
|
||||
示例2:
|
||||
【请输入赛程段数:】
|
||||
4
|
||||
【请输入各段赛程距离,单位公里:】
|
||||
190 140 110 80
|
||||
无需充电。
|
||||
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅在
|
||||
Program-End之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> // 引入stdlib.h用于动态内存分配相关操作
|
||||
|
||||
#define TANK_CAPACITY 100 // 电池总容量(单位:度)
|
||||
#define LOW_FUEL_LIMIT (0.10 * TANK_CAPACITY) // 低电量阈值(10%)
|
||||
#define AVG_CONSUMPTION_PER_100KM 10 // 平均电耗(单位:度/百公里)
|
||||
#define FUEL_CONSUMPTION_PER_KM (AVG_CONSUMPTION_PER_100KM / 100.0) // 每公里电耗(单位:度/公里)
|
||||
|
||||
int checkRefuelStops(int trips[], int count, int results[]) {
|
||||
int refuel_count = 0;
|
||||
double current_fuel = TANK_CAPACITY;
|
||||
/**********Program**********/
|
||||
for (int i = 0; i < count; i++) {
|
||||
if(current_fuel - trips[i]*FUEL_CONSUMPTION_PER_KM <= LOW_FUEL_LIMIT){
|
||||
results[refuel_count++] = i+1;
|
||||
current_fuel = TANK_CAPACITY;
|
||||
}
|
||||
current_fuel -= trips[i]*FUEL_CONSUMPTION_PER_KM;
|
||||
}
|
||||
/********** End **********/
|
||||
return refuel_count;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int num_trips;
|
||||
printf("【请输入赛程段数:】\n");
|
||||
scanf("%d", &num_trips);
|
||||
|
||||
|
||||
int *trips = (int *)malloc(num_trips * sizeof(int));
|
||||
if (trips == NULL) {
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("【请输入各段赛程距离,单位公里:】\n");
|
||||
for (int i = 0; i < num_trips; ++i) {
|
||||
scanf("%d", &trips[i]);
|
||||
}
|
||||
|
||||
|
||||
int *results = (int *)malloc(num_trips * sizeof(int));
|
||||
if (results == NULL) {
|
||||
printf("内存分配失败!\n");
|
||||
free(trips);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int refuel_count = checkRefuelStops(trips, num_trips, results);
|
||||
|
||||
if (refuel_count > 0) {
|
||||
printf("【需要在以下几段赛程前充电:】\n");
|
||||
for (int i = 0; i < refuel_count; i++) {
|
||||
printf("第 %d 段赛程前\n", results[i]);
|
||||
}
|
||||
} else {
|
||||
printf("无需充电。\n");
|
||||
}
|
||||
|
||||
free(trips);
|
||||
free(results);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
@@ -0,0 +1,262 @@
|
||||
### 试题
|
||||
|
||||
.png!compress)
|
||||
|
||||
.png!compress)
|
||||
|
||||
.png!compress)
|
||||
|
||||
### 表结构素材
|
||||
|
||||
```sql
|
||||
/*
|
||||
Navicat MySQL Data Transfer
|
||||
|
||||
Source Server : localhost_3306_1
|
||||
Source Server Type : MySQL
|
||||
Source Server Version : 50743 (5.7.43-log)
|
||||
Source Host : localhost:3306
|
||||
Source Schema : db_sports_meet
|
||||
|
||||
Target Server Type : MySQL
|
||||
Target Server Version : 50743 (5.7.43-log)
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 18/03/2025 15:24:40
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for t_athletes
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `t_athletes`;
|
||||
CREATE TABLE `t_athletes` (
|
||||
`id` int(6) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`sex` enum('男','女') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
|
||||
`birthday` date NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 10051 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of t_athletes
|
||||
-- ----------------------------
|
||||
INSERT INTO `t_athletes` VALUES (10001, '余璐', '女', '2001-03-03');
|
||||
INSERT INTO `t_athletes` VALUES (10002, '向岚', '女', '2000-12-02');
|
||||
INSERT INTO `t_athletes` VALUES (10003, '郭子韬', '男', '2001-09-17');
|
||||
INSERT INTO `t_athletes` VALUES (10004, '郝致远', '男', '2000-01-21');
|
||||
INSERT INTO `t_athletes` VALUES (10005, '史嘉伦', '男', '2000-05-03');
|
||||
INSERT INTO `t_athletes` VALUES (10006, '高致远', '男', '2002-09-17');
|
||||
INSERT INTO `t_athletes` VALUES (10007, '史岚', '女', '2001-01-12');
|
||||
INSERT INTO `t_athletes` VALUES (10008, '邹震南', '男', '2001-12-05');
|
||||
INSERT INTO `t_athletes` VALUES (10009, '向子异', '男', '1999-09-09');
|
||||
INSERT INTO `t_athletes` VALUES (10010, '范子异', '男', '2001-09-05');
|
||||
INSERT INTO `t_athletes` VALUES (10011, '余云熙', '男', '2002-05-26');
|
||||
INSERT INTO `t_athletes` VALUES (10012, '徐璐', '女', '2001-03-26');
|
||||
INSERT INTO `t_athletes` VALUES (10013, '方宇宁', '男', '1999-04-18');
|
||||
INSERT INTO `t_athletes` VALUES (10014, '萧詩涵', '女', '2001-04-09');
|
||||
INSERT INTO `t_athletes` VALUES (10015, '向致远', '男', '1999-02-14');
|
||||
INSERT INTO `t_athletes` VALUES (10016, '向岚', '女', '1999-07-31');
|
||||
INSERT INTO `t_athletes` VALUES (10017, '方安琪', '女', '2000-01-16');
|
||||
INSERT INTO `t_athletes` VALUES (10018, '刘晓明', '男', '2001-01-17');
|
||||
INSERT INTO `t_athletes` VALUES (10019, '顾震南', '男', '2000-07-16');
|
||||
INSERT INTO `t_athletes` VALUES (10020, '汤嘉伦', '男', '2001-12-25');
|
||||
INSERT INTO `t_athletes` VALUES (10021, '龙睿', '男', '2000-02-14');
|
||||
INSERT INTO `t_athletes` VALUES (10022, '顾睿', '男', '2001-10-25');
|
||||
INSERT INTO `t_athletes` VALUES (10023, '卢秀英', '女', '2002-02-24');
|
||||
INSERT INTO `t_athletes` VALUES (10024, '汪詩涵', '女', '2001-11-27');
|
||||
INSERT INTO `t_athletes` VALUES (10025, '丁杰宏', '男', '1999-10-05');
|
||||
INSERT INTO `t_athletes` VALUES (10026, '任安琪', '女', '1999-03-25');
|
||||
INSERT INTO `t_athletes` VALUES (10027, '沈云熙', '男', '2000-03-21');
|
||||
INSERT INTO `t_athletes` VALUES (10028, '邵詩涵', '女', '1999-04-04');
|
||||
INSERT INTO `t_athletes` VALUES (10029, '袁云熙', '男', '2000-04-08');
|
||||
INSERT INTO `t_athletes` VALUES (10030, '张睿', '男', '1999-12-16');
|
||||
INSERT INTO `t_athletes` VALUES (10031, '徐杰宏', '男', '2002-01-16');
|
||||
INSERT INTO `t_athletes` VALUES (10032, '郑云熙', '男', '2002-06-06');
|
||||
INSERT INTO `t_athletes` VALUES (10033, '梁秀英', '女', '2002-10-27');
|
||||
INSERT INTO `t_athletes` VALUES (10034, '向晓明', '男', '2002-08-21');
|
||||
INSERT INTO `t_athletes` VALUES (10035, '江詩涵', '女', '2000-12-16');
|
||||
INSERT INTO `t_athletes` VALUES (10036, '夏岚', '女', '2002-02-14');
|
||||
INSERT INTO `t_athletes` VALUES (10037, '程晓明', '男', '2001-09-07');
|
||||
INSERT INTO `t_athletes` VALUES (10038, '邱云熙', '男', '1999-02-24');
|
||||
INSERT INTO `t_athletes` VALUES (10039, '曾子韬', '男', '2002-07-07');
|
||||
INSERT INTO `t_athletes` VALUES (10040, '朱嘉伦', '男', '2000-02-10');
|
||||
INSERT INTO `t_athletes` VALUES (10041, '魏岚', '女', '2000-02-06');
|
||||
INSERT INTO `t_athletes` VALUES (10042, '袁云熙', '男', '2000-07-04');
|
||||
INSERT INTO `t_athletes` VALUES (10043, '田云熙', '男', '2002-12-18');
|
||||
INSERT INTO `t_athletes` VALUES (10044, '秦嘉伦', '男', '2001-10-29');
|
||||
INSERT INTO `t_athletes` VALUES (10045, '金秀英', '女', '2001-08-05');
|
||||
INSERT INTO `t_athletes` VALUES (10046, '高宇宁', '男', '2002-09-24');
|
||||
INSERT INTO `t_athletes` VALUES (10047, '周宇宁', '男', '2001-10-10');
|
||||
INSERT INTO `t_athletes` VALUES (10048, '王璐', '女', '2000-09-07');
|
||||
INSERT INTO `t_athletes` VALUES (10049, '徐致远', '男', '1999-06-09');
|
||||
INSERT INTO `t_athletes` VALUES (10050, '何云熙', '男', '2001-02-06');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for t_match
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `t_match`;
|
||||
CREATE TABLE `t_match` (
|
||||
`id` int(6) NOT NULL AUTO_INCREMENT,
|
||||
`sid` int(6) NULL DEFAULT NULL,
|
||||
`aid` int(6) NULL DEFAULT NULL,
|
||||
`grade` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 10101 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of t_match
|
||||
-- ----------------------------
|
||||
INSERT INTO `t_match` VALUES (10001, 10008, 10014, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10002, 10003, 10004, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10003, 10005, 10042, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10004, 10006, 10037, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10005, 10003, 10040, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10006, 10006, 10047, '第十名');
|
||||
INSERT INTO `t_match` VALUES (10007, 10001, 10002, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10008, 10006, 10005, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10009, 10008, 10033, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10010, 10002, 10026, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10011, 10006, 10043, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10012, 10008, 10016, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10013, 10007, 10017, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10014, 10002, 10001, '第十一名');
|
||||
INSERT INTO `t_match` VALUES (10015, 10004, 10006, '第十二名');
|
||||
INSERT INTO `t_match` VALUES (10016, 10006, 10045, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10017, 10004, 10013, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10018, 10008, 10024, '第九名');
|
||||
INSERT INTO `t_match` VALUES (10019, 10004, 10022, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10020, 10003, 10046, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10021, 10008, 10018, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10022, 10009, 10027, '第九名');
|
||||
INSERT INTO `t_match` VALUES (10023, 10008, 10030, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10024, 10004, 10019, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10025, 10008, 10023, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10026, 10005, 10041, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10027, 10009, 10009, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10028, 10006, 10007, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10029, 10002, 10050, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10030, 10004, 10020, '第九名');
|
||||
INSERT INTO `t_match` VALUES (10031, 10001, 10039, '第十二名');
|
||||
INSERT INTO `t_match` VALUES (10032, 10008, 10028, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10033, 10001, 10034, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10034, 10003, 10015, '第九名');
|
||||
INSERT INTO `t_match` VALUES (10035, 10002, 10021, '第九名');
|
||||
INSERT INTO `t_match` VALUES (10036, 10001, 10011, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10037, 10008, 10010, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10038, 10006, 10049, '第十一名');
|
||||
INSERT INTO `t_match` VALUES (10039, 10003, 10031, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10040, 10007, 10048, '第九名');
|
||||
INSERT INTO `t_match` VALUES (10041, 10001, 10038, '第十名');
|
||||
INSERT INTO `t_match` VALUES (10042, 10003, 10036, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10043, 10009, 10012, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10044, 10007, 10003, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10045, 10006, 10044, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10046, 10005, 10025, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10047, 10009, 10035, '第十名');
|
||||
INSERT INTO `t_match` VALUES (10048, 10002, 10008, '第十二名');
|
||||
INSERT INTO `t_match` VALUES (10049, 10005, 10032, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10050, 10009, 10029, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10051, 10004, 10043, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10052, 10009, 10031, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10053, 10005, 10029, '第十名');
|
||||
INSERT INTO `t_match` VALUES (10054, 10006, 10042, '第十二名');
|
||||
INSERT INTO `t_match` VALUES (10055, 10001, 10012, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10056, 10007, 10012, '第十名');
|
||||
INSERT INTO `t_match` VALUES (10057, 10005, 10026, '第十一名');
|
||||
INSERT INTO `t_match` VALUES (10058, 10003, 10007, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10059, 10002, 10034, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10060, 10005, 10005, '第十二名');
|
||||
INSERT INTO `t_match` VALUES (10061, 10007, 10001, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10062, 10005, 10038, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10063, 10007, 10046, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10064, 10002, 10024, '第十名');
|
||||
INSERT INTO `t_match` VALUES (10065, 10007, 10049, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10066, 10005, 10030, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10067, 10004, 10023, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10068, 10007, 10044, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10069, 10001, 10050, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10070, 10002, 10006, '第七名');
|
||||
INSERT INTO `t_match` VALUES (10071, 10007, 10014, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10072, 10002, 10013, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10073, 10001, 10046, '第十一名');
|
||||
INSERT INTO `t_match` VALUES (10074, 10003, 10029, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10075, 10004, 10038, '第二名');
|
||||
INSERT INTO `t_match` VALUES (10076, 10009, 10008, '第十一名');
|
||||
INSERT INTO `t_match` VALUES (10077, 10009, 10037, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10078, 10001, 10006, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10079, 10009, 10021, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10080, 10003, 10016, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10081, 10004, 10025, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10082, 10001, 10021, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10083, 10003, 10028, '第十名');
|
||||
INSERT INTO `t_match` VALUES (10084, 10002, 10003, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10085, 10002, 10039, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10086, 10001, 10047, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10087, 10009, 10033, '第一名');
|
||||
INSERT INTO `t_match` VALUES (10088, 10004, 10041, '第六名');
|
||||
INSERT INTO `t_match` VALUES (10089, 10006, 10013, '第九名');
|
||||
INSERT INTO `t_match` VALUES (10090, 10006, 10004, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10091, 10002, 10047, '第八名');
|
||||
INSERT INTO `t_match` VALUES (10092, 10006, 10027, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10093, 10001, 10018, '第九名');
|
||||
INSERT INTO `t_match` VALUES (10094, 10007, 10050, '第三名');
|
||||
INSERT INTO `t_match` VALUES (10095, 10005, 10020, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10096, 10004, 10007, '第十一名');
|
||||
INSERT INTO `t_match` VALUES (10097, 10004, 10031, '第十名');
|
||||
INSERT INTO `t_match` VALUES (10098, 10005, 10033, '第五名');
|
||||
INSERT INTO `t_match` VALUES (10099, 10009, 10024, '第四名');
|
||||
INSERT INTO `t_match` VALUES (10100, 10005, 10049, '第九名');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for t_sport
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `t_sport`;
|
||||
CREATE TABLE `t_sport` (
|
||||
`id` int(6) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
|
||||
`time` datetime NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 10010 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of t_sport
|
||||
-- ----------------------------
|
||||
INSERT INTO `t_sport` VALUES (10001, '100米跑步', '2023-10-17 09:30:00');
|
||||
INSERT INTO `t_sport` VALUES (10002, '200米跑步', '2023-10-18 09:30:00');
|
||||
INSERT INTO `t_sport` VALUES (10003, '800米跑步', '2023-10-17 14:30:00');
|
||||
INSERT INTO `t_sport` VALUES (10004, '3000米跑步', '2023-10-18 14:30:00');
|
||||
INSERT INTO `t_sport` VALUES (10005, '跳高', '2023-10-17 10:30:00');
|
||||
INSERT INTO `t_sport` VALUES (10006, '跳远', '2023-10-17 11:30:00');
|
||||
INSERT INTO `t_sport` VALUES (10007, '铅球', '2023-10-17 15:30:00');
|
||||
INSERT INTO `t_sport` VALUES (10008, '110米栏', '2023-10-17 16:30:00');
|
||||
INSERT INTO `t_sport` VALUES (10009, '跳绳', '2023-10-18 10:30:00');
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
```
|
||||
|
||||
### 触发器素材
|
||||
|
||||
```sql
|
||||
CREATE 【 】 assign_judge
|
||||
【 】 【 】 ON t_sport
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
【 】 【 】 t_judge (id, name, tel, sid)
|
||||
VALUES (1001, '周周', '语文', 【 】);
|
||||
END
|
||||
```
|
||||
|
||||
### 存储过程素材
|
||||
|
||||
```sql
|
||||
CREATE 【 】 `athlete_grade`(IN 【 】 INT, IN 【 】 INT, 【 】 out_grade VARCHAR(200))
|
||||
BEGIN
|
||||
SELECT m.grade 【 】 out_grade
|
||||
FROM t_match m
|
||||
WHERE m.aid = 【 】 AND m.sid = 【 】;
|
||||
END
|
||||
```
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
编写一个 C 语言函数,函数接收一个整数数组 arr 以及数组的长度 size 作为参数,使用 bool 类型返回该数组中是否存在重复的元素。在 main 函数中,输入多个正整数(输入非数字字符表示输入结束)并调用该函数,根据返回结果输出相应的提示信息。
|
||||
示例:
|
||||
【请输入多个整数(输入非数字字符结束输入):】1 2 3 4 5 5 6 a
|
||||
数组中存在重复元素。
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅在
|
||||
Program-End之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
bool hasDuplicates(int arr[], int size) {
|
||||
/**********Program**********/
|
||||
int i, j;
|
||||
for(i=0;i<size-1;i++){
|
||||
for(j=i+1;j<size;j++){
|
||||
if(arr[i] == arr[j]){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
/********** End **********/
|
||||
}
|
||||
|
||||
int main() {
|
||||
int capacity = 10;
|
||||
int *arr = (int *)malloc(capacity * sizeof(int));
|
||||
|
||||
if (arr == NULL) {
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
int size = 0;
|
||||
int num;
|
||||
printf("【请输入多个整数(输入非数字字符结束输入):】");
|
||||
|
||||
while (scanf("%d", &num) == 1) {
|
||||
|
||||
if (size == capacity) {
|
||||
capacity *= 2;
|
||||
arr = (int *)realloc(arr, capacity * sizeof(int));
|
||||
|
||||
if (arr == NULL) {
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
arr[size++] = num;
|
||||
}
|
||||
|
||||
while (getchar() != '\n');
|
||||
|
||||
|
||||
if (hasDuplicates(arr, size)) {
|
||||
printf("数组中存在重复元素。\n");
|
||||
} else {
|
||||
printf("数组中不存在重复元素。\n");
|
||||
}
|
||||
|
||||
|
||||
free(arr);
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
/*----------------------------------------------------------------------
|
||||
【程序设计】
|
||||
------------------------------------------------------------------------
|
||||
现在有一位赛车手要驾驶一台电动摩托车去完成多段赛程。这台电动摩托车的电池电量存储
|
||||
上限是 100 度电哦,它有一个标称的平均电耗,也就是每行驶 100 公里,就会消耗 10度
|
||||
电。这里有个很重要的前提条件要大家牢记呀,每一段赛程的距离都是小于 600 公里的哦,
|
||||
并且每次出发的时候,电动摩托车的电池都是充满电的状态呢。还有一个关键的规则得注意
|
||||
哦,如果电动摩托车到达某个地点之后,赛车手查看发现电池内剩余的电量低于电池总电量
|
||||
的 10%(也就是 100×10% = 10 度电或者更少啦),那这个时候就必须得在这个地方给电
|
||||
动摩托车充电了呢,请帮忙计算一下,这名驾驶员在赛程中的哪几段赛程前是需要充电的。
|
||||
|
||||
示例1:
|
||||
【请输入赛程段数:】
|
||||
5
|
||||
【请输入各段赛程距离,单位公里:】
|
||||
380 200 390 400 300
|
||||
【需要在以下几段赛程前充电:】
|
||||
第 3 段赛程前
|
||||
第 5 段赛程前
|
||||
|
||||
示例2:
|
||||
【请输入赛程段数:】
|
||||
4
|
||||
【请输入各段赛程距离,单位公里:】
|
||||
190 140 110 80
|
||||
无需充电。
|
||||
|
||||
------------------------------------------------------------------------
|
||||
注意:部分源程序给出如下。请勿改动主函数 main 或其它函数中给出的内容,仅在
|
||||
Program-End之间填入若干语句。
|
||||
不要删除标志否则不得分。
|
||||
不要修改或删除Program-End之外的内容否则不得分。
|
||||
----------------------------------------------------------------------*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h> // 引入stdlib.h用于动态内存分配相关操作
|
||||
|
||||
#define TANK_CAPACITY 100 // 电池总容量(单位:度)
|
||||
#define LOW_FUEL_LIMIT (0.10 * TANK_CAPACITY) // 低电量阈值(10%)
|
||||
#define AVG_CONSUMPTION_PER_100KM 10 // 平均电耗(单位:度/百公里)
|
||||
#define FUEL_CONSUMPTION_PER_KM (AVG_CONSUMPTION_PER_100KM / 100.0) // 每公里电耗(单位:度/公里)
|
||||
|
||||
int checkRefuelStops(int trips[], int count, int results[]) {
|
||||
int refuel_count = 0;
|
||||
double current_fuel = TANK_CAPACITY;
|
||||
/**********Program**********/
|
||||
for (int i = 0; i < count; i++) {
|
||||
if(current_fuel - trips[i]*FUEL_CONSUMPTION_PER_KM <= LOW_FUEL_LIMIT){
|
||||
results[refuel_count++] = i+1;
|
||||
current_fuel = TANK_CAPACITY;
|
||||
}
|
||||
current_fuel -= trips[i]*FUEL_CONSUMPTION_PER_KM;
|
||||
}
|
||||
/********** End **********/
|
||||
return refuel_count;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int num_trips;
|
||||
printf("【请输入赛程段数:】\n");
|
||||
scanf("%d", &num_trips);
|
||||
|
||||
|
||||
int *trips = (int *)malloc(num_trips * sizeof(int));
|
||||
if (trips == NULL) {
|
||||
printf("内存分配失败!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("【请输入各段赛程距离,单位公里:】\n");
|
||||
for (int i = 0; i < num_trips; ++i) {
|
||||
scanf("%d", &trips[i]);
|
||||
}
|
||||
|
||||
|
||||
int *results = (int *)malloc(num_trips * sizeof(int));
|
||||
if (results == NULL) {
|
||||
printf("内存分配失败!\n");
|
||||
free(trips);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int refuel_count = checkRefuelStops(trips, num_trips, results);
|
||||
|
||||
if (refuel_count > 0) {
|
||||
printf("【需要在以下几段赛程前充电:】\n");
|
||||
for (int i = 0; i < refuel_count; i++) {
|
||||
printf("第 %d 段赛程前\n", results[i]);
|
||||
}
|
||||
} else {
|
||||
printf("无需充电。\n");
|
||||
}
|
||||
|
||||
free(trips);
|
||||
free(results);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+52
@@ -0,0 +1,52 @@
|
||||
辗转相除法,也称为欧几里得算法(Euclidean Algorithm),是一种用于计算两个整数的最大公约数(Greatest Common Divisor, GCD)的有效方法。
|
||||
|
||||
### 最大公约数的定义
|
||||
|
||||
首先,我需要明确什么是最大公约数。对于两个整数a和b(假设a > b),它们的最大公约数是能够同时整除a和b的最大的正整数。例如,12和18的最大公约数是6,因为6是能够整除12和18的最大的数。
|
||||
|
||||
### 辗转相除法的基本步骤
|
||||
|
||||
根据我所了解,辗转相除法的基本步骤如下:
|
||||
|
||||
1. 用较大的数除以较小的数,得到余数。
|
||||
2. 然后用较小的数除以这个余数,再得到一个新的余数。
|
||||
3. 重复这个过程,直到余数为0。此时,除数就是这两个数的最大公约数。
|
||||
|
||||
让我用一个具体的例子来试试这个方法。
|
||||
|
||||
### 示例:计算 48 和 18 的最大公约数
|
||||
|
||||
1. **第一步**:48 ÷ 18
|
||||
- 48 ÷ 18 = 2 余 12(因为 18 × 2 = 36,48 - 36 = 12)
|
||||
- 现在,用除数18除以余数12。
|
||||
2. **第二步**:18 ÷ 12
|
||||
- 18 ÷ 12 = 1 余 6(因为 12 × 1 = 12,18 - 12 = 6)
|
||||
- 现在,用除数12除以余数6。
|
||||
3. **第三步**:12 ÷ 6
|
||||
- 12 ÷ 6 = 2 余 0(因为 6 × 2 = 12,12 - 12 = 0)
|
||||
- 余数为0,过程结束。
|
||||
|
||||
最后的除数就是6,因此48和18的最大公约数是6。这与我的预期一致,因为6确实是能同时整除48和18的最大的数。
|
||||
|
||||
#### 数学原理
|
||||
|
||||
辗转相除法的有效性基于以下两个数学原理:
|
||||
|
||||
1. **除法算式的基本性质**:
|
||||
对于任何两个正整数a和b(a > b),可以表示为:
|
||||
a = b × q + r,其中q是商,r是余数,且0 ≤ r < b。
|
||||
|
||||
2. **GCD的性质**:
|
||||
GCD(a, b) = GCD(b, r)。也就是说,a和b的最大公约数等于b和r的最大公约数。
|
||||
|
||||
为什么这个性质成立?
|
||||
|
||||
- 设d = GCD(a, b),即d能整除a和b。
|
||||
- 因为a = b × q + r,所以r = a - b × q。
|
||||
- 既然d能整除a和b,那么d也能整除r(因为它是a和b的线性组合)。
|
||||
- 因此,d也是b和r的一个公约数。
|
||||
- 现在,假设存在一个更大的公约数d' > d,能整除b和r。
|
||||
- 但是a = b × q + r,所以d'也能整除a,这意味着d'也是a和b的公约数,且大于d,这与d是最大公约数矛盾。
|
||||
- 因此,GCD(a, b) = GCD(b, r)。
|
||||
|
||||
通过这个性质,我们可以将原问题逐步简化,直到余数为0。此时,GCD(b, 0) = b,因为任何数和0的最大公约数就是那个数本身。
|
||||
@@ -0,0 +1,543 @@
|
||||
## 递推与递归
|
||||
|
||||
递推和递归两个算法很重要。递推是计算机数值计算中的一个重要算法,而递归算法在可计算性理论中占有重要地位。它们都是算法设计的有力工具,对于拓展编程思路非常有用。
|
||||
|
||||
### 1.递推算法
|
||||
|
||||
递推算法的思路是通过数学推导,将复杂的运算化解为若干重复的简单运算,以充分发挥计算机长于重复处理的特点。
|
||||
|
||||
一个数列从某一项起,它的任何一项都可以用它前面的若干项来确定,这样的数列称为递推数列,表示某项与其前面的若干项的关系的算式就称为递推公式。例如,自然数
|
||||
|
||||
1,2,…,n的阶乘就可以形成如下数列。
|
||||
|
||||
1!,2!,3!,…,(n-1)!,n!
|
||||
|
||||
令fact(n)为n的阶乘,依据后项与前项的关系可写出如下递推公式。
|
||||
|
||||
```c
|
||||
fact(n)=n* fact(n-1)(通项公式)
|
||||
fact(1)=1(边界条件)
|
||||
```
|
||||
|
||||
在有了通项公式和边界条件后,采用循环结构,从边界条件出发,利用通项公式通过若干步递推过程就可以求出解来。
|
||||
|
||||
【例7.20】 狗熊到玉米地里吃玉米,第一天吃了一半又拿走一个回去喂小狗熊。第二天又去吃了剩下的一半,走时仍然带一个回去。以后每天都吃前一天剩下的一半,并拿走一个。到第十天时,地里只剩下一个玉米。求地里一共有多少玉米。
|
||||
|
||||
【分析】以第十天为依据,往回推算。显然,第九天是3个,第八天是8个。如果设上一天的数量为x1,当天剩下的数量为x2,则它们之间的关系满足如下递推公式。
|
||||
|
||||
```c
|
||||
x1=(x2+1)*2
|
||||
```
|
||||
|
||||
然后把这个x1作为新的x2(x2=x1),再往前推算。假设用day表示天数,因为第十天的数量(边界条件)已知道,所以只要计算9次,即day的初始值为9,不是10。推算一次,day减1,这可以使用while语句实现。
|
||||
|
||||
因为只求第一天的玉米数,所以直接使用一个变量求解,变量的边界条件是1,递推公式简化为x=(x+1)*2。
|
||||
|
||||
```c
|
||||
// 狗熊吃玉米参考程序
|
||||
#include <stdio.h>
|
||||
void main( )
|
||||
{
|
||||
int day=9, x=1;
|
||||
while ( day>0 )
|
||||
{
|
||||
x=(x+1)*2; // 递推
|
||||
day--; // 递推计数器
|
||||
}
|
||||
printf("玉米总数=%d\n",x);
|
||||
}
|
||||
```
|
||||
|
||||
运行结果为
|
||||
|
||||
玉米总数=1534
|
||||
|
||||
### 2.递归算法及其与递推的比较
|
||||
|
||||
以求阶乘为例。递推是从已知的初始条件出发,逐次去求所需要的阶乘值。
|
||||
|
||||
求5的阶乘值。
|
||||
|
||||
求5!的初始条件fact(1)=1,于是可推得
|
||||
|
||||
```c
|
||||
fact(2)=2* fact(1)=2*1=2
|
||||
fact(3)=3* fact(2)=3*2=6
|
||||
fact(4)=4* fact(3)=4*6=24
|
||||
fact(5)=5* fact(4)=5*24=120
|
||||
```
|
||||
|
||||
递推过程相当于从菜心“推到”外层。
|
||||
|
||||
```c
|
||||
// 递推求阶乘参考程序
|
||||
#include<stdio.h>
|
||||
void main()
|
||||
{
|
||||
int sum=1,i=0;
|
||||
for(i=2; i<=5; i++)
|
||||
sum=i*sum;
|
||||
printf("5!=%d\n",sum);
|
||||
}
|
||||
```
|
||||
|
||||
求阶乘的递归调用程序。
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
int factorial(int);
|
||||
void main( )
|
||||
{
|
||||
int n;
|
||||
printf("输入整数 n=");
|
||||
scanf("%d",&n);
|
||||
printf("%d!=%d\n",n,factorial(n));
|
||||
}
|
||||
int factorial( int x )
|
||||
{
|
||||
if ( x==0 ) return 1;
|
||||
else return ( x*factorial( x-1 ) );
|
||||
}
|
||||
```
|
||||
|
||||
输入整数 n=5
|
||||
5!=120
|
||||
|
||||
main函数调用factorial函数。其中factorial有返回值,函数递归调用时,每调用一次,其自动型变量就占据堆栈一个区域,供各自的调用使用。递归调用在堆栈中临时占据的存储区域是较多的,在实际运行时,递归调用的时间效率较差。
|
||||
|
||||
函数调用,一般是一个函数调用另外一个函数。此外,函数还可以“自己”调用“自己”,这种调用叫作函数的递归调用。递归调用有两种方式,一种是直接调用其本身,另一种是通过其他函数间接地调用。在这里只给出直接递归调用的例子。
|
||||
|
||||
如前所述,递推过程相当于从菜心“推到”外层。递归算法的出发点则并不放在初始条件上,而是放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件)。就求阶乘的例子而言,读者会认为递归算法可能是多余的,费力不讨好。但许多实际问题不可能或不容易找到显而易见的递推关系,这时递归算法就表现出了明显的优越性。它比较符合人的思维方式,逻辑性强,可将问题描述得简单扼要,使代码具有良好的可读性,易于理解。许多看来相当复杂,或难以下手的问题,如果能够使用递归算法,就会使问题变得易于处理。
|
||||
|
||||
### 3.图解递归的执行过程
|
||||
|
||||
递归算法在可计算性理论中占有重要地位,它是算法设计的有力工具,对于拓展编程思路非常有用。递归算法并不涉及高深的数学知识,只不过初学者要建立起递归概念不太容易。为了帮助初学者建立递归的概念,下面以求“3!”为例,给语句编号,以便分析程序的执行过程。图7-1用图解的方法分解执行过程。
|
||||
|
||||
```c
|
||||
int factorial( int x ) // ①
|
||||
{ // ②
|
||||
if ( x==0 ) return 1; // ③
|
||||
else return ( x*factorial( x-1 ) ); // ④
|
||||
} // ⑤
|
||||
```
|
||||
|
||||
下面结合图,说明执行factorial(3)时,语句的递归调用过程。
|
||||
|
||||
1)第1次执行factorial(3),当执行到语句④时,递归调用factorial(3-1)。
|
||||
|
||||
2)执行factorial(2),当执行到语句④时,递归调用factorial(2-1)。
|
||||
|
||||
3)执行factorial(1),满足语句③,经语句⑤结束本次调用并返回1。
|
||||
|
||||
<img src="https://yp.smallkun.cn/markdown/image-20250405183258327.png!compress" alt="image-20250405183258327" style="zoom:33%;" />
|
||||
|
||||
4)返回继续执行factorial(2)的语句④,执行return2*1,结束factorial(2)。
|
||||
|
||||
5)factorial(2)的返回值赋给factorial(3)的语句④,执行return3*2*1。
|
||||
|
||||
6)结束factorial(3)的执行,返回值为3\*2\*1=6。
|
||||
|
||||
由此可见,欲求factorial(3),先要求factorial(2);要求factorial(2),先求factorial(1)。就像剥一棵圆白菜,从外向里,一层层剥下来,到了“菜心”,遇到1的阶乘,其值为1,到达了递归的边界。然后再用factorial(2)=2*factorial(1)得到factorial(2),再用factorial(2)的值和公式factorial(3)=3*factorial(2)求得factorial(3)。这个过程是使用factorial(n)=n*factorial(n-1)这个普遍公式,从里向外倒推回去得到factorial(n)的值。
|
||||
|
||||
### 4.小结
|
||||
|
||||
现将两种算法进行小结。
|
||||
|
||||
1)递推算法的关键是用数学方法寻求一个递推公式,包括能写成函数形式的通项公式和边界条件,然后用循环结构实现。
|
||||
|
||||
2)递归算法的关键是设计递归函数。
|
||||
|
||||
3)递归函数是一个可以直接调用“自己”,或者通过别的函数间接调用“自己”的函数。
|
||||
|
||||
4)递归函数的思路是将问题分解为两个概念性部分:甲和乙,其中甲是能够处理的部分;乙是暂时还不能处理的部分,但乙与原问题相似且其规模较小。由于乙部分与原问题相似,这就形成了“你中有我,我中有你”的特殊局面。通过“一次一尺”地调用,规模也一次一次缩小,直至降到最低,达到递归的边界,问题从而得到解答。
|
||||
|
||||
5)递归是分治策略的最好应用。递归思想能更自然地反映问题,使程序易于理解和易于调试。
|
||||
|
||||
6)递归程序的缺点是要占用大量的时间和空间。
|
||||
|
||||
## 递推求解切饼问题
|
||||
|
||||
### 1.切饼问题的描述
|
||||
|
||||
王小二自夸刀工不错,有人拿来一张大煎饼,把煎饼放在砧板上,问他“饼不许离开砧板,切100刀最多能分成多少块?”
|
||||
|
||||
### 2.寻找求解问题的规律
|
||||
|
||||
解题之前要先找出规律。图7-2给出切饼的示意图,由此图寻找规律。
|
||||
|
||||

|
||||
|
||||
设q[n]表示切n刀最多能分成的块数,从图7-2可推出如下规律。
|
||||
|
||||
```c
|
||||
q[1]=1+1=2
|
||||
q[2]=1+1+2=4
|
||||
q[3]=1+1+2+3=7
|
||||
q[4]=1+1+2+3+4=11
|
||||
```
|
||||
|
||||
也就是说,如果定义q[0]=1作为边界条件,即一刀都不切,饼就是一块。由此可得:
|
||||
|
||||
```c
|
||||
q[1]= q[0]+1=2
|
||||
q[2]= q[1]+2=4
|
||||
q[3]= q[2]+3=7
|
||||
q[4]= q[3]+4=11
|
||||
```
|
||||
|
||||
在切法上是让每两条线都有交点。用归纳法可以得出
|
||||
|
||||
q[n]=q[n-1]+n
|
||||
|
||||
q[0]=1 (边界条件)
|
||||
|
||||
### 3.源程序
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
void qq(int);
|
||||
int main( )
|
||||
{
|
||||
qq(100);
|
||||
return 0;
|
||||
}
|
||||
void qq(int n )
|
||||
{
|
||||
int i=0;
|
||||
int q[101];
|
||||
q[0]=1;
|
||||
for( i=1; i<=n; ++i)
|
||||
q[i]=q[i-1]+i;
|
||||
printf("切100刀最多可分成%d块。\n",q[n]);
|
||||
}
|
||||
```
|
||||
|
||||
设计的函数qq在刀数小于100时具有一般性,qq[4]输出11块,可以验证它的正确性。
|
||||
|
||||
程序运行结果如下:
|
||||
|
||||
切100刀最多可分成5051块。
|
||||
|
||||
## 疑案求解
|
||||
|
||||
话说在某地发生了一桩疑案。公安局对涉及此案的6个嫌疑人的情况进行分析。假设用A、B、C、D、E、F表示这6个嫌疑人。
|
||||
|
||||
1)A和B至少有一个人作案。
|
||||
|
||||
2)A和D不可能是同案犯。
|
||||
|
||||
3)A、E和F这3人中,至少有2人参与作案。
|
||||
|
||||
4)B和C或者同时作案,或者均与本案无关。
|
||||
|
||||
5)C和D中有且只有1人作案。
|
||||
|
||||
6)如果D没有参与作案,则E也不能参与作案。
|
||||
|
||||
试编写一个程序,将作案人找出来。
|
||||
|
||||
### 1.解题方法分析
|
||||
|
||||
计算机强大的逻辑分析功能是由人通过程序赋给它的,即一些逻辑问题必须转换成计算机看得懂的数学表达式和一定的程序指令。计算机解题的一般思路如下:
|
||||
|
||||
1)应用计算机解题的重要一步是将人的想法表示成机器能够实现的表达式、数学公式或操作步骤。
|
||||
|
||||
2)应用计算机解题首先遇到的问题可能是“是”还是“否”,“等于”还是“不等于”,“大于”还是“小于”等。要把这些描述成关系表达式,就要使用关系运算符。因此灵活地使用关系运算符就显得十分重要。
|
||||
|
||||
3)用计算机解题很多时候都要涉及逻辑运算,因此掌握逻辑运算符和构造逻辑表达式也是十分重要的。
|
||||
|
||||
4)用计算机解题往往需要从许多种可能性中去寻找其中的一种或几种,因此,最容易想到的,也是最容易做到的就是“枚举法”。
|
||||
|
||||
5)使用枚举法会遇到大量重复计算的问题,自然要用到程序的循环结构,因此掌握循环结构的程序设计是一个非常重要的基本功。
|
||||
|
||||
6)分支是计算机思维的很重要的一个方式,需要掌握并能灵活运用。
|
||||
|
||||
7)选择合适的算法去实现。
|
||||
|
||||
为了说明编程问题,将先使用6重循环解题,然后改用位运算取代6重循环解题。
|
||||
|
||||
### 2.解题思路
|
||||
|
||||
首先将每一条分析写成逻辑表达式。把这6个条件分别用TJ1、TJ2、TJ3、TJ4、TJ5和TJ6表示,将每一条用逻辑表达式写出来。变量为A、B、C、D、E、F,变量ABCDEF整体从000000变到111111。
|
||||
|
||||
1)TJ1:A和B至少有一个人作案。这是或的关系。即
|
||||
|
||||
```c
|
||||
TJ1 =(A || B)
|
||||
```
|
||||
|
||||
2)TJ2:A和D不可能是同案犯。A&&D表示他们是同案犯,不可能是同案犯即
|
||||
|
||||
```c
|
||||
TJ2 = !(A && D)
|
||||
```
|
||||
|
||||
当然,A=0,B=0时,A&&B为0,而TJ2=1,这种多余的情况将由其他条件剔除。
|
||||
|
||||
3)TJ3:A、E和F这3人中,至少有2人参与作案。这有如下3种可能:
|
||||
|
||||
①A和E作案,写成(A&&E)。
|
||||
|
||||
②A和F作案,写成(A&&F)。
|
||||
|
||||
③E和F作案,写成(E&&F)。
|
||||
|
||||
这3种可能之间是或的关系,所以写成
|
||||
|
||||
```c
|
||||
TJ3 =(A && E) || (A && F) ||(E && F)
|
||||
```
|
||||
|
||||
三个变量A、E和F有8种组合方式,所以TJ3有8种真值。可以做出它的真值表以帮助理解。TJ3有4种情况为1,4种情况为0。
|
||||
|
||||
4)TJ4:B和C或者同时作案,或者均与本案无关。
|
||||
|
||||
①同时作案写成(B&&C)。
|
||||
|
||||
②均与本案无关写成(!B&&!C)。
|
||||
|
||||
两者为或的关系,因此有
|
||||
|
||||
```c
|
||||
TJ4 = (B && C)|| (!B && !C)
|
||||
```
|
||||
|
||||
给出TJ4的真值表以加深理解。
|
||||
|
||||

|
||||
|
||||
5)TJ5:C和D中有且只有1人作案。
|
||||
|
||||
```c
|
||||
TJ5 = (C && !D)|| (!C && D)
|
||||
```
|
||||
|
||||
6)TJ6:如果D没有参与作案,则E也不能参与作案。这种比较麻烦,先根据情况作出如表7-2所示的TJ6的真值表,对真值表进行分析,从而构造出满足需要的表达式。
|
||||
|
||||

|
||||
|
||||
D作案,将它的值填1,无论E是否作案,TJ6的值都为1,这就是前两行的情况。当D不做案时,E也不可能作案,即TJ6=1,!E=1,对应第3行。最后一行是E=1,即D不做案而E却作案了,这是不可能的,所以TJ6=0。由此可得
|
||||
|
||||
```c
|
||||
TJ6 = D ||( !E)
|
||||
```
|
||||
|
||||
将这6个条件归结成一个破案综合判断条件。
|
||||
|
||||
```c
|
||||
TJ = Tj1 && TJ2 && TJ3 && TJ4 && TJ5 && TJ6
|
||||
```
|
||||
|
||||
当TJ为1时,说明这6条的每一条都满足了,从而找出作案人。
|
||||
|
||||
根据分析,6个嫌疑人,每人有涉案和不涉案两种情况,就有26种组合。枚举就是用这64种情况逐一去试。枚举ABCDEF,就是使这6个变量的排列从000000变到11111。
|
||||
|
||||
根据是否使用6重循环,可以给出两种典型的解题方法。
|
||||
|
||||
这个程序简单,可以直接在主函数里实现。但为了演示字符串数组作为参数的使用方法,所以将解题过程编写为单独的函数,由主程序调用求解。
|
||||
|
||||
### 3.使用6重循环解题
|
||||
|
||||
```c
|
||||
// 使用移位指令实现64次枚举的程序
|
||||
#include<stdio.h>
|
||||
#include <string.h> // 字符串库函数
|
||||
void find(char(*)[9]); // 注意声明参数的格式
|
||||
int main()
|
||||
{
|
||||
char str[2][9]={"不是罪犯","是罪犯"}; // 初始化字符数组
|
||||
find(str); // 注意调用参数的表示
|
||||
return 0;
|
||||
}
|
||||
void find(char (*str)[9] // 注意定义参数的声明方式
|
||||
{
|
||||
int tj1,tj2,tj3,tj4,tj5,tj6;
|
||||
int A,B,C,D,E,F;
|
||||
int i;
|
||||
for (i=0; i<=63; i++)
|
||||
{
|
||||
A = ( i & 32) >>5;
|
||||
B = ( i & 16) >>4;
|
||||
C = ( i & 8) >>3;
|
||||
D = ( i & 4) >>2;
|
||||
E = ( i & 2) >>1;
|
||||
F = i & 1;
|
||||
tj1 = A || B;
|
||||
tj2 = !(A && D);
|
||||
tj3 = (A && E) || (A && F) || (E && F);
|
||||
tj4 = (B && C) || (!B && !C) ;
|
||||
tj5 = (C && !D) || (D && !C) ;
|
||||
tj6 = D || (!E) ;
|
||||
if (tj1 + tj2 + tj3 + tj4 + tj5 +tj6 == 6)
|
||||
{
|
||||
printf("A:%s\n",str[A]);
|
||||
printf("B:%s\n",str[B]);
|
||||
printf("C:%s\n",str[C]);
|
||||
printf("D:%s\n",str[D]);
|
||||
printf("E:%s\n",str[E]);
|
||||
printf("F:%s\n",str[F]);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
程序运行结果如下:
|
||||
|
||||
A:是罪犯
|
||||
B:是罪犯
|
||||
C:是罪犯
|
||||
D:不是罪犯
|
||||
E:不是罪犯
|
||||
F:是罪犯
|
||||
|
||||
## 汉诺塔问题
|
||||
|
||||
这个问题源于如图所示的示意图,图中有三根柱子,左边柱子上有64个由下向上逐次缩小的金盘。
|
||||
|
||||

|
||||
|
||||
相传在古代印度的Bramah庙中,有位僧人整天把三根柱子上的金盘倒来倒去,原来他是想把64个金盘从一根柱子上移到另一根柱子上去。移动过程中恪守下述规则:每次只移动一个盘,且大盘不得落在小盘上面。有人会觉得这很简单,真的动手移盘就会发现,如以每秒移动一个盘子的话,按照上述规则将64个盘子从一根柱子移至另一根柱子上,所需时间约为5800亿年。
|
||||
|
||||
另一个传说是国王要奖赏庙里的僧人,僧人提出寺庙里有三根柱子,一根柱子上有64个一个比一个小的金盘,把64个金盘从一根柱子上移到另一根柱子上。移动过程中恪守下述规则:每次只允许移动一个盘,且大盘不得落在小盘上面;但每移动一次,国王就派人在盘子上放一粒米。国王觉得他们要的很少就答应了,回去跟宰相讨论,宰相算了一下告诉国王,国王根本给不起。
|
||||
|
||||
下图是三个盘子“汉诺塔”的示意图。下面就分析一下如何移动它们。
|
||||
|
||||

|
||||
|
||||
假如在A柱上只有一个盘子,盘号为1,这时只需将该盘从A搬至C,一次完成,记为
|
||||
|
||||
```c
|
||||
move 1 from A to C
|
||||
```
|
||||
|
||||
假如在A柱上有两个盘子,1为小盘,2为大盘。
|
||||
|
||||
第①步将1号盘从A移至B,这是为了让2号盘能移动。
|
||||
|
||||
第②步将2号盘从A移至C。
|
||||
|
||||
第③步再将1号盘从B移至C。
|
||||
|
||||
这三步记为(演示):
|
||||
|
||||
move 1 from A to B;
|
||||
move 2 from A to C;
|
||||
move 3 form B to C;
|
||||
|
||||
假如在A柱上有3个盘子,从小到大分别为1号、2号和3号。
|
||||
|
||||
第①步 将1号盘和2号盘视为一个整体;先将二者作为整体从A移至B,给3号盘创造能够一次移至C的机会。这一步记为
|
||||
|
||||
```c
|
||||
move( 2, A, C, B)
|
||||
```
|
||||
|
||||
意思是将上面的两个盘子作为整体从A借助C移至B。
|
||||
|
||||
第②步 将3号盘从A移至C,一次到位。记为
|
||||
|
||||
move 3 from A to C
|
||||
|
||||
第③步 处于B上的作为一个整体的两个盘子,再移至C。这一步记为
|
||||
|
||||
```c
|
||||
move( 2, B, A, C)
|
||||
```
|
||||
|
||||
意思是将两个盘子作为整体从B借助A移至C。
|
||||
|
||||
所谓“借助”的意思,等下面这件事做完了不言自明。
|
||||
|
||||
移动3个盘子的分解图如图所示。
|
||||
|
||||

|
||||
|
||||
从题目的约束条件看,大盘上可以随便摞小盘,相反则不允许。现在讨论将1号和2号盘当整体从A移至B的过程move(2,A,C,B)。用“第(1)”代表这一行的操作,实际上可以把它分解为以下三步:
|
||||
|
||||
第(1)的第1步:move 1 form A to C
|
||||
|
||||
第(1)的第2步:move 2 form A to B
|
||||
|
||||
第(1)的第3步:move 1 form C to B
|
||||
|
||||
经过以上步骤,将1号和2号盘作为整体从A移至B,为3号盘从A移至C创造了条件。同样,3号盘一旦到了C,就要考虑如何实现将1号和2号盘当整体从B移至C的过程了。实际上move(2,B,A,C)也要分解为三步:
|
||||
|
||||
第(3)的第1步:move 1 form B to A
|
||||
|
||||
第(3)的第2步:move 2 form B to C
|
||||
|
||||
第(3)的第3步:move 1 form A to C
|
||||
|
||||
看move(2,A,C,B)是说要将两个盘子从A搬至B,但没有C是不行的,因为“第(1)的第1步”就要将1盘从A移到C,给2盘创造条件从A移至B,然后再把1盘从C移至B。看到这里就能明白“借助C”的含义了。因此,在构思搬移过程的参量时,要把3根柱子都用上。
|
||||
|
||||
定义搬移函数move(n,A,B,C),物理意义是将n个盘子从A经B搬到C。
|
||||
|
||||
move(n,A,B,C)分解为3步。
|
||||
|
||||
1)move(n-1,A,C,B)理解为将上面的n-1个盘子作为一个整体从A经C移至B。
|
||||
|
||||
2)输出n:A to C,理解为将n号盘从A移至C,是直接可解结点。
|
||||
|
||||
3)Move(n-1,B,A,C)理解为将上面的n-1个盘子作为一个整体从B经A移至C。
|
||||
|
||||
这里显然是一种递归定义,当解move(n-1,A,C,B)时又可想到,将其分解为3步:
|
||||
|
||||
1)将上面的n-2个盘子作为一个整体从A经B到C,move(n-2,A,B,C)。
|
||||
|
||||
2)第n-1号盘子从A直接移至B,即“n-1:A to B”。
|
||||
|
||||
3)再将上面的n-2个盘子作为一个整体从C经A移至B,move(n-2,C,A,B)。
|
||||
|
||||
根据以上分析,可以编写出完整的程序。
|
||||
|
||||
```c
|
||||
// 用递归求解汉诺塔问题
|
||||
#include <stdio.h> // 预编译命令
|
||||
int step=1; // 整型全局变量,预置1,步数
|
||||
void move(int, char, char, char // 声明要用到的被调用函数
|
||||
void main()
|
||||
{
|
||||
int n; // 整型变量,n为盘数,
|
||||
printf("请输入盘数 n="); // 提示信息
|
||||
scanf("%d",&n); // 输入正整数n
|
||||
printf("在3根柱子上移%d只盘的步骤为:\n",n);
|
||||
move(n,'a','b','c'); // 调用函数 move(n,'a','b','c')
|
||||
}
|
||||
void move(int m, char p, char q, char r)
|
||||
{ // 自定义函数体开始
|
||||
if (m==1) // 如果m为1,则为直接可解结点,
|
||||
{
|
||||
// 直接可解结点,输出移盘信息
|
||||
printf("[%d] move 1# from %c to %c\n", step,p,r);
|
||||
step++; // 步数加1
|
||||
}
|
||||
else // 如果不为1,则要调用move(m-1)
|
||||
{
|
||||
move(m-1,p,r,q); // 递归调用move(m-1)
|
||||
// 直接可解结点,输出移盘信息
|
||||
printf("[%d] move %d# from %c to %c\n", step, m, p, r);
|
||||
step++; // 步数加1
|
||||
move(m-1,q,p,r); // 递归调用move(m-1)
|
||||
}
|
||||
} // 自定义函数体结束
|
||||
```
|
||||
|
||||
下面分别演示1、2和3个盘子的移动步骤。
|
||||
|
||||
```ini
|
||||
请输入盘数 n=1在3根柱子上移1只盘的步骤为:
|
||||
[1] move 1# from a to c
|
||||
请输入盘数 n=2在3根柱子上移2只盘的步骤为:
|
||||
[1] move 1# from a to b
|
||||
[2] move 2# from a to c
|
||||
[3] move 1# from b to c
|
||||
请输入盘数 n=3在3根柱子上移3只盘的步骤为:
|
||||
[1] move 1# from a to c
|
||||
[2] move 2# from a to b
|
||||
[3] move 1# from c to b
|
||||
[4] move 3# from a to c
|
||||
[5] move 1# from b to a
|
||||
[6] move 2# from b to c
|
||||
[7] move 1# from a to c
|
||||
```
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
### 高精度加法
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(){
|
||||
char str1[200], str2[200], result[201] = {0};
|
||||
int i, j, k = 0, t = 0;
|
||||
|
||||
scanf("%s %s", str1, str2);
|
||||
i=strlen(str1)-1;
|
||||
j=strlen(str2)-1;
|
||||
while(i >= 0 || j >= 0){
|
||||
if(i >= 0) t+=str1[i--]-48;
|
||||
if(j >= 0) t+=str2[j--]-48;
|
||||
result[k++] = t%10+48;
|
||||
t /= 10;
|
||||
}
|
||||
if(t != 0){
|
||||
result[k++] = t+48;
|
||||
}
|
||||
|
||||
for(i=k-1;i>=0;i--){
|
||||
putchar(result[i]);
|
||||
}
|
||||
puts("");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 高精度乘法
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
int main(){
|
||||
char str1[200], str2[200], result[400]={0};
|
||||
int i, j, k, t = 0;
|
||||
|
||||
scanf("%s %s", str1, str2);
|
||||
|
||||
j=strlen(str2)-1;//下面的数的从个位开始的每一位的下标
|
||||
while(j>=0){
|
||||
i=strlen(str1)-1;//上面的数的每一位的下标
|
||||
k=0;//上面数字的 0:个位 1:十位
|
||||
t=strlen(str2)-j-1;//下面数字乘法的偏移量
|
||||
while(i>=0){
|
||||
result[k+t] += (str1[i]-48)*(str2[j]-48);
|
||||
result[k+t+1] += result[k+t]/10;
|
||||
result[k+t] %=10;
|
||||
k++;
|
||||
i--;
|
||||
}
|
||||
j--;
|
||||
}
|
||||
k+=strlen(str2);
|
||||
while(result[k] == 0) k--;
|
||||
|
||||
while(k>=0){
|
||||
putchar(result[k--]+48);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user