数据库操作(二)

创建学员信息表

/*
  列名:
     stuNo   学号 非空
     stuName 姓名 非空
     stuAge  年龄 非空
     stuId   身份证号码
     stuSeat 座位号
     stuClass 班级
*/

CREATE TABLE  stuInfo(
 stuNo   CHAR(6)  NOT  NULL,   #学号,非空(必填)
 stuName  VARCHAR(20)  NOT  NULL ,  #学员姓名,非空(必填)
 stuAge  INT NOT NULL,  #年龄,非空(必填)
 stuID  VARCHAR(18),     #身份证号,18位或15位
 stuSeat INT,    #座位号
 stuClass VARCHAR(20)
);

修改表结构:

/* 
   记特殊的:
   alter table 表名 ADD 列名 类型 [约束]
   alter table 表名 MODIFY 列名 类型 [约束]
   alter table 表名 DROP 列名
*/

添加列:

/*
  语法:alter table 表名 add 列名 类型 [约束];
  语法:alter table <表名> add 列名1 类型1 约束1,add 列名2 类型2 约束2,...;
  语法:alter table <表名> add (列名1 类型1 约束1,add 列名2 类型2 约束2,...);
*/
# 修改学员信息表,添加电话和地址2个字段
ALTER TABLE stuInfo
	ADD (stuTelePhone VARCHAR(13),address VARCHAR(200));
ALTER TABLE stuInfo
	ADD stuTelePhone VARCHAR(13),
	ADD address VARCHAR(200);	
           
# 修改学员信息表,添加性别字段
ALTER TABLE stuInfo ADD sex CHAR(2) DEFAULT '男';
INSERT INTO stuInfo(stuNo,stuName,stuAge) VALUES('s001','张三',18);
INSERT INTO stuInfo(stuNo,stuName,stuAge,sex) VALUES('s002','李四',28,'女');

修改列:

/*
  语法:alter table 表名 modify 列名 类型 [约束];
  语法:alter table <表名> MODIFY 列名1 类型1 约束1,MODIFY 列名2 类型2 约束2,...; 
*/                  
# 修改学员信息表,学员姓名长度为25,添加非空约束
ALTER TABLE stuInfo MODIFY stuName VARCHAR(25) NOT NULL;
# INSERT INTO stuInfo(stuNo,stuAge) VALUES('s001',18);# 报错

# 修改学员信息表,学员年龄默认为20,姓名长度为30
ALTER TABLE stuInfo 
	MODIFY stuAge INT DEFAULT 20,
	MODIFY stuName VARCHAR(30);

删除列:

/*
  语法:alter table 表名 drop 列名;
  语法:alter table 表名 drop 列名1,drop 列名2,...;
*/
# 修改学员信息表,删除电话字段stutel_no
ALTER TABLE stuInfo DROP stuTelePhone;
# 修改学员信息表,删除地址address和座位号字段stuSeat
ALTER TABLE stuInfo DROP stuSeat, DROP address;

修改表名:

# 语法:rename table 旧表名 to 新表名;
RENAME TABLE student1 TO student;  

添加约束:

/*
  语法:ALTER TABLE <表名>
             ADD CONSTRAINT 约束名 约束类型 [具体的约束说明]
*/
# 添加主键约束(stuNo作为主键)
ALTER TABLE stuInfo 
	ADD CONSTRAINT pk_stuInfo_stuNo PRIMARY KEY(stuNo);


# 为stuScore添加主键约束(stuNo作为主键)
ALTER TABLE stuScore 
	ADD CONSTRAINT pk_stuScore_stuNo PRIMARY KEY(stuNo);
# 创建成绩表
CREATE TABLE stuScore(
   stuNo CHAR(6),
   cname VARCHAR(20),
   score FLOAT
);

# 添加唯一约束(身份证号唯一,因为每人的身份证号全国唯一)
ALTER TABLE stuInfo
	ADD CONSTRAINT uq_stuInfo_stuId UNIQUE(stuID);	

# 添加外键约束(主表stuInfo和从表stuScore建立关系,关联字段为stuNo)
# FOREIGN KEY(stu):本表的哪个字段创建外键约束
# REFERENCES stuInfo(stuNo):哪个主表的哪个字段关联
ALTER TABLE stuScore
	ADD CONSTRAINT fk_stuScore_stuNo FOREIGN KEY(stuNo) REFERENCES stuInfo(stuNo);

删除约束:

# 语法:ALTER TABLE 表名 DROP CONSTRAINT 约束名
# alter table stuInfo drop constraint uq_stuInfo_stuId;

查询约束:

SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'stuinfo';
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'stuscore';

表操作语句:

# CREATE(创建)、UPDATE(更新)、READ(读取)、DELETE(删除)
# 重点要掌握的4种SQL:INSERT/UPDATE/DELETE/SELECT(重中之重)

INSERT(插入):

# 语法:
# 一行数据:INSERT INTO <表名>[(列名1,列名2,...] VALUES(值1,值2,...);
# 多行数据:INSERT INTO <表名>[(列名1,列名2,...] VALUES(值1,值2,...)[,(值1,值2,...),...];
/*
  查询数据后插入:INSERT INTO <表名>[(列名1,列名2,...] SELECT 列名1,列名2 from <表名>
    注意:SELECT 后面的列名的个数和类型要与前面的列名的个数与类型要对应,否则报错
*/  
# 第一种:
# 插入的列顺序、个数和类型要与建表的顺序、个数、类型要对应。
INSERT INTO stuInfo VALUES('s003','jack',20,'111','大一','男');
# 第二种:
INSERT INTO stuInfo(stuNo,stuName) VALUES('s004','tom');
# 第三种:多条数据插入
INSERT INTO stuInfo(stuNo,stuName)
	VALUES('s005','tony')
	     ,('s006','mary')
	     ,('s007','jerry')
	     ,('s008','yy');
# 第四种:多条数据插入:主键自增
CREATE TABLE test1(id INT PRIMARY KEY AUTO_INCREMENT,NAME VARCHAR(20));
# 主键自增长,所以插入数据时可以不设置	 
INSERT INTO test1(NAME) VALUES('tony'),('mary'); 
# 根据查询的结果集插入表中
INSERT INTO test1(NAME) SELECT NAME FROM test1; 

UPDATE(更新):

# 语法:
# 更新数据:UPDATE <表名> SET 列名1=值1[,列名2=值2,...] [WHERE 条件表达式];
# UPDATE单列
# 将学号为s001的学生的年级改为大二
UPDATE stuInfo SET stuClass='大二';# 修改所有数据的年级为大二
UPDATE stuInfo SET stuClass='大二' WHERE stuNo='s001';
# UPDATE多列
UPDATE stuInfo SET stuClass='大三',stuId='222' WHERE stuNo='s001';

# DELETE(删除)
# 语法:
# 删除数据:DELETE FROM <表名> [WHERE 条件表达式];
# 删除学号为s008的学生记录
DELETE FROM stuInfo WHERE stuNo='s008';
# 删除姓名为tony或年龄为21岁的学生
DELETE FROM stuInfo WHERE stuName='tony' OR stuAge=21;
# 删除性别为男且年龄为20岁的学生
DELETE FROM stuInfo WHERE sex='男' AND stuAge=20;
# 删除所有的数据
DELETE FROM stuInfo;

SELECT(查询):

/*
   SELECT *|列名1 [AS] 别名1,列名2 [AS] 别名2,... 
   FROM <表名1|视图名1> [AS] 别名1(表),<表名2|视图名2> [AS] 别名2(表),...
   [WHERE 条件表达式]
   [ORDER BY 列名1 [asc/desc],列名2 [asc/desc],...]
   [GROUP BY 列名1,列名2,...]
   [HAVING 条件表达式]
   描述:
     1) SELECT *|列名1 [as] 别名1,列名2 [as] 别名2,...  :表达要查询的数据
             *:表示所有列的数据
             列名1,列名2,...:查询你设置的列的数据
             AS:设置别名,可写可不写
     2) FROM <表名1|视图名1> [AS] 别名1(表),<表名2|视图名2> [AS] 别名2(表),...:
        查询的表名或视图名  
     3) [WHERE 条件表达式]:对查询的数据的过滤
     4) [ORDER BY 列名1 [asc/desc],列名2 [asc/desc],...]:对数据的排序操作
            asc:表示升序,默认值
            desc:表示降序,如果要表示它就必须写
     5) [GROUP BY 列名1,列名2,...]:分组 
     6) [HAVING 条件表达式]:依赖于GROUP BY 存在,对分组后的结果的条件过滤     	
*/

# 查询所有学生信息
SELECT * FROM stuInfo;
# 查询学号为s001的学生信息
SELECT * FROM stuInfo WHERE stuNo='s001'; 
# 查询所有学生的学号和姓名列
SELECT stuNo,stuName FROM stuInfo;
# 如果列名输出时要用别名
# 将stuNo显示为"学号"、stuName显示为"姓 名"
# AS 设置别名
SELECT stuNo AS 学号,stuName 姓名 FROM stuInfo;
#SELECT stuNo AS 学号,stuName 姓 名 FROM stuInfo;#这一种会报错,因为姓名中间有空格,语法错误
SELECT stuNo AS 学号,stuName "姓 名" FROM stuInfo;

# 查询去重后的学生性别
# DISTINCT:去除重复的数据
SELECT sex FROM stuInfo;#8条
SELECT DISTINCT sex FROM stuInfo;#2条

# 查询性别为男或女的学生信息(几种)
SELECT * FROM stuInfo WHERE sex='男' OR sex='女';
# IN:属于  
#    sex只要符合括号内的其中的任意一个值就满足条件
# NOT IN:不属于
SELECT * FROM stuInfo WHERE sex IN ('男','女');
SELECT * FROM stuInfo WHERE sex NOT IN ('男','女');

# 按年龄降序,学号升序
SELECT * FROM stuInfo ORDER BY stuAge DESC,stuNo ASC;
SELECT * FROM stuInfo ORDER BY stuAge DESC,stuNo;

# 将学号和姓名合并后显示
# select stuNo||stuName from stuInfo;

# 查询年龄在20岁一下学生的姓名
SELECT stuName FROM stuInfo WHERE stuAge<20;

# 查询年龄在20岁-30岁之间学生的姓名
SELECT stuName FROM stuInfo WHERE stuAge>=20 AND stuAge<=30;
# between L and H
# L:范围的最小值
# H:范围的最大值
SELECT stuName FROM stuInfo WHERE stuAge BETWEEN 20 AND 30;
# 查询姓张的学生信息
# like:模糊查询
# 有2种通配符:%和?
# %:表示0到多个字符
# ?:表示0到1个字符

SELECT * FROM stuInfo WHERE stuName LIKE 't%';

# 查询姓名中包含"o"的学生信息
SELECT * FROM stuInfo WHERE stuName LIKE '%o%';

# limit 关键字 做分页
# limit n 取n条数据 1 ~ n
# limit n[,m] n是从第几条记录开始取(注意:行号从0开始),m表示取几条记录
SELECT * FROM stuInfo LIMIT 5,10;    #返回第6-15行数据 
SELECT * FROM stuInfo LIMIT 5;      #返回前5行 
SELECT * FROM stuInfo LIMIT 0,5;    #返回前5行
# 查询学生年龄最大的3名学生信息

# 统计学生表中的总人数
# 求某门课程的总分、最高分、最低分、平均分
# 统计每个学生的平均成绩

# 子查询
# 查询与张三在同一个班级的学生
         
# 查询学生成绩大于80分的学生姓名
              
# 左外连接:左表有的数据全都显示,右表如果数据不存在则显示 null
# 查询学生表的学号、姓名、成绩

# 右外连接:右表有的数据全都显示,左表如果数据不存在则显示 null  
# 查询学生表的学号、姓名、成绩 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值