MySQL实操

MySQL实操

数据库操作语法

查看数据库版本

1)没有连接到MySQL服务器,就想查看MySQL的版本。打开cmd,切换至mysql的bin目录,运行下面的命令即可:mysql -V 或 mysqladmin --version 或 mysql --help|find "Distrib"
2)如果已经连接到了MySQL服务器,则运行下面的命令:select version() 或 status 或 \s
3)在命令行连接上MySQL服务器时,其实就已经显示了MySQL的版本,如:mysql -uroot -padmins

查看数据库信息

1)使用 show databases 展示所有数据库;
2)使用 use+数据库名称 进入或改变当前使用的数据库;
3)使用 show+数据库名称 展示该数据库下的所有表;
4)查看表结构的方法:
登录mysql,执行:
desc+表名 或 describe+表名 或 show columns from 表名 或 explain+表名;
使用mysql的工具mysqlshow.exe:
mysql+数据库名称+表名

设置数据库最大连接数

在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to mysql server. Too many connections”-mysql 1040错误,这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认是100, 最大可以达到16384。

常用的有两种方式修改最大连接数:
1)命令行修改
这种方式有个问题,就是设置的最大连接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。因为mysql启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改。

-- 命令行登录MySQL
mysql -uuser -ppassword
-- 查可以看当前的最大连接数
show variables like 'max_connections'
-- 设置最大连接数为1000,可以再次查看是否设置成功
set global max_connections=1000
-- 退出
exit

2)修改配置文件
这种方式说来很简单,只要修改MySQL配置文件my.ini或my.cnf的参数max_connections,将其改为max_connections=1000,然后重启MySQL即可。但是有一点最难的就是my.ini这个文件在哪找。通常有两种可能,一个是在安装目录下(这是比较理想的情况),另一种是在数据文件的目录下,安装的时候如果没有人为改变目录的话,一般就在C:/ProgramData/MySQL往下的目录下。

修改数据库密码

1)mysql初始密码为空,默认端口3306,默认最大连接数为100,修改密码方式:在DOS下进入目录mysql\bin,然后键入以下命令:mysqladmin -u用户名 -p旧密码 password 新密码,如: mysqladmin -u root -p ab12 password djg345
2)命令行修改root密码:
mysql> UPDATE mysql.user SET password=PASSWORD(’新密码’) WHERE User=’root’;
mysql> FLUSH PRIVILEGES;
显示当前的user:
mysql> SELECT USER();

导入导出与备份

导出单表内容:mysqldump -uroot -padmins 数据库名 表名 > database_dump.sql
导出数据库:mysqldump -uroot -padmins 数据库名 > database.sql
导入脚本:mysql -uroot -padmins 数据库名 < database_dump.sql

另外可以使用图形化界面Navicat进行导出导入:
1)右击可以选择导出导入全部数据
2)先执行查询语句找到数据,然后上面应该会有导出结果的按钮,并且可以选择导出文件的格式

数据库增删改

创建数据库:CREATE DATABASE item_mysql;
删除数据库:DROP DATABASE item_mysql;
修改数据库名称:创建新的数据库,导入之前数据库数据结构和数据

数据库表操作语法

数据库表创建语句

-- 创建数据库表:学生表
-- 如果存在则删除表
DROP TABLE IF EXISTS stu_info;
-- 创建表结构
CREATE TABLE stu_info (
    -- 主键自增
    -- NOT NULL: 非空约束,用于控制字段的内容一定不能为空(NULL)。
    sNo int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
    sName varchar(20) NOT NULL,
    sAge int(11) NOT NULL,
    -- mysql不支持检查约束,但是写上检查约束不会报错
	-- CHECK: 检查约束,用于控制字段的值范围。
    check(sAge between 15 and 20),
    -- 18位数字,小数位数为0(身份证),默认为空
    sId decimal(18,0) DEFAULT NULL,
    -- 设置当前日期为该字段默认值
    sDate timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    sAddress text,
    -- 设置主键
    -- PRIMARY KEY: 主键约束,也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
    PRIMARY KEY (sNo),
    -- UNIQUE: 唯一约束,控件字段内容不能重复,一个表允许有多个Unique约束。
    UNIQUE KEY sId (sId)
)

-- 创建数据库表:老师表
DROP TABLE IF EXISTS tch_info;
CREATE TABLE tch_info (
    tNo int(11) NOT NULL AUTO_INCREMENT,
    tName varchar(20) NOT NULL,
    tStuNo int(11) DEFAULT NULL,
    PRIMARY KEY (tNo),
    -- 设置外建
    -- FOREIGN KEY: 外键约束,用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
    FOREIGN KEY (tStuNo) REFERENCES stu_info (sNo)
)

-- 创建临时表
CREATE TEMPORARY TABLE stu_info_temp SELECT * FROM stu_info;
-- 设置数量
CREATE TEMPORARY TABLE stu_info_temp AS(SELECT *  FROM stu_info LIMIT 0,10000);

-- 备份表
create table copytable select * from stu_info;

数据库表新增语句

-- 新增一列
alter table stu_info add column stucard varchar(20) not null after sAddress;
alter table stu_info add column sexenum enum('男','女','未知') after stucard;

-- 添加数据,如果主键自增可以不写
insert into stu_info(sName,sAge,sID,sAddress) values('juluy',18,'360724155815457542','江西');
insert into stu_info(sName,sAge,sID,sAddress) values('judy',20,'360724155815457523','珠海');
insert into stu_info(sName,sAge,sID,sAddress) values('sssk',20,'360724155815457524','珠海');

insert into tch_info(tName,tStuNo) values('sada',1);
insert into tch_info(tName,tStuNo) values('jsdg',2);

数据库表删除语句

-- 删除表,删除时要先将有外建的表删除
drop table tch_info;
drop table stu_info;

-- 删除数据
delete from tch_info where tName='xdzy'

-- 清空表(自增ID从头开始)
truncate table tch_info

-- 如果存在外键约束是无法清空的,可以先禁用外键约束,再清空
-- 查看外键约束状态,0:禁用;1:使用
SELECT @@FOREIGN_KEY_CHECKS;
SET FOREIGN_KEY_CHECKS=0;
SET FOREIGN_KEY_CHECKS=1;

数据库表修改语句

-- 修改数据
update tch_info set tName='xdzy' where tNo=1

数据库表查询语法

基本查询语句

-- 查询部分数据
select sName,sID from stu_info where sNo=1

-- 查询时更改列标题(as,可省略)
select sName 姓名,sID 身份证 from stu_info

函数查询语句

-- 查询时删除重复行(可用all或distinct)distinct:只保留一行输出
select distinct(tName) from tch_info

-- count(*/column):返回行数
-- sum(column):返回指定列中唯一值的和
-- max(column):返回指定列或表达式中的数值最大值
-- min(column):返回指定列或表达式中的数值最小值
-- avg(column):返回指定列或表达式中的数值平均值
-- date(Expression): 返回指定表达式代表的日期值

条件查询语句

-- where后面可以有:比较(>,<,=,<>.!>,!<)
-- between、and(可以返回包括开头与结尾的所有数据)
-- 判断是否为列表指定项(in,not in)
-- 空值:null,not null
-- 逻辑:not,and,or
select * from stu_info where sName in('juluy','judy')

-- group by:按字段分组
-- 使用顺序:SELECT、FROM、JOIN、ON、WHERE、GROUP BY、HAVING、UNION、ORDER BY、LIMIT
-- where不能与聚合函数一起使用;having则可以
select sName from stu_info group by sName

-- 模式匹配符:like,not like(可用于char,varchar,text,ntext,datetime,smalldatetime)
-- %可用于缺少的值
select * from stu_info where sName like 'j%'
-- 下划线可代表一个未知的值
select * from stu_info where sName like '_u%'

-- desc:根据字段反排序;asc:根据字段正排序(优先选择前面排序)
-- 但是如果有二个相同字段的数据,则会根据前面先排序,再二者根据后面排序
select sName,sAge,sNo from stu_info order by sAge desc,sNo asc

-- 分页查询
-- 做分页的话,MySql使用Limit,Sql Service使用top,Oracle使用rownum
select * from stu_info limit 5,10; #返回第6-15行数据 
select * from stu_info limit 5; #返回前5行 
select * from stu_info limit 0,5; #返回前5行

-- 查询时限制返回的行数
select top 2 * from stu_info
-- 20 percent*:20%
select top 20 percent * from stu_info
-- 返回tName的前2行
select top 2 tName from stu_info

-- 查询前10条记录
select * from stu_info WHERE ROWNUM<10;

联合查询语句

-- from后面可以指定256个表或视图(可以为表取个别名)
-- 将2表的有关联的数据合并之后返回
select * from stu_info as a,tch_info as b where a.sNo=b.tStuNo;
select * from stu_info where sNo in(select tStuNo from tch_info where tNo=3);

-- inner join:内连接,没有匹配不返回
select a.sName,b.tName from stu_info a inner join tch_info b on stu_info.sNo=tch_info.tStuNo

-- left join:左连接,返回左边所有数据,没有匹配则对应为null
-- right join:右连接,full join:全连接
select a.sName,b.tName from stu_info a left join tch_info b on stu_info.sNo=tch_info.tStuNo

-- union:具有相似数据类型的2张表合并;union all:即使数据重复也会列出
-- 效率UNION高于UNION ALL
select tName from tch_info union select tName from tch_info

复杂查询语句

1、班级表、学生表、专业表、成绩表多表关联查询

-- 班级信息表
create table class_info(
	c_id int primary key auto_increment not null,
	c_name varchar(20) not null
);
insert into class_info(c_name) values('ST01'),('ST02'),('ST03');
select * from class_info;

-- 学生信息表
create table stu_info(
	s_id int primary key auto_increment,
	s_name varchar(50) not null,
	s_age int not null,
	s_sex int not null,
	s_origin varchar(50),
	s_tel varchar(100),
	c_id int,
	foreign key(c_id) references class_info(c_id)
);
insert into stu_info(s_name,s_age,s_sex,s_origin,s_tel,c_id) 
values('stu1',19,0,'广东珠海','13543090987',1),
('stu2',20,1,'广东广州','13543090987',1),
('stu3',18,0,'江西赣州','13543093245',2),
('stu4',21,1,'江西赣州','15890456789',2),
('stu5',20,0,'广东深圳','18769446565',3),
('stu6',19,1,'广东阳江','15908675453',3),
('stu7',20,0,'广东茂名','13554679546',null);
select * from stu_info;

-- 专业信息表
create table subject_info(
	sub_id int primary key auto_increment,
	sub_name varchar(20) not null
);
insert into subject_info(sub_name) 
values('JAVA'),('.Net'),('PHP'),('UI');
select * from subject_info;

-- 成绩表
create table score_info(
	sc_id int primary key auto_increment,
	score float not null,
	s_id int,
	sub_id int,
	foreign key (s_id) references stu_info(s_id),
	foreign key (sub_id) REFERENCES subject_info(sub_id)
);
insert into score_info(score,s_id,sub_id) 
values(50,1,1),(70,1,4),(65,2,1),(62,2,2),
(75,3,2),(80,3,3),(72,4,1),(55,4,2),(60,5,2),
(83,5,4),(92,6,2),(65,6,3),(65,7,1),(62,7,2);
select * from score_info;

-- 1)拷贝学生信息表数据到学生信息备份表中(stu_bak_info)
create table stu_bak_info select * from stu_info; 

-- 2)查询所有学生信息包含学生所在的班级
-- 这个不能将空的查询出来
select * from stu_info s,class_info c where s.c_id=c.c_id
-- 这个能将空值查询出来
select s.s_name,s.s_age,s_sex,s.s_origin,s.s_tel,c.c_name 
from stu_info s left join class_info c on s.c_id = c.c_id;

-- 3)查询年龄在19到21之间的学员信息
select s_name,s_age,s_sex,s_origin,s_tel 
from stu_info where s_age between 19 and 21;

-- 4)查询ST01班所有学生各科成绩
select s.s_name,sub.sub_name,sc.score
from stu_info s left join class_info c on s.c_id = c.c_id 
inner join score_info sc on s.s_id = sc.s_id
inner join subject_info sub on sub.sub_id = sc.sub_id 
where c.c_name = 'ST01';

-- 5)统计各个班级男生和女生的总人数
select c.c_name as 班级,s.s_sex as 性别, count(*) as 总人数 
from class_info c inner join stu_info s on c.c_id = s.c_id
group by c.c_name,s.s_sex order by c.c_name;

-- 6)统计各班级各科目的平均分
select c.c_name as 班级, sub.sub_name as 科目, avg(score) as 平均分
from class_info c left join stu_info s on c.c_id = s.c_id
inner join score_info sc on s.s_id = sc.s_id 
inner join subject_info sub on sc.sub_id = sub.sub_id 
group by c.c_name,sub.sub_name;

-- 7)查询所有科目的平均分最高的值
select sub.sub_name, avg(sc.score) as avg_score 
from stu_info s left join score_info sc on s.s_id = sc.s_id 
inner join subject_info sub on sc.sub_id = sub.sub_id 
group by sub.sub_name
having avg_score >=all(select avg(sc.score) as avg_score 
from stu_info s left join score_info sc 
on s.s_id = sc.s_id inner join subject_info sub 
on sc.sub_id = sub.sub_id group by sub_name);

-- 8)分页查询学生信息表
select * from stu_info s limit 0,3;

-- 9)每页显示3条,共7条记录,共多少页?
select 7/3 from dual;

2、课程表、成绩表、学生表、教师表多表关联查询

-- 课程表
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `c` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) DEFAULT NULL,
  `t` int(11) DEFAULT NULL,
  PRIMARY KEY (`c`),
  KEY `t` (`t`),
  CONSTRAINT `course_ibfk_1` FOREIGN KEY (`t`) REFERENCES `teacher` (`t`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- 新增数据
INSERT INTO `course` VALUES ('1', '语文', '1');
INSERT INTO `course` VALUES ('2', '数学', '2');
INSERT INTO `course` VALUES ('3', '英语', '3');
INSERT INTO `course` VALUES ('4', '物理', '4');

-- 成绩表
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
  `s` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL,
  KEY `s` (`s`),
  KEY `c` (`c`),
  CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`s`) REFERENCES `student` (`s`),
  CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`c`) REFERENCES `course` (`c`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 新增数据
INSERT INTO `sc` VALUES ('1', '1', '56');
INSERT INTO `sc` VALUES ('1', '2', '78');
INSERT INTO `sc` VALUES ('1', '3', '67');
INSERT INTO `sc` VALUES ('1', '4', '58');
INSERT INTO `sc` VALUES ('2', '1', '79');
INSERT INTO `sc` VALUES ('2', '2', '81');
INSERT INTO `sc` VALUES ('2', '3', '92');
INSERT INTO `sc` VALUES ('2', '4', '68');
INSERT INTO `sc` VALUES ('3', '1', '91');
INSERT INTO `sc` VALUES ('3', '2', '47');
INSERT INTO `sc` VALUES ('3', '3', '88');
INSERT INTO `sc` VALUES ('3', '4', '56');
INSERT INTO `sc` VALUES ('4', '2', '88');
INSERT INTO `sc` VALUES ('4', '3', '90');
INSERT INTO `sc` VALUES ('4', '4', '93');
INSERT INTO `sc` VALUES ('5', '1', '46');
INSERT INTO `sc` VALUES ('5', '3', '78');
INSERT INTO `sc` VALUES ('5', '4', '53');
INSERT INTO `sc` VALUES ('6', '1', '35');
INSERT INTO `sc` VALUES ('6', '2', '68');
INSERT INTO `sc` VALUES ('6', '4', '71');

-- 学生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `s` int(11) NOT NULL AUTO_INCREMENT,
  `sname` varchar(32) DEFAULT NULL,
  `sage` int(11) DEFAULT NULL,
  `ssex` varchar(8) DEFAULT NULL,
  PRIMARY KEY (`s`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- 新增数据
INSERT INTO `student` VALUES ('1', '刘一', '18', '男');
INSERT INTO `student` VALUES ('2', '钱二', '19', '女');
INSERT INTO `student` VALUES ('3', '张三', '17', '男');
INSERT INTO `student` VALUES ('4', '李四', '18', '女');
INSERT INTO `student` VALUES ('5', '王五', '17', '男');
INSERT INTO `student` VALUES ('6', '赵六', '19', '女');

-- 教师表
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `t` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`t`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- 新增数据
INSERT INTO `teacher` VALUES ('1', '叶平');
INSERT INTO `teacher` VALUES ('2', '贺高');
INSERT INTO `teacher` VALUES ('3', '杨艳');
INSERT INTO `teacher` VALUES ('4', '周磊');

-- 1)查询“001”课程比“002”课程成绩高的所有学生的学号
select a.s from (select s,score from sc where c='001') a,
(select s,score from sc where c='002') b 
where a.score>b.score and a.s=b.s

-- 2)查询平均成绩大于60分的同学的学号和平均成绩
select s,avg(score) from sc
group by s having avg(score)>60

-- 3)查询所有同学的学号、姓名、选课数、总成绩
select s.s,s.sname,count(sc.c),sum(score) from student s left join sc on s.s=sc.s
group by s.s,sname

-- 4)查询姓“李”的老师的个数
-- distinct:忽略重复值
select count(distinct(tname)) num from teacher
where tname like '叶%'

-- 5)查询没学过“叶平”老师课的同学的学号、姓名
select student.s,student.sname from student where s not in
(select distinct(sc.s) from sc,course,teacher 
where sc.c=course.c and teacher.t=course.t and teacher.tname='叶平')

-- 6)查询学过“001”并且也学过编号“002”课程的同学的学号、姓名
select student.s,student.sname from student,sc where student.s=sc.s and sc.c='001'
and exists(select * from sc sc2 where sc.s=sc2.s and sc2.c='002')

-- 7)查询学过“叶平”老师所教的所有课的同学的学号、姓名
select s,sname from student
where s in (select s from sc,course,teacher 
where sc.c=course.c and teacher.t=course.t and teacher.tname='叶平'
group by s having count(sc.c)=
(select count(c) from course,teacher where teacher.t=course.t and tname='叶平'))

-- 8)查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名
select s,sname from (select student.s,student.sname,score,
(select score from sc sc2 where sc2.s=student.s and sc2.c='002') score2
from student,sc where student.s=sc.s and c='001') s2 where score2<score
posted @ 2018-09-10 09:27  肖德子裕  阅读(295)  评论(0编辑  收藏  举报