MySQL 数据创建和查询

 SQL 介绍

          结构化查询语言(Structured Query Language),一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。

SQL 特点

  1. 是开源数据库,使用C和C++编写
  2. 能够工作在众多不同的平台上
  3. 提供了用于C、C++、Python、Java、Perl、PHP、Ruby众多语言的API
  4. 存储结构优良,运行速度快
  5. 功能全面丰富
  6. SQL语言基本上独立于数据库本身
  7. 各种不同的数据库对SQL语言的支持与标准存在着细微的不同
  8. 每条命令以 ; 结尾
  9. SQL命令(除了数据库名和表名)关键字和字符串可以不区分字母大小写
  10. 关系型: 采用关系模型(二维表)来组织数据结构的数据库 ,如Oracle 、SQL_Server、 MySQL。

上述只是大概

 创建数据库

              创建数据库语法格式如下:

CREATE DATABASE [IF NOT EXISTS] <库名>
  [CHARACTER SET <字符集名>]
  [COLLATE <校对规则名>];

简介写法:

    CREATE DATABASE   库名    [CHARACTER SET UTF-8] ;

注意:库名的命名

  1. 数字、字母、下划线,但不能使用纯数字
  2. 库名区分字母大小写
  3. 不要使用特殊字符和mysql关键字 
  4. 不一定使用UTF-8,但是推荐使用UTF-8编码来存储数据。UTF-8编码支持更多的字符集,可以存储更多不同语言的字符,而且在国际化的环境下更加通用。如果不使用UTF-8编码,可能会导致数据存储和显示的问题。因此,一般来说,建议在MySQL中使用UTF-8编码。
  5. CREATE : 是创建命令关键字。
  6. DATABASE : 表示创建一个数据库。
  7. IF NOT EXISTS : 用来判断数据库是否存在,只有该数据库不存在时执行操作,用来避免数据库已经存在重复创建的错误。
  8. CHARACTER SET :用来指定字符集,指定字符集的目的是避免在数据库中出现乱码,创建和数据库时不指定字符集,系统默认的字符集(是latin1)

创建数据表

  • 表结构

            在数据库中的表是存放数据的基本单位,表的组成由行列组成。一行叫做一条记录(元组)一列叫做字段(属性),同数据库中,不同表不能同名,同样表名不能重复。

  • 数据类型   

   数字类型

             整数类型:INT,SMALLINT,TINYINT,MEDIUMINT,BIGINT

             浮点类型:FLOAT,DOUBLE,DECIMAL

             比特值类型:BIT

   字符串类型

           普通字符串: CHAR,VARCHAR,

           存储文本:TEXT,

           存储二进制数据: BLOB,

           存储选项型数据:ENUM,SET

  • 字段属性

字段约束                

  •  如果你想设置数字为无符号则加上 UNSIGNED
  • 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
  • DEFAULT 表示设置一个字段的默认值
  • COMMENT 增加字段说明
  • AUTO_INCREMENT 定义列为自增的属性,一般用于主键,数值会自动加1。
  • PRIMARY KEY 关键字用于定义列为主键。主键的值不能重复,且不能为空。

创建数据表语法格式如下

CREATE TABLE 表名(
字段名 数据类型 约束,
字段名 数据类型 约束,
字段名 数据类型 约束,
...
);

 数据查询

MySQL 数据库使用 SELECT 语句来查询数据。

SELECT  * FROM  表名 [WHERE条件];
SELECT  字段1,字段2 FROM 表名 WHERE 条件];
 where子句

where子句在sql语句中扮演了重要角色,主要通过一定的运算条件进行数据的筛选,在查询,删除,修改中都有使用。

实例6-6;

依据图片表并做如下查询,利用grade,mark,student1,subjects表做一下查询。

--创建grade表

CREATE TABLE grade (

    gradeid INT PRIMARY KEY,

    gradename VARCHAR(255)

);

-- 插入数据到grade表

INSERT INTO grade (gradeid, gradename)

VALUES

(1, '一年级'),

(2, '二年级'),

(3, '三年级'),

(4, '四年级');



-- 创建mark表

CREATE TABLE mark (

    markid INT,

    studentno VARCHAR(255),

    subjectid INT,

    studentscore INT,

    examdate DATE

);

--  插入数据到mark表

INSERT INTO mark (markid, studentno, subjectid, studentscore, examdate) VALUES

(1, 's1001', 1, 80, '2015-07-01'),

(2, 's1002', 1, 40, '2015-07-01'),

(3, 's1001', 2, 15, '2015-07-01'),

(4, 's1002', 2, 20, '2015-07-01'),

(5, 's1001', 1, 60, '2015-07-01'),

(6, 's1001', 3, 90, '2015-07-03'),

(7, 's1001', 4, 90, '2015-07-03'),

(8, 's1001', 5, 75, '2015-07-01'),

(9, 's1002', 3, 65, '2015-07-03'),

(10, 's1002', 4, 35, '2015-07-03'),

(11, 's1002', 5, 87, '2015-07-01'),

(12, 's1003', 2, 65, '2015-07-01'),

(13, 's1003', 3, 45, '2015-07-03'),

(14, 's1003', 4, 92, '2015-07-03'),

(15, 's1003', 5, 55, '2015-07-01'),

(16, 's1004', 1, 65, '2015-07-01'),

(17, 's1004', 2, 0, '2015-07-01'),

(18, 's1004', 3, 60, '2015-10-10');




-- 创建student表

CREATE TABLE student (

    studentno VARCHAR(255),

    studentname VARCHAR(255),

    loginpassword VARCHAR(255),

    sex CHAR(1),

    phone VARCHAR(255),

    address VARCHAR(255),

    born DATE,

    email VARCHAR(255),

    gradeid INT,

    FOREIGN KEY (gradeid) REFERENCES grade(gradeid)

);



-- 插入数据到student表

INSERT INTO student(studentno, studentname, loginpassword, sex, phone, address, born, email, gradeid)

VALUES

('s1001', '张三', 'zhangsan', '男', '1302225555', '宿舍',           '1994-01-01',      null, 1),

('s1002', '李四', 'l1s1',     '男', '1302225555', '宿舍',           '1997-07-07',      null, 1),

('s1003', '张丽', '123456',   '女', '1306669999', '宿舍',           '1995-05-06',      null, 1),

('s1004', '王磊', '123456',   '男', '1503699878', '西安',           '2022-04-19',      null, 1),

('s1005', '张丹', '123456',   '女', '1502222555', '宿舍',           '1993-08-06',      null, 1),

('s1006', '李亮', '123456',   '男', '1502222559', '西安市雁塔区',     '1993-12-01'  ,     'liliang@126.com', 1),

('s1007', '李丹', '123456',   '女', '1502222554', '宿舍',            '1992-11-11'  ,    ' 20161201141947@126.com', 1),

('s1008', '王亮', '123456',   '男', '1502222553', '西安科技二路',    '1992-12-02', NULL, 2),

('s1009', '赵龙', '123456',   '男', '1502222552', '西安科技二路',    '1992-06-07', NULL, 2),

('s1010', '徐丹', '123456',   '女', '1502222551', '宿舍',           '1993-05-06', NULL, 2);

--确保日期合理且不使用未来日期,修正电子邮件格式问题,建议在应用层处理密码加密

--

建议仅供参考,  INSERT INTO students1 (studentno, studentname, loginpassword, sex, phone, address, born, email, gradeid)

-- VALUES

-- ('s1001', '张三', 'HASHED_zhangsan', '男', '1302225555', '宿舍', '1994-01-01', null, 1), -- 假设'HASHED_zhangsan'是经过安全哈希处理的密码

-- ('s1002', '李四', 'HASHED_l1s1', '男', '1302225556', '宿舍', '1992-05-06', null, 1), -- 更改电话号码以避免重复

-- ('s1003', '张丽', 'HASHED_PASSWORD', '女', '1306669999', '宿舍', '2000-04-19', null, 1), -- 修改出生日期至合理范围,使用哈希密码





- 创建subject表



CREATE TABLE subjects (

    subjectid INT PRIMARY KEY,

    subjectname VARCHAR(255),

    classhour INT,

    gradeid INT,

    FOREIGN KEY (gradeid) REFERENCES grade(gradeid)

);



-- 插入数据到subject表

INSERT INTO subject (subjectid, subjectname, classhour, gradeid)

VALUES

(1, 'MySQL深入', 65, 1),

(2, 'Java基础', 60, 2),

(3, '计算机基本原理', 70, 1),

(4, '毛泽东概论', 61, 1),

(5, '英语', 55, 1),

(6, 'JSP', 40, 2),

(7, '数据结构', 60, 2),

(8, 'Oracle', 65, 1);

1、 查询全部一年级的学生信息。

SELECT * FROM student WHERE gradeie=1;

2、 查询全部二年级的学生的姓名和电话。

SELECT studentname, phone FROM student WHERE gradeid = 2;

3、 查询全部一年级女同学的信息。

SELECT * FROM student WHERE gradeid = 1 AND sex = '女';

4、 查询课时超过60的科目信息。

SELECT * FROM subject WHERE classhour > 60;

5、 查询二年级的科目名称

SELECT subjectname FROM subject WHERE gradeid = 2;

6、 查询二年级男同学的姓名和住址。

SELECT studentname, address FROM student WHERE gradeid = 2 AND sex = '男';

7、 查询无电子邮件的学生姓名和年级信息。

SELECT studentname, gradeid FROM student WHERE email IS NULL;

8、 查询出生日期在1992年之后的男学生姓名和年级信息。


SELECT studentname, gradeid FROM student WHERE sex = '男' AND born >= '1992-01-01';

9、参加了日期为2015年7月3日的“计算机基本原理”科目考试的成绩信息。

SELECT markid, studentno, subjectid, studentscore, examdate FROM mark WHERE subjectid = 4 AND examdate = '2015-07-03';

10、 按照出生日期查询一年级的学生信息。

SELECT * FROM student WHERE gradeid = 1 ORDER BY born;

11、 按成绩由高到低的次序查询参加编号为1的科目考试信息。

 SELECT * FROM mark WHERE subjectid = 1 ORDER BY studentscore DESC;

12、 查询2015年7月1日参加“MySQL深入”考试的前2名学员成绩信息。

---方法一
SELECT * FROM mark WHERE subjectid = 2 ORDER BY studentscore DESC;


--逻辑:首先,它通过WHERE子句筛选出subjectid为2的记录;然后,使用ORDER BY studentscore DESC对这---些记录按学生分数从高到低排序。
--结果:返回的结果会包含所有选修该课程的学生信息及他们的分数,每一行代表一个学生的单个成绩记录,按成绩降序排列。
--方法二
select studentno,sum(studentscore) from mark group by studentno order by avg(studentscore) desc;

--逻辑:GROUP BY studentno将记录按学生编号分组,这意味着每个学生的多条记录将被合并为一条;--SUM(studentscore)计算每个学生的总分数;最后,ORDER BY AVG(studentscore) DESC理论上应意在按学生---平均分降序排序,但实际上原查询按SUM(studentscore)即总分排序。
--结果:返回的结果中,每一行代表一个学生,列出了学生编号和该学生的总分数(根据原始查询逻辑),
--并按总分数从高到低排序。如果目的是按平均分排序,则需要调整ORDER BY子句以正确反映这一需求。

13、 查询课时最多的科目名称及课时。

SELECT subjectname, classhour FROM subject ORDER BY classhour DESC LIMIT 1;

14、 查询年龄最小的学生所在的年级及姓名。

 SELECT gradeid, studentname FROM student ORDER BY born ASC LIMIT 1;

15、 查询考试的最低分出现在哪个科目

-- 方法一
SELECT subject.subjectid, subject.subjectname
FROM subject
JOIN mark ON subject.subjectid = mark.subjectid
ORDER BY mark.studentscore ASC
-- LIMIT 1;
-- 逻辑:利用JOIN关联课程信息和成绩信息,按成绩升序排列后限制结果集大小为1,从而找到成绩最低的课程。
-- 结果:返回一条记录,包含成绩最低课程的ID和课程名。
-- 方法二
SELECT subjectid, subjectname, classhour
FROM subject
WHERE classhour = (SELECT MIN(classhour) FROM subject);
-- 逻辑:使用子查询来确定整个subject表中课时最少的数值,然后在WHERE子句中过滤出具有该课时数的所有课程记录。
-- 结果:返回一条或多条记录,包含所有课时最少的课程的ID、课程名和课时数。如果有多个课程课时相同且均为最少,则都会被列出。

16、 查询学号为“s1001”的学生参加过的所有考试信息,并按照时间前后次序显示。

SELECT * FROM mark WHERE studentno = 's1001' ORDER BY examdate;

18、 查询1月份过生日的学生信息

  SELECT * FROM student WHERE MONTH(born) = 1;

19、 查询今天过生日的学生姓名及所在年级。

SELECT studentname, gradeid FROM student WHERE DAYOFYEAR(born) = DAYOFYEAR(CURDATE());

20、 新生入学,为其分配一个Email地址,规则如下:S1+当前日期 +@bd.com

 SELECT CONCAT('S1', DATE_FORMAT(CURDATE(), '%Y%m%d'), '@bd.com') AS email_address;

21、 查询住址为“雁塔区”的学生姓名、电话、住址

SELECT studentname, phone, address FROM student WHERE address LIKE '%雁塔区%';

22、 查询名称中含有“计算机”字样科目名称、学时及所属年级,并按年级由低到高显示。

 SELECT subjectname, classhour, gradeid FROM subject WHERE subjectname LIKE '%计算机%' ORDER BY gradeid ASC;

23、 查询电话中含有以“130”开头的学生姓名,住址和电话。

SELECT studentname, phone, address FROM student WHERE phone LIKE '130%';

24、 查询姓“赵”的学号、姓名和住址。

 SELECT studentno, studentname, address FROM student WHERE studentname LIKE '赵%';

25、 统计一年级女生的总人数。

 SELECT COUNT(*) FROM student WHERE gradeid = 1 AND sex = '女';

26、 查询李四总成绩

SELECT SUM(studentscore) FROM mark WHERE studentno = '李四';
 

27、 学号为s1003的学生所有课总成绩

SELECT SUM(studentscore) FROM mark WHERE studentno = 's1003';

28、 学号为s1003的学生考试的平均分。

 SELECT AVG(studentscore) FROM mark WHERE studentno = 's1003';

29、 查询一年级的科目“Mysql”的最高分、最低分、平均分。

 SELECT MAX(studentscore), MIN(studentscore), AVG(studentscore) FROM mark WHERE subjectid IN 
    (SELECT subjectid FROM subject WHERE gradeid = 1 AND subjectname LIKE '%Mysql%');

30、 查询每个年级的总学时数,并按照升序排列。

  SELECT gradeid, SUM(classhour) FROM subject GROUP BY gradeid ORDER BY gradeid ASC;

31、 查询每个参加考试的学员的平均分。(Group by 学号)

SELECT studentno, AVG(studentscore) FROM mark GROUP BY studentno;

32、 查询每门课程的平均分,并按照降序排列。(group by 课程)

-- 方法一

  SELECT studentno, AVG(studentscore) FROM mark GROUP BY studentno;

--   逻辑:通过GROUP BY studentno,将数据按学生学号分组,然后对每个组使用AVG(studentscore)计算该组内所有学生分数的平均值。
-- 结果:返回一个列表,每行包含一个学生学号及其对应的平均分数,没有特定的排序顺序。

-- 方法二

    SELECT 
    s.subjectid, 
    s.subjectname, 
    AVG(m.studentscore) AS average_score,
    MAX(m.studentscore) AS highest_score,
    MIN(m.studentscore) AS lowest_score
FROM mark m
JOIN subject s ON m.subjectid = s.subjectid
GROUP BY s.subjectid, s.subjectname
ORDER BY average_score DESC;
-- 逻辑:首先通过JOIN操作将mark表和subject表根据subjectid连接起来,然后按subjectid和subjectname分组。对于每个课程组,它计算平均分(AVG)、最高分(MAX)和最低分(MIN)。最后,使用ORDER BY average_score DESC按照平均分数从高到低排序结果。
-- 结果:返回一个列表,每行包含一门课程的ID、课程名、该课程的平均分数、最高分数和最低分数,并且这个列表是按照平均分数从高到低排列的。

  

33、 查询每个学生参加的所有考试的总分,并按照降序排列。(group by 学号)

 SELECT studentno, SUM(studentscore) FROM mark GROUP BY studentno ORDER BY SUM(studentscore) DESC;

34、 查询一年级的平均年龄。

 SELECT AVG(DATEDIFF(CURDATE(), born) / 365) AS average_age
FROM student
WHERE gradeid = 1;

35、 查询每个年级西安地区的学生人数。

SELECT gradeid, COUNT(*) FROM student WHERE address = '西安' GROUP BY gradeid;

36、 查询参加考试的学生中,平均分及格的学生记录,并按照平均成绩降序排列

37、 查询参加考试至少一次考试不及格的学生学号、姓名、不及格次数。

SELECT s.studentname, g.gradename, s.phone
FROM student s
JOIN grade g ON s.gradeid = g.gradeid;

38、 查询学生姓名、所属年级名称及联系电话。

 SELECT subjectname, studentscore, examdate
 FROM mark JOIN subject ON mark.subjectid = subject.subjectid WHERE studentno = 's1001';
   

39、 查询年级编号为1的科目名称、年级名称及学时。

--方法一
  SELECT subjectname, classhour, gradeid FROM subject;
  
方法二
SELECT s.subjectid, s.subjectname, IFNULL(m.studentscore, '未参加考试')
 AS studentscore, IFNULL(m.examdate, '未参加考试') AS examdate
FROM subject s
LEFT JOIN mark m ON s.subjectid = m.subjectid;

40、 查询参加科目编号为1的考试的学生姓名、分数、考试日期。

SELECT mark , studentscore, examdate FROM 
student JOIN mark ON student.studentno = mark.studentno WHERE subjectid = 1;

41、 查询学号为s1001的学生参加的考试科目名称、分数、考试日期。

SELECT subjectname, studentscore, examdate
FROM mark
JOIN subject ON mark.subjectid = subject.subjectid
WHERE studentno = 's1001';

42、 查询所有科目的参考信息(某些科目可能还没有被考试过)


-- 方法一
SELECT s.subjectid, s.subjectname, IFNULL(m.studentscore, '未参加考试') AS studentscore, IFNULL(m.examdate, '未参加考试') AS examdate
FROM subject s
LEFT JOIN mark m ON s.subjectid = m.subjectid;
-- 逻辑:通过LEFT JOIN确保了subject表中的每一行都能在结果集中出现,
即使它在mark表中没有匹配项。使用IFNULL函数处理可能的NULL值,为用户提供友好的信息展示。
-- 结果:返回一个列表,包含了所有课程的信息,对于有考试记录的课程,
会显示具体分数和考试日期;对于没有考试记录的课程或学生,相应的列会显示“未参加考试”。

SELECT subject.subjectname, subject.classhour, grade.gradename
FROM subject
LEFT JOIN mark ON subject.subjectid = mark.subjectid
LEFT JOIN grade ON subject.gradeid = grade.gradename
WHERE mark.subjectid IS NULL;
--方法二
-- 逻辑:通过两次LEFT JOIN操作连接subject、mark和grade表,
但最终通过WHERE mark.subjectid IS NULL过滤条件,仅保留那些在mark表中没有匹配项的记录,
意味着这些课程没有考试记录。
-- 结果:返回一个列表,仅包含那些没有任何考试记录的课程的名称、
课时数以及它们所属的年级名称。这个结果集专门用于识别没有学生参加过考试的课程情况。

43、 查询没有被考过的科目信息。

SELECT subjectname, classhour, gradeid FROM subject WHERE subjectid NOT IN (SELECT subjectid FROM mark);

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值