关系型数据库
  • Oracle数据库被认为是业界目前比较成功的关系型数据库管理系统。

  • MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle旗下 产品。中小型企业使用。

  • DB2是IBM公司的产品,DB2数据库系统采用多进程多线索体系结构,其功能足以满足大中公司 的需要,并可灵活地服务于中小型电子商务解决方案。实用较少。

  • Microsoft SQL Server

三大范式
  1. 无重复的列
  2. 添加主键。实现区分通常需要为表加上一个列,以存储各个示例的唯一标识。
  3. 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息
MYSQL安装
  1. 访问官网地址:https://dev.mysql.com/downloads/mysql/

  2. (可选)根目录下创建my.ini配置文件

    [mysqld]
    # 设置3306端口
    port=3306
    # 设置mysql的安装目录
    basedir=D:\mysql-8.0.22-winx64
    # 设置mysql数据库的数据的存放目录
    datadir=D:\mysql-8.0.22-winx64\data
    # 允许最大连接数
    max_connections=200
    # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
    max_connect_errors=10
    # 服务端使用的字符集默认为UTF8
    character-set-server=utf8
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    # 默认使用“mysql_native_password”插件认证
    default_authentication_plugin=mysql_native_password
    #skip_grant_tables
    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8[client]
    # 设置mysql客户端连接服务端时默认使用的端口
    port=3306
    default-character-set=utf8
  3. 环境变量自行添加

  4. 管理员方式打开cmd(【运行】-【cmd】-【Ctrol+Shift+Enter】),进入根目录下的bin目录,执行初始化数据库的指令

    mysqld --initialize --console
    
  5. 安装服务(bin目录下)

    mysqld --install [服务名(默认mysql)]
    
  6. 启动服务,并连接(注意看首次自动生成的密码)

    net start mysql
    mysql -uroot -p
    
  7. 修改密码,若是忘了密码,删掉初始化的 datadir 目录,再执行一遍初始化命 令,又会重新生成的。

    alter user 'root'@'localhost' identified with mysql_native_password BY '新密码';
    
  8. 关闭服务,卸载服务

    net stop mysql
    mysqld remove mysql
    
SQL语言

SQL是一种标准化语言,它允许你在数据库上执行操作,创建项目,查询内容,更新内容,删除条目等操作。

Create,Read,Update,Delete通常称为CRUD操作。(掌握这几项即可)

  • DDL 数据定义语言 关键字:CREATE,DROP,ALTER
  • DML 数据操作语言 关键字:INSERT、UPDATE、DELETE
  • DQL 数据查询语言 SELECT … FROM … WHERE(增、删、改、查)
  • DCL 数据控制语言 关键字:GRANT、REVOKE(权限控制)

注意一:语句以分号结尾

注意二:MySQL不区分大小写

DDL操作数据库

1.创建数据库

CREATE DATABASE语句用于创建新的数据库(编码方式:GB2312,UTF-8,GBK,ISO-8859-1)

// CREATE DATABASE 数据库名
CREATE DATABASE mydb1;
// CREATE DATABASE 数据库名 CHARACTER SET 编码方式
CREATE DATABASE mydb2 CHARACTER SET GBK;
// CREATE DATABASE 数据库名 CHARACTER SET 编码方式 COLLATE 排序规则
CREATE DATABASE mydb3 CHARACTER SET GBK COLLATE gbk_chinese_ci;

2.删除数据库

DROP DATABASE [IF EXISTS] db_name;

3.修改指定数据库的编码方式

ALTER DATABASE db_name DEFAULT CHARACTER SET [=] charset;

4.查看数据库

查看当前服务器下的全部数据库

SHOW DATABASES;
SHOW SCHEMAS;

查看某个数据库定义的信息

SHOW CREATE DATABASE db_name;

5.其他语句

查看当前使用的数据库

SELECT database();

切换数据库

USE db_name
DDL操作表

1.创建表

// CREATE TABLE [IF NOT EXISTS] tbl_name(字段名称 字段类型 [完整约束条件],字段名称 字段类型 [完整约束条件], ...)ENGINE=存储引擎 CHARSET=编码方式;
CREATE TABLE IF NOT EXISTS mytab1(name varchar(10), age int, sex char(1));

常用数据类型

  • int:整型

    double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为 999.99;默认支持四舍五入

    char:固定长度字符串类型; char(10) 'aaa ’ 占10位

    varchar:可变长度字符串类型; varchar(10) ‘aaa’ 占3位 text:字符串类型,比如小说信息;

    blob:字节类型,保存文件信息(视频,音频,图片);

    date:日期类型,格式为:yyyy-MM-dd;

    time:时间类型,格式为:hh:mm:ss

    timestamp:时间戳类型 yyyy-MM-dd hh:mm:ss 会自动赋值

    datetime:日期时间类型 yyyy-MM-dd hh:mm:ss

2.删除表

DROP TABLE [IF EXISTS] tbl_name;

3.动态操作表

添加字段

ALTER TABLE tbl_name ADD 字段名称 字段属性 [完整性约束条件] [FIRST|AFTER 字段名称]
eg: ALTER TABLE mytab1 ADD image blob;

删除字段

ALTER TABLE tbl_name DROP 字段名称

修改表名

ALTER TABLE 旧表名 rename 新表名;

动态添加默认值

ALTER TABLE tbl_name ALTER 字段名称 SET DEFAULT 默认值;

动态删除默认值

ALTER TABLE tbl_name ALTER 字段名称 DROP DEFAULT;

动态修改字段名称、字段类型、字段属性

ALTER TABLE tbl_name CHANGE 原字段名称 新字段名称 字段类型[字段属性] [FIRST|AFTER 字段名称]

动态修改字段类型、字段属性(方法二)

ALTER TABLE tbl_name MODIFY 字段名称 字段类型[字段属性] [FIRST|AFTER 字段名称]

添加唯一属性(索引)

ALTER TABLE tbl_name ADD UNIQUE KEY|INDEX [index_name] (字段名称);

删除唯一属性(索引)

DROP INDEX 字段名称 ON tbl_name;
ALTER TABLE tbl_name DROP index_name;

添加主键

ALTER TABLE tbl_name ADD PRIMARY KEY (字段名称);

删除主键

ALTER TABLE tbl_name DROP PRIMARY KEY;
// 注意 如果有AOTU_INCREMENT属性,应先用MODIFY或CHANGE修改属性后才可删除主键

修改AUTO_INCREMENT

ALTER TABLE tbl_name AUTO_INCREMENT=值;

4.查看表

查看当前数据库下的所有表

SHOW TABLES;

查看表结构

DESC tbl_name;
DESCRIBE tbl_name;
SHOW COLUMNS FROM tbl_name;
DML操作

DML是对表中的数据进行增、删、改的操作。(不要与DDL混淆)

主要包括:INSERT、UPDATE、DELETE

1.插入操作

// INSERT INTO 表名(列名) values(数据值)
insert into manager(mname, age, sex, password, address, phone)
values("王子", 18, "男", "123", "北京", "110"),("公主", 20, "女", "456", "上海", "220"),("太子", 23, "男", "789", "南京", "330");

sql中的运算符:

  • 算术运算符:+,-,*,/(除法),%(求余)

  • 赋值运算符:=

  • 逻辑运算符:and(并且), or(或), not(取非)

  • 关系运算符:>, <, >=, !=, =, <>(不等于)

2.删除数据

// DELETE 删除表中的数据,表结构还在;删除后的数据可以找回
DELETE FROM 表名 [WHERE 列名=值];
// TRUNCATE 删除是把表直接DROP掉,然后再创建一个同样的新表。(速度快)
TRUNCATE TABLE emp;

3.修改数据

UPDATE 表名 SET 列名1=值,列名2=值 ... WHERE 列名=值

4.查询数据

SELECT * FEOM 表名 [WHERE 列名=值];
DCL权限控制

1.创建用户

create user 用户名@指定ip identified by 密码;

create user test123@localhost IDENTIFIED by ‘test123’

create user 用户名@客户端ip identified by 密码; 指定IP才能登陆

create user test456@10.4.10.18 IDENTIFIED by ‘test456’

create user 用户名@‘% ’ identified by 密码 任意IP均可登陆

create user test7@’%’ IDENTIFIED by ‘test7’

2.用户授权

grant 权限1,权限2,…,权限n on 数据库名.* to 用户名@IP; 给指定用户授予指定数据库指定权限

grant select,insert,update,delete,create on database_name.* to 'test456'@'127.0.0.1';

grant all on . to 用户名@IP 给指定用户授予所有数据库所有权限

grant all on *.* to 'test456'@'127.0.0.1'

3.用户权限查询

show grants for 用户名@IP;

SHOW GRANTS FOR 'root'@'%';

4.撤销用户权限

revoke 权限1,权限2,…,权限n on 数据库名.* from 用户名@IP;

REVOKE SELECT ON *.* FROM 'root'@'%';

5.删除用户

drop user 用户名@IP;

drop user test123@localhost;
DQL数据查询

查询关键字:SELECT 语法: SELECT 列名 FROM 表名 【WHERE --> BROUP BY–>HAVING–> ORDER BY】

1.简单查询

查询所有列

SELECT * FROM stu;

查询指定列

SELECT sid, sname, age FROM stu;

2.条件查询

条件查询就是在查询时给出WHERE子句,在WHERE子句中可以使用如下运算符及关键字:

=、!=、<>、<、<=、>、>=; BETWEEN…AND; IN(set); IS NULL; AND;OR; NOT;

SELECT 要查询的列名称
FROM 表名称
WHERE 限定条件 /*行条件*/
GROUP BY grouping_columns /*对结果分组*/
HAVING condition /*分组后的行条件*/
ORDER BY sorting_columns /*对结果分组*/
LIMIT offset_start, row_count /*结果限定*/

查询表中sid=‘s_1001’,‘s_1002’,'s_1003’的记录:

SELECT * FROM stu WHERE sid='s_1001' or sid='s_1002' or sid='s_1003';
// 条件过多可使用in关键字:
SELECT * FROM stu WHERE sid in('s_1001','s_1002','s_1003');
// 也可取非,查询除了sid='s_1001','s_1002','s_1003'以外的记录
SELECT * FROM stu WHERE sid not in('s_1001','s_1002','s_1003');

3.模糊查询
语法: 列名 like ‘表达式’ //表达式必须是字符串

通配符:

  • _(下划线) : 匹配一个字符
  • % : 匹配零个或多个字符
mysql> select * from stu;
+--------+----------+------+--------+
| sid    | sname    | age  | gender |
+--------+----------+------+--------+
| S_1001 | liuYi    |   35 | male   |
| S_1002 | chenEr   |   15 | female |
| S_1003 | zhangSan |   95 | male   |
| S_1004 | liSi     |   65 | female |
| S_1005 | wangWu   |   55 | male   |
| S_1006 | zhaoLiu  |   75 | female |
| S_1007 | sunQi    |   25 | male   |
| S_1008 | zhouBa   |   45 | female |
| S_1009 | wuJiu    |   85 | male   |
| S_1010 | zhengShi |    5 | female |
| S_1011 | xxx      | NULL | NULL   |
+--------+----------+------+--------+

(1)查询姓名由5个字母构成,并且第5个字母为“i”的学生记录

mysql> select * from stu where sname like "____i";
+--------+-------+------+--------+
| sid    | sname | age  | gender |
+--------+-------+------+--------+
| S_1001 | liuYi |   35 | male   |
| S_1007 | sunQi |   25 | male   |
+--------+-------+------+--------+

(2)查询姓名中包含“a”字母的学生记录

mysql> select * from stu where sname like "%a%";
+--------+----------+------+--------+
| sid    | sname    | age  | gender |
+--------+----------+------+--------+
| S_1003 | zhangSan |   95 | male   |
| S_1005 | wangWu   |   55 | male   |
| S_1006 | zhaoLiu  |   75 | female |
| S_1008 | zhouBa   |   45 | female |
+--------+----------+------+--------+

4.字段控制查询

mysql> select * from emp;
+----+----------+--------+----------+--------+
| id | name     | gender | salary   | comm   |
+----+----------+--------+----------+--------+
|  1 | zhangsan | female | 10000.00 | 500.00 |
|  2 | lisi     | male   | 10000.00 | 300.00 |
|  3 | 小明     | male   | 10000.00 |   NULL |
+----+----------+--------+----------+--------+

(1)去除重复记录

mysql> select gender from emp;
+--------+
| gender |
+--------+
| female |
| male   |
| male   |
+--------+
mysql> select distinct gender from emp;
+--------+
| gender |
+--------+
| female |
| male   |
+--------+

(2)查看雇员的月薪与佣金之和

mysql> select salary+comm from emp;
+-------------+
| salary+comm |
+-------------+
|    10500.00 |
|    10300.00 |
|        NULL |     // 10000.00 + NULL = NULL
+-------------+
// 解决方案:使用ifnull,是null就用0计算
mysql> select salary+ifnull(comm,0) from emp;
+-----------------------+
| salary+ifnull(comm,0) |
+-----------------------+
|              10500.00 |
|              10300.00 |
|              10000.00 |
+-----------------------+
// 可给列重新起一个新的名称
mysql> select salary+ifnull(comm,0) as total from emp;
+----------+
| total    |
+----------+
| 10500.00 |
| 10300.00 |
| 10000.00 |
+----------+

5. 排序

语法: order by 列名 asc/desc

asc : 升序, desc : 降序, 默认不写的话是升序

// 查询所有学生记录,按年龄升序排序
SELECT * FROM stu ORDER BY age ASC;
// 查询所有学生记录,按年龄降序排序
SELECT * FROM stu ORDER BY age DESC;

多列排序:当前面的列的值相同的时候,才会按照后面的列值进行排序

// 查询所有学生记录,首先按年龄降序排序,年龄相同在按年级降序排序
SELECT * FROM stu ORDER BY age DASC,grade DESC;

6.聚合函数

聚合函数是用来做纵向运算的函数:

COUNT(列名):统计指定列不为NULL的记录行数;

MAX(列名):计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;

MIN(列名):计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;

SUM(列名):计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0

AVG(列名):计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;

(1) COUNT

// 查询emp表中记录数(重定义新表名为cnt):
SELECT COUNT(*) AS cnt FROM emp;
// 查询emp表中有佣金的人数:
SELECT COUNT(comm) cnt FROM emp;
// 统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) FROM emp WHERE sal+IFNULL(comm,0) > 2500;

注意:统计指定列不为NULL的记录行数;

(2) SUM和AVG

// 查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal), SUM(comm) FROM emp;
// 统计所有员工平均工资:
SELECT AVG(sal) FROM emp;

(3)MAX和MIN

// 查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;

7.1分组查询

查询每个部门的部门编号和每个部门的工资和:

SELECT deptno, SUM(sal) FROM emp GROUP BY deptno;

查询每个部门的部门编号以及每个部门的人数:

SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;

查询每个部门的部门编号以及每个部门工资大于1500的人数:

// 此处多了筛选条件,那就先筛选符合条件的记录,在进行分组查询
SELECT deptno,COUNT(*) FROM emp WHERE sal>1500 GROUP BY deptno;

总结:SLECECT后查询的记录只能是被分组的列和聚合函数

7.2 HAVING子句

查询工资总和大于9000的部门编号以及工资和:

// 先对部门分组和查询工资聚合,在对聚合结果进行筛选
SELECT deptno,SUM(sal) FROM emp GROUP BY deptno HAVING SUM(sal) > 9000;

总结:

​ HAVING:先分组聚合,再筛选聚合结果(必定有分组GROUP BY)

​ WHERE:先筛选结果,才进行分组聚合


8.LIMIT与分页查询

LIMIT用来限定查询结果的起始行,以及总行数。

语法:limit 开始下标,显示条数;//开始下标从0开始,不写开始下标,默认从0开始

1.查询5行记录,起始行从0开始

SELECT * FROM emp LIMIT 0, 5

如果一页记录为10条,希望查看第3页记录应该怎么查呢?

l 第一页记录起始行为0,一共查询10行; limit 0,10

l 第二页记录起始行为10,一共查询10行;limit 10,10

// pageindex为页数
limit (pageindex-1)*pagesize,pagesize;

查询语句书写顺序:select – from- where- groupby- having- order by-limit

查询语句执行顺序:from - where -group by -having - select - order by-limit


DQL数据查询sql练习

-- 年级表(grade):
CREATE TABLE IF NOT EXISTS grade (
gradeid  INT NOT NULL AUTO_INCREMENT COMMENT '年级 id',
gname  VARCHAR(4) NULL COMMENT '年级名称',
PRIMARY KEY (gradeid)
);
-- 成绩表(score):
CREATE TABLE IF NOT EXISTS score (
scoreid  INT NOT NULL AUTO_INCREMENT COMMENT 'id',
stuno  VARCHAR(10) NULL COMMENT '学员编号',
subjectid INT NULL COMMENT '科目 id',
score INT NULL COMMENT '分数',
examtime VARCHAR(6) NULL COMMENT '考试时间',
PRIMARY KEY (scoreid)
);
-- 学生表(student):
CREATE TABLE IF NOT EXISTS student (
stuid  VARCHAR(10) NOT NULL COMMENT '学生编号',
stuname  VARCHAR(5) NULL COMMENT '学生姓名',
PASSWORD  VARCHAR(16) NULL COMMENT '登录密码',
sex  CHAR(1) NULL COMMENT '性别',
gid  INT NULL COMMENT '年级 id',
telphone  VARCHAR(11) NULL COMMENT '电话',
address  VARCHAR(50) NULL COMMENT '地址',
birthday  DATE NULL COMMENT '出生日期',
email  VARCHAR(50) NULL COMMENT '邮箱',
PRIMARY KEY (stuid)
);
-- 科目表(subject):
CREATE TABLE IF NOT EXISTS SUBJECT (
subjectid  INT NOT NULL COMMENT '科目id',
subjectname  VARCHAR(20) NULL COMMENT '科目名称',
studycount  INT NULL COMMENT '学时',
gradeid  INT NULL COMMENT '年级 id',
PRIMARY KEY (subjectid)
);-- 初始数据
INSERT INTO grade(gname) VALUES('第一阶段'),('第二阶段'),('第三阶段');INSERT INTO score(stuno,subjectid,score,examtime)
VALUES  ('S1101001',1,60, '90分钟'),('S1101001',2,70, '90分钟'),('S1101001',3,90, '90分钟'),('S1101001',8,50, '90分钟'),('S1101002',1,50, '90分钟'),('S1101002',2,70, '90分钟'),('S1101002',3,70, '90分钟'),('S1101002',8,88, '90分钟'),('S1101003',1,66, '90分钟'),('S1101003',2,77, '90分钟'),('S1101003',3,81, '90分钟'),('S1101003',8,90, '90分钟'),('S1101004',1,78, '90分钟'),('S1101004',2,91, '90分钟'),('S1101004',3,100, '90分钟'),('S1101004',8,66, '90分钟'),('S1101005',1,59, '90分钟'),('S1101005',2,69, '90分钟'),('S1101005',3,88, '90分钟'),('S1101005',8,90, '90分钟');INSERT INTO student(stuid,stuname,PASSWORD,sex,gid,telphone,address,birthday,email)
VALUES  ('S1101001','小明','123456','男',1,'13658950001',"北京",'1990-01-01','00001_000@163.com'),('S1101002','小萌','123456','女',1,'13658950002',"北京",'1989-01-01','00002_000@163.com'),('S1101003','小爱','123456','女',2,'13658950003',"山东",'1999-01-03','00003_000@163.com'),('S1101004','小可','123456','女',2,'13658950004',"北京",'1999-01-04','00004_000@163.com'),('S1101005','小妲','123456','女',3,'13658950005',"山东",'1999-01-05','00005_000@163.com'),('S1101006','金蝶','123456','女',3,'13658950006',"北京",'1989-01-05','00006_000@163.com'),('S1101007','凌潇肃','123456','男',4,'13658950007',"北京",'1989-01-05','00007_000@163.com'),('S1101008','凌同学','123456','男',4,'13658950007',"杭州",'1989-01-05','00008_000@163.com');INSERT INTO SUBJECT(subjectid,subjectname,studycount,gradeid)
VALUES  (1,'设计 MySchool 数据库',40,1),(2,'面向对象程序设计',45,1),(3,'基于.NET 平台的软件系统分层开发',55,2),(4,'脱单必修课',30,3),(8,'养发护发秘籍',60,3);-- 1. grade 表增加一个阶段,“就业期”
INSERT INTO grade(gname) VALUES('就业期');-- 2.将第三阶段的学生的 gradeid 改为就业期的 id
UPDATE student SET gid=(SELECT gradeid FROM grade WHERE gname='就业期')
WHERE gid=(SELECT gradeid FROM grade WHERE gname='第三阶段'); -- 3.查询所有得了 100 分的学号
SELECT stuno AS '获得100分的学号' FROM score WHERE score=100;-- 4.查询所有 1989 年出生的学生(1989-1-1~1990-1-1)
SELECT * FROM student WHERE birthday BETWEEN '1989-1-1' AND '1990-1-1';-- 5.查询学生姓名为“金蝶”的全部信息
SELECT * FROM student WHERE stuname='金蝶';-- 6.查询 subjectid 为 8 的科目考试未及格(60 分)的学号和成绩
SELECT stuno,score FROM score WHERE subjectid=8 AND score<60;-- 7.查询第 3 阶段课时大于 50 的课程全部信息
SELECT * FROM SUBJECT WHERE gradeid=(SELECT gradeid FROM grade WHERE gname='第三阶段') AND studycount>50;-- 8.查询 S1101001 学生的考试信息
SELECT * FROM student WHERE stuid='S1101001';-- 9.查询所有第二阶段的女生信息
SELECT * FROM student WHERE gid=(SELECT gradeid FROM grade WHERE gname='第二阶段') AND sex='女';-- 10.“基于.NET 平台的软件系统分层开发”需要多少课时
SELECT studycount AS '需要的课时' FROM SUBJECT WHERE subjectname='基于.NET 平台的软件系统分层开发';-- 11.查询“设计 MySchool 数据库”和“面向对象程序设计”的课时(使用 in)
SELECT subjectname,studycount AS '需要的课时' FROM SUBJECT WHERE subjectname IN ('设计 MySchool 数据库','面向对象程序设计');-- 12 查询所有地址在山东的学生信息
SELECT * FROM student WHERE address='山东';-- 13 查询所有姓凌的单名同学
SELECT * FROM student WHERE stuname LIKE '凌%';-- 14.查询 gradeid 为 1 的学生信息,按出生日期升序排序
SELECT * FROM student WHERE gid=1 ORDER BY birthday ASC;-- 15.查询 subjectid 为 3 的考试的成绩信息,用降序排序
SELECT * FROM score WHERE subjectid=3 ORDER BY score DESC;-- 16.查询 gradeid 为 2 的课程中课时最多的课程信息
SELECT * FROM SUBJECT WHERE gradeid=2 AND studycount=(SELECT MAX(studycount) FROM SUBJECT WHERE gradeid=2); -- 17.查询北京的学生有多少个
SELECT COUNT(*) AS '北京的学生人数' FROM student WHERE address='北京';-- 18.查询有多少个科目学时小于 50
SELECT COUNT(*) AS '学时小于50的科目数' FROM SUBJECT WHERE studycount<50;-- 19.查询 gradeid 为 2 的阶段总课时是多少
SELECT SUM(studycount) AS '总课时' FROM SUBJECT WHERE gradeid=(SELECT gradeid FROM grade WHERE gname='第二阶段');-- 20.查询 subjectid 为 8 的课程学生平均分
SELECT AVG(score) AS '平均分' FROM score WHERE subjectid=8;-- 21.查询 gradeid 为 3 的课程中最多的学时和最少的学时
SELECT MAX(studycount) AS '最多的学时', MIN(studycount) AS '最少的学时' FROM SUBJECT WHERE gradeid=3;-- 22.查询每个科目有多少人次考试
SELECT (SELECT subjectname FROM SUBJECT WHERE subjectid=score.subjectid) AS '学科', COUNT(stuno) AS '人数' FROM score GROUP BY subjectid;-- 23.每个阶段课程的平均课时
SELECT (SELECT gname FROM grade WHERE gradeid=SUBJECT.gradeid) AS '年级',AVG(studycount) AS '平均课时' FROM SUBJECT GROUP BY gradeid;-- 24.查询每个阶段的男生和女生个数(group by 两列)
SELECT (SELECT gname FROM grade WHERE gradeid=student.gid) AS '年级',sex,COUNT(sex) AS '人数' FROM student GROUP BY sex,gid;-- 思考:每个阶段课程的平分 :无法统计,成绩表和年级表没有直接联系统计不了

java学习笔记——数据库相关推荐

  1. Java学习笔记系列-入门篇-计算机基础

    Java学习笔记 Java学习笔记是一个持续更新的系列,工作多年,抽个空对自身知识做一个梳理和总结归纳,温故而知新,同时也希望能帮助到更多正在学习Java 的同学们. 本系列目录: 入门篇 计算机基础 ...

  2. java学习笔记(二十八)——开发一个小项目(VMeeting3.0)

    上篇文章按照较规范的产品需求文档梳理了项目的逻辑,感觉开发起来明晰了很多:挂上一篇文章java学习笔记(二十七)--开发一个小项目(VMeeting2.0)_Biangbangbing的博客-CSDN ...

  3. 郑志远的java学习笔记

    郑志远的java学习笔记 郑志远    CCB 1         Java起源 略 2         Java语言概述 1.面向对象编程的3个原则:封装(encapsulation).继承(inh ...

  4. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  5. 2022年Java学习笔记目录

    一.2022年Java任务驱动课程 任务驱动,统摄知识点:2022年Java程序设计讲课笔记 二.2022年Java学习笔记 (一)踏上Java开发之旅 Java学习笔记1.1.1 搭建Java开发环 ...

  6. Java学习笔记(原创)

    Java学习笔记(原创) 2011-12-01 16:37:00|  分类: Java|举报|字号 订阅 下载LOFTER客户端 基本知识 一. Java基础 1. java语言的特点: ①简单:没有 ...

  7. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  8. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  9. 准备写java学习笔记

    准备写java学习笔记 java int 转载于:https://blog.51cto.com/cryingcloud/1975267

最新文章

  1. eclipse+adt+android sdk,64位Ubuntu 11.10下Android开发环境的搭建(JDK+Eclipse+ADT+Android SDK详细)...
  2. 【Win8启动后自动进入传统桌面设置】
  3. 2021年春季学期-信号与系统-第二次作业参考答案
  4. Apache2.2+tomcat7 负载均衡配置
  5. 全球顶级语音技术比赛中获双料冠军,这家中国公司靠什么?
  6. python 数值运算 m op n_python数值运算 四则运算
  7. [转]Open Data Protocol (OData) Basic Tutorial
  8. 悔不当初:回顾进化之路
  9. 【Vue案例一】实现跑马灯效果
  10. nc65 单据非向导开发 源代码_最受Java开发者喜爱的5款开发工具
  11. OpenLDAP 2.4.44 安装 + phpLDAPadmin 安装
  12. 【LeetCode】【字符串】题号:*14. 最长公共前缀
  13. Perl+批处理实现半自动批量生成动态通讯组
  14. readelf ELF 文件格式分析
  15. 智能脚本植入与CBSS+
  16. 遇到“无法浏览网页”教你十招解决疑难杂症
  17. 360安全助手 -- 强力卸载电脑上的软件 的问题
  18. 漂泊在汉语视界中的蒙古歌者
  19. Git提交项目到GitHub完整流程
  20. Skype for Business 中的键盘快捷方式

热门文章

  1. EasyAR尝鲜系列教程之自定义Marker的实现
  2. 什么是API?谈对API的理解
  3. edusoho对接腾讯会议直播功能 直播结束自动转存阿里云视频点播
  4. Jupyter Notebook输出表格格式化(自动对齐)
  5. windows7下实现用户自动登录
  6. Python从入门到实践:面向对象之封装(二)
  7. 支付宝支付成功后通知在微信打开的提示页面
  8. SAP 系统查询系所有 TCODE清单
  9. Brocade 交换机微码升级方法大全
  10. 企业网络营销怎么找到精准客户?