Compare commits

..
161 Commits
Author SHA1 Message Date
smallkun c9dd5c8c83 Auto commit 2026-03-16 22:36:32 +08:00
smallkun e7aae27f87 Auto commit 2026-03-12 10:56:48 +08:00
smallkun c097a27e34 Auto commit 2025-05-08 17:47:28 +08:00
smallkun e6afc51134 Auto commit 2025-04-21 19:41:17 +08:00
smallkun db0782e5fc Auto commit 2025-04-06 18:37:03 +08:00
smallkun d7e3a5c9d9 Auto commit 2025-04-06 01:18:11 +08:00
smallkun 3d52dadba1 Auto commit 2025-04-06 01:17:50 +08:00
smallkun 3fbfc647b8 Auto commit 2025-04-06 01:15:20 +08:00
smallkun 2c43525475 Auto commit 2025-04-06 01:15:03 +08:00
smallkun 3f9704f1a4 Auto commit 2025-04-06 01:13:51 +08:00
smallkun f725ee8c97 Auto commit 2025-04-05 19:25:52 +08:00
smallkun 2c3e944e03 Auto commit 2025-04-05 19:14:42 +08:00
smallkun 1918e1e1e7 Auto commit 2025-04-05 18:10:11 +08:00
smallkun c96d28c005 Auto commit 2025-04-05 18:09:56 +08:00
smallkun 0ab49e8346 Auto commit 2025-04-03 11:55:09 +08:00
smallkun 1725b35ac9 Auto commit 2025-04-03 11:03:28 +08:00
smallkun 1a1a6c0409 Auto commit 2025-04-03 10:46:38 +08:00
smallkun 39672f95cb Auto commit 2025-04-03 10:23:32 +08:00
smallkun 712b37490c Auto commit 2025-04-03 10:19:55 +08:00
smallkun 449f17509e Auto commit 2025-04-02 19:51:05 +08:00
smallkun cd169b4904 Auto commit 2025-04-02 19:35:26 +08:00
smallkun d31fe4ec44 Auto commit 2025-04-02 19:34:45 +08:00
smallkun dc74003746 Auto commit 2025-04-02 00:23:03 +08:00
smallkun e8fd54dc02 Auto commit 2025-04-01 23:54:12 +08:00
smallkun c573ab7540 Auto commit 2025-04-01 20:11:46 +08:00
smallkun 53b34d917f Auto commit 2025-04-01 18:56:19 +08:00
smallkun 4079ff9b07 Auto commit 2025-04-01 17:02:00 +08:00
smallkun fc813427c5 Auto commit 2025-04-01 16:54:59 +08:00
smallkun 255a4afc97 Auto commit 2025-04-01 16:49:40 +08:00
smallkun dc8392a55c Auto commit 2025-04-01 16:39:57 +08:00
smallkun b5cc50f90d Auto commit 2025-04-01 16:38:21 +08:00
smallkun da63a1d634 Auto commit 2025-04-01 16:36:23 +08:00
smallkun fc66b14900 Auto commit 2025-04-01 16:27:10 +08:00
smallkun 49499ddb60 Auto commit 2025-04-01 16:23:28 +08:00
smallkun 0fca9c9a65 Auto commit 2025-04-01 16:16:54 +08:00
smallkun ad6ebb9fa2 Auto commit 2025-04-01 16:09:36 +08:00
smallkun e229bbbb5d Auto commit 2025-04-01 09:52:18 +08:00
smallkun dae819bf03 Auto commit 2025-03-31 20:03:24 +08:00
smallkun 984e4b5848 Auto commit 2025-03-31 19:37:23 +08:00
smallkun 2c6fa871fd Auto commit 2025-03-31 18:23:49 +08:00
smallkun 4afd009240 Auto commit 2025-03-31 18:13:34 +08:00
smallkun 7c1ff398ef Auto commit 2025-03-31 18:07:50 +08:00
smallkun b555d546f3 Auto commit 2025-03-31 13:06:12 +08:00
smallkun 7a89b6c6bd Auto commit 2025-03-30 22:00:18 +08:00
smallkun ca908905f0 Auto commit 2025-03-30 21:57:13 +08:00
smallkun e98ec49be5 Auto commit 2025-03-30 21:36:26 +08:00
smallkun 562f6156ce Auto commit 2025-03-30 19:25:28 +08:00
smallkun 12172b99ca Auto commit 2025-03-30 19:23:53 +08:00
smallkun 0f66c6b6d8 Auto commit 2025-03-30 14:20:49 +08:00
smallkun 631b95b9a1 Auto commit 2025-03-30 14:16:08 +08:00
smallkun dba08dadf4 Auto commit 2025-03-30 14:15:36 +08:00
smallkun ee5bf925ef Auto commit 2025-03-30 14:15:19 +08:00
smallkun 36a2f799e1 Auto commit 2025-03-30 14:13:39 +08:00
smallkun 9050c876b1 Auto commit 2025-03-30 14:11:55 +08:00
smallkun 1101eebe94 Auto commit 2025-03-28 10:38:36 +08:00
smallkun 3fd783abc5 Auto commit 2025-03-28 10:35:45 +08:00
smallkun 67e45ace21 Auto commit 2025-03-28 09:57:33 +08:00
smallkun 05299e024a Auto commit 2025-03-28 09:57:22 +08:00
smallkun c0663bc99c Auto commit 2025-03-28 09:12:20 +08:00
smallkun 4732388b07 Auto commit 2025-03-28 09:07:47 +08:00
smallkun 2a43e05b5f Auto commit 2025-03-28 08:36:03 +08:00
smallkun 5f169e30ac Auto commit 2025-03-28 08:32:24 +08:00
smallkun c4547a80fc Auto commit 2025-03-28 08:15:20 +08:00
smallkun d06b6fc13d Auto commit 2025-03-28 08:06:46 +08:00
smallkun 195f784173 Auto commit 2025-03-27 18:25:58 +08:00
smallkun abfd593f38 Auto commit 2025-03-27 16:05:58 +08:00
smallkun 542dd24e8d Merge branch 'main' of git.smallkun.cn:smallkun/class-notes 2025-03-27 08:00:02 +08:00
smallkun 9aa26a9fbe Auto commit 2025-03-27 07:54:53 +08:00
smallkun cc59f1a38b Auto commit 2025-03-26 09:18:31 +08:00
smallkun 947c7e78d2 Auto commit 2025-03-26 09:17:09 +08:00
smallkun 0ed3a59e2c Auto commit 2025-03-26 09:14:45 +08:00
smallkun 932fcc500c Auto commit 2025-03-26 09:07:14 +08:00
smallkun be5497370f Auto commit 2025-03-26 08:50:26 +08:00
smallkun ba7a5971be Auto commit 2025-03-26 08:47:15 +08:00
smallkun eaa1811ce7 Auto commit 2025-03-25 19:00:16 +08:00
smallkun 0699f7825b Auto commit 2025-03-25 09:44:29 +08:00
smallkun 537578994c Auto commit 2025-03-25 09:38:23 +08:00
smallkun 57e8628eec Auto commit 2025-03-25 08:35:44 +08:00
smallkun 6b086283b9 Auto commit 2025-03-25 08:31:24 +08:00
smallkun eb6a1ba10c Auto commit 2025-03-25 08:26:45 +08:00
smallkun 85aedd7dcf Auto commit 2025-03-24 20:07:56 +08:00
smallkun 4ebb1c8c83 Auto commit 2025-03-24 19:59:35 +08:00
smallkun 9a03816526 Auto commit 2025-03-24 19:51:23 +08:00
smallkun 1455f339be Auto commit 2025-03-24 19:46:42 +08:00
smallkun 21eab878bf Auto commit 2025-03-24 19:32:31 +08:00
smallkun 777fefdcef Auto commit 2025-03-24 18:55:09 +08:00
smallkun f9f35929ed Auto commit 2025-03-24 17:55:46 +08:00
smallkun 03e8200eb7 Auto commit 2025-03-24 07:50:54 +08:00
smallkun 7826824d2f Auto commit 2025-03-23 17:31:54 +08:00
smallkun 3f10d8ce73 Auto commit 2025-03-23 17:14:21 +08:00
smallkun ce7fcd525a Auto commit 2025-03-23 17:12:25 +08:00
smallkun b42341556b Auto commit 2025-03-23 17:09:40 +08:00
smallkun 04dfcd275e Auto commit 2025-03-23 00:58:09 +08:00
smallkun 8333736ef2 Auto commit 2025-03-22 22:31:45 +08:00
smallkun 2fd8dd0574 Auto commit 2025-03-22 22:30:16 +08:00
smallkun 1697d05c41 Auto commit 2025-03-22 22:29:36 +08:00
smallkun ef57fdc6da Auto commit 2025-03-22 20:08:03 +08:00
smallkun fb7ce8d575 Auto commit 2025-03-22 20:01:54 +08:00
smallkun 72d7281a50 Auto commit 2025-03-22 19:59:05 +08:00
smallkun 2e57bf8a24 Auto commit 2025-03-22 19:55:39 +08:00
smallkun 8da3011a4f Auto commit 2025-03-22 19:50:42 +08:00
smallkun f6f91c0fd4 Auto commit 2025-03-22 19:49:55 +08:00
smallkun 92bbbfb089 Auto commit 2025-03-22 19:15:32 +08:00
smallkun 281083bf85 Auto commit 2025-03-21 10:34:07 +08:00
smallkun 448f49d644 Auto commit 2025-03-21 09:38:42 +08:00
smallkun 727db1bb4a Auto commit 2025-03-21 09:35:23 +08:00
smallkun fbb09280fd Auto commit 2025-03-21 09:34:54 +08:00
smallkun b030ae136a Auto commit 2025-03-21 09:29:19 +08:00
smallkun a3837c3a77 Auto commit 2025-03-21 09:18:10 +08:00
smallkun ce0f22d5f5 Auto commit 2025-03-21 09:16:48 +08:00
smallkun 37fccb1898 Auto commit 2025-03-21 08:55:39 +08:00
smallkun 5072cd79b1 Auto commit 2025-03-21 08:51:50 +08:00
smallkun 2cafec9ae9 Auto commit 2025-03-21 08:48:40 +08:00
smallkun 983e28df10 Auto commit 2025-03-21 08:45:56 +08:00
smallkun 37f68f467b Auto commit 2025-03-21 08:25:06 +08:00
smallkun 68e4508eaf Auto commit 2025-03-20 20:00:14 +08:00
smallkun 6aa71ed621 Auto commit 2025-03-20 19:47:42 +08:00
smallkun 02788e2bb2 Auto commit 2025-03-20 19:41:17 +08:00
smallkun 95aa201cf4 Auto commit 2025-03-20 19:37:29 +08:00
smallkun 26b0159c32 Auto commit 2025-03-20 19:29:28 +08:00
smallkun 6733da3ec5 Auto commit 2025-03-20 19:11:16 +08:00
smallkun 1b42d49ba9 Auto commit 2025-03-20 18:57:01 +08:00
smallkun 4cf78065f1 Auto commit 2025-03-20 16:55:24 +08:00
smallkun da1fcd8e75 Auto commit 2025-03-20 16:54:53 +08:00
smallkun 8fa209f213 Auto commit 2025-03-20 16:47:57 +08:00
smallkun 5d16a365de Auto commit 2025-03-20 16:47:18 +08:00
smallkun 077f0330f5 Auto commit 2025-03-20 16:46:44 +08:00
smallkun 43b718db0c Auto commit 2025-03-20 16:45:59 +08:00
smallkun a192d96e71 Auto commit 2025-03-20 16:45:10 +08:00
smallkun 7e85346487 Auto commit 2025-03-20 16:42:33 +08:00
smallkun a19a2490e0 Auto commit 2025-03-20 16:36:24 +08:00
smallkun bf07420a5e Auto commit 2025-03-20 16:33:58 +08:00
smallkun d9e06991e9 Auto commit 2025-03-20 16:31:34 +08:00
smallkun 49853d7338 Auto commit 2025-03-20 14:54:00 +08:00
smallkun 2be46d87e0 Auto commit 2025-03-20 14:53:26 +08:00
smallkun 297f2784fb 2025-03-20 2025-03-20 11:23:46 +08:00
smallkun 2f7f806aab 2025-03-20 2025-03-20 11:21:09 +08:00
smallkun 72b6014ddf 2025-03-20 2025-03-20 11:01:11 +08:00
smallkun caa10b19b2 2025-03-20 2025-03-20 10:47:49 +08:00
smallkun cbf371e29d 2025-03-20 2025-03-20 10:45:11 +08:00
smallkun 5e39adead8 2025-03-20 2025-03-20 10:33:39 +08:00
smallkun 6b6d78b340 2025-03-20 2025-03-20 10:29:51 +08:00
smallkun 525c0edd1d Auto commit 2025-03-19 19:15:27 +08:00
smallkun 53224e1642 Auto commit 2025-03-19 08:00:31 +08:00
smallkun 72ad4426fe Auto commit 2025-03-19 07:59:01 +08:00
smallkun df4fea3437 Auto commit 2025-03-18 19:41:55 +08:00
smallkun 8b030d5a28 Auto commit 2025-03-18 19:12:14 +08:00
smallkun 721a9d8fb7 Auto commit 2025-03-18 18:51:27 +08:00
smallkun f93fce1ea6 Auto commit 2025-03-18 18:23:20 +08:00
smallkun 4b5e81f1b3 Auto commit 2025-03-18 17:19:54 +08:00
smallkun 55230c94e4 Auto commit 2025-03-18 09:48:39 +08:00
smallkun a580bebc74 Auto commit 2025-03-18 09:23:10 +08:00
smallkun 31af716c23 Auto commit 2025-03-18 09:18:30 +08:00
smallkun 09d0f90697 Auto commit 2025-03-18 08:52:39 +08:00
smallkun adb07f27c5 Auto commit 2025-03-18 08:37:39 +08:00
smallkun 152541650a Auto commit 2025-03-18 08:30:48 +08:00
smallkun 777ac955d0 Auto commit 2025-03-17 19:57:04 +08:00
smallkun d76940406d Auto commit 2025-03-17 19:47:22 +08:00
smallkun 86d4341146 Auto commit 2025-03-17 19:31:35 +08:00
smallkun d2970d183d Auto commit 2025-03-17 18:51:31 +08:00
smallkun cfdebb17f7 Auto commit 2025-03-17 18:50:51 +08:00
102 changed files with 17755 additions and 993 deletions
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;
}
+9
View File
@@ -0,0 +1,9 @@
#include <stdio.h>
int main(){
return 0;
}
+9
View File
@@ -0,0 +1,9 @@
#include <stdio.h>
int main(){
return 0;
}
@@ -0,0 +1 @@
ccadfadsfasfadsfafa
+1
View File
@@ -0,0 +1 @@
ADFADFAAAFDAFDSFSDF
+353
View File
@@ -667,12 +667,73 @@ int main(){
![image-20250227231147113](https://yp.smallkun.cn/markdown/image-20250227231147113.png!compress) ![image-20250227231147113](https://yp.smallkun.cn/markdown/image-20250227231147113.png!compress)
```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 ### 函数-3
![image-20250227231154429](https://yp.smallkun.cn/markdown/image-20250227231154429.png!compress) ![image-20250227231154429](https://yp.smallkun.cn/markdown/image-20250227231154429.png!compress)
```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(){
![image-20250227231209008](https://yp.smallkun.cn/markdown/image-20250227231209008.png!compress) ![image-20250227231209008](https://yp.smallkun.cn/markdown/image-20250227231209008.png!compress)
```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 ### 指针-2
![image-20250227231216409](https://yp.smallkun.cn/markdown/image-20250227231216409.png!compress) ![image-20250227231216409](https://yp.smallkun.cn/markdown/image-20250227231216409.png!compress)
```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 ### 指针-3
![image-20250227231232971](https://yp.smallkun.cn/markdown/image-20250227231232971.png!compress) ![image-20250227231232971](https://yp.smallkun.cn/markdown/image-20250227231232971.png!compress)
```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 ### 指针-4
![image-20250227231243197](https://yp.smallkun.cn/markdown/image-20250227231243197.png!compress) ![image-20250227231243197](https://yp.smallkun.cn/markdown/image-20250227231243197.png!compress)
```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(){
![image-20250227231302316](https://yp.smallkun.cn/markdown/image-20250227231302316.png!compress) ![image-20250227231302316](https://yp.smallkun.cn/markdown/image-20250227231302316.png!compress)
```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 ### 预处理-2
![image-20250227231314793](https://yp.smallkun.cn/markdown/image-20250227231314793.png!compress) ![image-20250227231314793](https://yp.smallkun.cn/markdown/image-20250227231314793.png!compress)
```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 ### 预处理-3
![image-20250227231325297](https://yp.smallkun.cn/markdown/image-20250227231325297.png!compress) ![image-20250227231325297](https://yp.smallkun.cn/markdown/image-20250227231325297.png!compress)
```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 ### 结构体-1
![image-20250227231339018](https://yp.smallkun.cn/markdown/image-20250227231339018.png!compress) ![image-20250227231339018](https://yp.smallkun.cn/markdown/image-20250227231339018.png!compress)
```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 ### 结构体-2
![image-20250227231421233](https://yp.smallkun.cn/markdown/image-20250227231421233.png!compress) ![image-20250227231421233](https://yp.smallkun.cn/markdown/image-20250227231421233.png!compress)
```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 ### 结构体-3
![image-20250227231434183](https://yp.smallkun.cn/markdown/image-20250227231434183.png!compress) ![image-20250227231434183](https://yp.smallkun.cn/markdown/image-20250227231434183.png!compress)
```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 ### 文件-2
![image-20250227231509693](https://yp.smallkun.cn/markdown/image-20250227231509693.png!compress) ![image-20250227231509693](https://yp.smallkun.cn/markdown/image-20250227231509693.png!compress)
```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 ### 文件-3
![image-20250227231516025](https://yp.smallkun.cn/markdown/image-20250227231516025.png!compress) ![image-20250227231516025](https://yp.smallkun.cn/markdown/image-20250227231516025.png!compress)
```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
![image-20250315225441802](https://yp.smallkun.cn/markdown/image-20250315225441802.png!compress) ![image-20250315225441802](https://yp.smallkun.cn/markdown/image-20250315225441802.png!compress)
```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
![image-20250315225818026](https://yp.smallkun.cn/markdown/image-20250315225818026.png!compress) ![image-20250315225818026](https://yp.smallkun.cn/markdown/image-20250315225818026.png!compress)
```sql ```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, '重庆市南岸区');
``` ```
![image-20250315225829272](https://yp.smallkun.cn/markdown/image-20250315225829272.png!compress) ![image-20250315225829272](https://yp.smallkun.cn/markdown/image-20250315225829272.png!compress)
```sql ```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
![image-20250315230015174](https://yp.smallkun.cn/markdown/image-20250315230015174.png!compress) ![image-20250315230015174](https://yp.smallkun.cn/markdown/image-20250315230015174.png!compress)
```sql ```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', '事假');
``` ```
![image-20250315230025538](https://yp.smallkun.cn/markdown/image-20250315230025538.png!compress) ![image-20250315230025538](https://yp.smallkun.cn/markdown/image-20250315230025538.png!compress)
```sql ```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
![image-20250315230057816](https://yp.smallkun.cn/markdown/image-20250315230057816.png!compress) ![image-20250315230057816](https://yp.smallkun.cn/markdown/image-20250315230057816.png!compress)
```sql ```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
![image-20250315230128412](https://yp.smallkun.cn/markdown/image-20250315230128412.png!compress) ![image-20250315230128412](https://yp.smallkun.cn/markdown/image-20250315230128412.png!compress)
```sql ```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
![image-20250315230227129](https://yp.smallkun.cn/markdown/image-20250315230227129.png!compress) ![image-20250315230227129](https://yp.smallkun.cn/markdown/image-20250315230227129.png!compress)
```sql ```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
View File
@@ -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
View File
@@ -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);
```
+2
View File
@@ -0,0 +1,2 @@
单招落榜 都怪资本!!!
三年的青春给你了!!!
+200
View File
@@ -0,0 +1,200 @@
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
单招落榜 都怪资本!!!
三年的青春给你了!!!
+1
View File
@@ -0,0 +1 @@
Hello
+31
View File
@@ -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;
}
+23
View File
@@ -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
View File
@@ -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 ;
```
+2
View File
@@ -75,6 +75,8 @@ int main() {
最终结果: “12ABC34567890” 最终结果: “12ABC34567890”
### 4. 字符串查找 ### 4. 字符串查找
字符串查找: “123456123abc123hbc” 字符串查找: “123456123abc123hbc”
+28
View File
@@ -1,6 +1,33 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
<<<<<<< HEAD
int main(){
char str[100];
char subStr[100];
int i, j, index;
gets(str);
gets(subStr);
scanf("%d", &index);
i=strlen(subStr) + strlen(str);//主串+子串=两个合并后的结束符位置
str[i] = '\0';
i--;//13->i-3 -> i
for(j=strlen(str)-1;j>=index;j--){
str[i--] = str[j];
}
// for(i=0;i<strlen(subStr);i++){
// str[index+i] =subStr[i];
// }
puts(str);
return 0;
}
=======
int main() { int main() {
char str1[200], str2[100]; char str1[200], str2[100];
int i, j, index; int i, j, index;
@@ -39,3 +66,4 @@ int main() {
return 0; return 0;
} }
>>>>>>> 1843d42e7e825deacd49772a204a39bc2f132820
@@ -1,6 +1,6 @@
### 练习一 ### 练习一
**1** ![image-20250315225248590](https://yp.smallkun.cn/markdown/image-20250315225248590.png!compress)
```sql ```sql
#(1) #(1)
@@ -30,7 +30,7 @@ ALTER TABLE customers RENAME TO customers_info;
ALTER TABLE customers_info DROP c_city; ALTER TABLE customers_info DROP c_city;
``` ```
**2** ![image-20250315225304324](https://yp.smallkun.cn/markdown/image-20250315225304324.png!compress)
```sql ```sql
#(1) #(1)
@@ -51,6 +51,10 @@ DROP TABLE orders;
### 练习二 ### 练习二
![image-20250315225318753](https://yp.smallkun.cn/markdown/image-20250315225318753.png!compress)
![image-20250315225328264](https://yp.smallkun.cn/markdown/image-20250315225328264.png!compress)
```sql ```sql
#(1) #(1)
CREATE TABLE pet( CREATE TABLE pet(
@@ -84,8 +88,14 @@ WHERE death IS NOT NULL;
TRUNCATE pet; TRUNCATE pet;
``` ```
---
### 练习三 ### 练习三
![image-20250315225417117](https://yp.smallkun.cn/markdown/image-20250315225417117.png!compress)
![image-20250315225431297](https://yp.smallkun.cn/markdown/image-20250315225431297.png!compress)
```sql ```sql
#1. #1.
CREATE DATABASE test_compay DEFAULT CHARACTER SET utf8; 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) ALTER TABLE salary ADD CONSTRAINT fk_sal_eid FOREIGN KEY(empid)
REFERENCES employee(empid) ON UPDATE CASCADE ON DELETE CASCADE; REFERENCES employee(empid) ON UPDATE CASCADE ON DELETE CASCADE;
#4 #4
INSERT INTO department() INSERT INTO department (depid, depname, deinfo)
VALUES VALUES
(111, '生产部', NULL), (111, '生产部', NULL),
(222, '销售部', 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 VALUES
(1001, '张三', '', '高级工程师', '1975-1-1', 111), (1001, '张三', '', '高级工程师', '1975-1-1', 111),
(1002, '李四', '', '助工', '1985-1-1', 111), (1002, '李四', '', '助工', '1985-1-1', 111),
(1003, '王五', '', '工程师', '1978-11-11', 222), (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 VALUES
(1001, 2200, 1100, 200), (1001, 2200, 1100, 200),
(1002, 1200, 200, NULL), (1002, 1200, 200, NULL),
(1003, 2900, 700, 200), (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);
```
![image-20250315225441802](https://yp.smallkun.cn/markdown/image-20250315225441802.png!compress)
```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;
```
---
### 练习四
![image-20250315225803115](https://yp.smallkun.cn/markdown/image-20250315225803115.png!compress)
![image-20250315225818026](https://yp.smallkun.cn/markdown/image-20250315225818026.png!compress)
```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, '重庆市南岸区');
```
![image-20250315225829272](https://yp.smallkun.cn/markdown/image-20250315225829272.png!compress)
```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 = '网络技术系';
```
---
### 练习五
![image-20250315230015174](https://yp.smallkun.cn/markdown/image-20250315230015174.png!compress)
```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', '事假');
```
![image-20250315230025538](https://yp.smallkun.cn/markdown/image-20250315230025538.png!compress)
```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
);
```
---
### 练习六
![image-20250315230057816](https://yp.smallkun.cn/markdown/image-20250315230057816.png!compress)
```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);
```
---
### 练习七
![image-20250315230113710](https://yp.smallkun.cn/markdown/image-20250315230113710.png!compress)
![image-20250315230128412](https://yp.smallkun.cn/markdown/image-20250315230128412.png!compress)
```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
);
```
---
### 练习八
![image-20250315230214156](https://yp.smallkun.cn/markdown/image-20250315230214156.png!compress)
![image-20250315230227129](https://yp.smallkun.cn/markdown/image-20250315230227129.png!compress)
```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
View File
@@ -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
View File
@@ -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
View File
@@ -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 ;
```
+51
View File
@@ -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;
}
+75
View File
@@ -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
View File
@@ -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 wasnt 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 mans best friends ', 'http://video.zhiyuliang8.jp/ToolsHomeDecoration');
INSERT INTO `t_video` VALUES (10025, 10002, 'It wasnt 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 wasnt 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 wasnt 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 wasnt 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 wasnt 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 doesnt ', '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 wasnt 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 mans 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 doesnt ', '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;
```
### 题目
![image-20250327181352576](https://yp.smallkun.cn/markdown/image-20250327181352576.png!compress)
![image-20250327181432455](https://yp.smallkun.cn/markdown/image-20250327181432455.png!compress)
### 答案
```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
```
+9
View File
@@ -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.
+7
View File
@@ -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
File diff suppressed because it is too large Load Diff
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
![bef8d22a5447da22e2b0](https://yp.smallkun.cn/markdown/b5d8f50f4cd00fbc6c6db024bb4fb66af047e03b45b239-qzQtTp!compress) ![精美壁纸赏析](https://yp.smallkun.cn/markdown/9be4036abbac899221fb8b6fd41c17bf5abe7af7b4d43c-hZUCC5!compress)
File diff suppressed because it is too large Load Diff
+47
View File
@@ -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");
}
+44
View File
@@ -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;
}
+57
View File
@@ -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;
}
+73
View File
@@ -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;
}
+48
View File
@@ -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 **********/
}
+39
View File
@@ -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);
}
+42
View File
@@ -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 **********/
}
+54
View File
@@ -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;
}
+33
View File
@@ -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;
}
+38
View File
@@ -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;
}
+32
View File
@@ -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;
}
+40
View File
@@ -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 **********/
}
+51
View File
@@ -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';
}
+46
View File
@@ -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);
}
+37
View File
@@ -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;
}
+37
View File
@@ -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;
}
+54
View File
@@ -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
View File
@@ -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;
}
+39
View File
@@ -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;
}
+46
View File
@@ -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;
}
+72
View File
@@ -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
View File
@@ -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;
}
+66
View File
@@ -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;
}
+54
View File
@@ -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;
}
+32
View File
@@ -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;
}
+40
View File
@@ -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
View File
@@ -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;
}
```
File diff suppressed because it is too large Load Diff
Binary file not shown.
+37
View File
@@ -0,0 +1,37 @@
## C语言中的关键字
![image-20250215020418329](https://yp.smallkun.cn/markdown/image-20250215020418329.png!compress)
## GCC中数据类型占内存的字节数和表数范围
![image-20250215020432274](https://yp.smallkun.cn/markdown/image-20250215020432274.png!compress)
## 运算符的优先级与结合性
![image-20250215020448240](https://yp.smallkun.cn/markdown/image-20250215020448240.png!compress)
### 常用字符的ASCII码对照表
![image-20250215020657273](https://yp.smallkun.cn/markdown/image-20250215020657273.png!compress)
## 输入输出格式转换说明
### 表 1 函数 printf() 的格式转换说明
![image-20250215020742312](https://yp.smallkun.cn/markdown/image-20250215020742312.png!compress)
![image-20250215020753921](https://yp.smallkun.cn/markdown/image-20250215020753921.png!compress)
### 表 2 函数 printf() 的格式修饰符
![image-20250215020829730](https://yp.smallkun.cn/markdown/image-20250215020829730.png!compress)
### 表 3 函数 scanf() 的格式转换说明
![image-20250215020855154](https://yp.smallkun.cn/markdown/image-20250215020855154.png!compress)
### 表 4 函数 scanf() 的格式修饰符
![image-20250215020933580](https://yp.smallkun.cn/markdown/image-20250215020933580.png!compress)
+110
View File
@@ -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 /(123)
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 @@
### 练习一
![image-20250315225248590](https://yp.smallkun.cn/markdown/image-20250315225248590.png!compress)
```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;
```
![image-20250315225304324](https://yp.smallkun.cn/markdown/image-20250315225304324.png!compress)
```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;
```
---
### 练习二
![image-20250315225318753](https://yp.smallkun.cn/markdown/image-20250315225318753.png!compress)
![image-20250315225328264](https://yp.smallkun.cn/markdown/image-20250315225328264.png!compress)
```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;
```
---
### 练习三
![image-20250315225417117](https://yp.smallkun.cn/markdown/image-20250315225417117.png!compress)
![image-20250315225431297](https://yp.smallkun.cn/markdown/image-20250315225431297.png!compress)
```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);
```
![image-20250315225441802](https://yp.smallkun.cn/markdown/image-20250315225441802.png!compress)
```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;
```
---
### 练习四
![image-20250315225803115](https://yp.smallkun.cn/markdown/image-20250315225803115.png!compress)
![image-20250315225818026](https://yp.smallkun.cn/markdown/image-20250315225818026.png!compress)
```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, '重庆市南岸区');
```
![image-20250315225829272](https://yp.smallkun.cn/markdown/image-20250315225829272.png!compress)
```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 = '网络技术系';
```
---
### 练习五
![image-20250315230015174](https://yp.smallkun.cn/markdown/image-20250315230015174.png!compress)
```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', '事假');
```
![image-20250315230025538](https://yp.smallkun.cn/markdown/image-20250315230025538.png!compress)
```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
);
```
---
### 练习六
![image-20250315230057816](https://yp.smallkun.cn/markdown/image-20250315230057816.png!compress)
```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);
```
---
### 练习七
![image-20250315230113710](https://yp.smallkun.cn/markdown/image-20250315230113710.png!compress)
![image-20250315230128412](https://yp.smallkun.cn/markdown/image-20250315230128412.png!compress)
```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
);
```
---
### 练习八
![image-20250315230214156](https://yp.smallkun.cn/markdown/image-20250315230214156.png!compress)
![image-20250315230227129](https://yp.smallkun.cn/markdown/image-20250315230227129.png!compress)
```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` = '青年旅行社';
```
+341
View File
@@ -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
View File
@@ -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.
+610
View File
@@ -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 ;
```
+108
View File
@@ -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表中有提成的员工姓名、月收入及提成。
+111
View File
@@ -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;
}
```
+183
View File
@@ -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;
}
```
+262
View File
@@ -0,0 +1,262 @@
### 试题
![数据库题目 (1)](https://yp.smallkun.cn/markdown/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%A2%98%E7%9B%AE%20(1).png!compress)
![数据库题目 (2)](https://yp.smallkun.cn/markdown/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%A2%98%E7%9B%AE%20(2).png!compress)
![数据库题目 (3)](https://yp.smallkun.cn/markdown/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%A2%98%E7%9B%AE%20(3).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
```
+73
View File
@@ -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;
}
+98
View File
@@ -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.
BIN
View File
Binary file not shown.
Binary file not shown.
+52
View File
@@ -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 = 3648 - 36 = 12
- 现在,用除数18除以余数12。
2. **第二步**18 ÷ 12
- 18 ÷ 12 = 1 余 6(因为 12 × 1 = 1218 - 12 = 6
- 现在,用除数12除以余数6。
3. **第三步**12 ÷ 6
- 12 ÷ 6 = 2 余 0(因为 6 × 2 = 1212 - 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的最大公约数就是那个数本身。

Some files were not shown because too many files have changed in this diff Show More