本文目录:
一、针对数据库database和表table的操作... 1
Day11
SQL语句
sql语句,一种用于操作数据库的语言
数据库, 简单地理解为硬盘上的文件, 可以存放数据
sql 语句大致可以分类两大类
进入数据库的方法:
1. 命令行代码:
进入数据库C:\mysql -hlocalhost -P3306 -uroot -p123456
启动数据库 net start mysql
停止数据库net stop mysql
一、针对数据库database和表table的操作
1、database和table的常见操作
创建create
查看show
修改alter
删除drop
// 创建一个数据库
create database mydb;
// 查看所有的数据库库
show databases;
// 删除 mydb
drop database mydb;
// 删除 user 表
drop table user;
针对表中的记录的操作
增 insert
删 delete
改 update
查 select
2 操作数据库
创建一个名称为mydb1的数据库
create database mydb1;
创建一个使用utf-8字符集的mydb2数据库。
create database mydb2 character set utf8;
创建一个使用utf-8字符集,并带校对规则的mydb3数据库。
create database mydb3 character set utf8 collate utf8_general_ci;
查看当前数据库服务器中的所有数据库
show databases;
查看前面创建的mydb2数据库的定义信息,字符信息
show create database mydb2;
删除前面创建的mydb3数据库
drop database mydb3;
将mydb2的字符集修改为gbk
alter database mydb2 character set gbk;
// 备份数据库
use mydb2;
create table a
(
name varchar(20)
);
// 插入数据
insert into a (name) values("zhangsan");
insert into a (name) values("wangwu");
// 备份数据库
mysqldump -uroot -proot mydb1 > d:\a.sql
这条命令跟mysql是一个级别的,所以不能在mysql下面使用。
// 删除 mydb2
drop database mydb2;
// 恢复数据库
create database mydb22;
source d:\a.sql
// source 命令
指定一个sql脚本
关闭报错声音
Mysql –uroot –p123456 -b
3、操作表
1. 创建表
创建员工表
Id 整形
name 字符型
sex 字符型或bit型
brithday 日期型
Entry_date 日期型
job 字符型
Salary 小数型
resume 大文本型
创建表:
create table employee
(
id int,
name varchar(20),
gender varchar(6),
brithday date,
entry_date date,
job varchar(20),
salary double,
reshme text
);
2. 修改表
在上面员工表的基础上增加一个image列
alter table employee add image blob;
修改job列,使其长度为60
alter table employee modify job varchar(60);
删除sex列。
alter table employee drop sex;
表名改为users。
rename table employee to user;
修改表的字符集为utf-8
alter table user character set utf8;
列名name修改为username
alter table user change column name username varchar(20);
查看所有表
show tables;
查看表的创建语句
show create table user;
查看表结构
desc user;
删除 user 表
drop table user;
4、针对表中数据的增删改查
针对表中的数据操作无外乎四个:增删改查 crud create
1. insert语句
create table employee
(
id int,
name varchar(20),
sex varchar(10),
birthday date,
salary float,
entry_date date,
resume text
);
// 向员工表插入三条记录
Insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(1,\'zhangsan\',\'male\',\'1987-11-23\',1500,\'2010-2-18\',\'good boy\');
insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(2,\'wangwu\',\'male\',\'1988-11-23\',1200,\'2010-2-18\',\'good boy\');
insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(3,\'xiaohong\',\'female\',\'1983-11-23\',1800,\'2010-2-18\',\'good girl\');
insert into employee(id,name,sex,birthday,salary,entry_date,resume) values(4,\'赵楠\',\'男\',\'1986-11-23\',3800,\'2011-2-18\',\'绝种好男人\');
// 查看表的所有记录
select * from employee;
// 查看数据使用的所有编码
show variables like \'character%\';
// 修改客户端的编码 为 gbk
set character_set_client=gbk;
// 修改结果集的编码为gbk
set character_set_results=gbk;
// insert 语句的其他写法
create table a
(
username varchar(20),
password varchar(20)
);
insert into a values(\'zs\',\'111\');
insert into a values(\'wangwu\',\'2222\'),(\'lisi\',\'3333\');
insert a values(\'aaa\',\'bbb\');
insert a (username) values(\'aaa\');
2. update语句
将所有员工薪水修改为5000元
update employee set salary=5000;
将姓名为’zhangsan’的员工薪水修改为3000元。
update employee set salary=3000 where name=\'zhangsan\';
将姓名为’lisi’的员工薪水修改为4000元,sex改为female。
update employee set salary=4000,sex=\'female\' where name=\'wangwu\';
将xiaohong的薪水在原有基础上增加1000元
update employee set salary=salary+1000 where name=\'xiaohong\';
3. delete语句
删除表中name为’赵楠’的记录。
delete from employee where name=\'赵楠\';
删除表中所有记录。Delete是一条条的删,如果条目很多的话,会效率很低
delete from employee;
使用truncate删除表中记录。 摧毁表再创建表 尽量用这个
truncate employee;
4. select语句
student.sql
create table student(
id int,
name varchar(20),
chinese float,
english float,
math float
);
insert into student(id,name,chinese,english,math) values(1,\'张小明\',89,78,90);
insert into student(id,name,chinese,english,math) values(2,\'李进\',67,53,95);
insert into student(id,name,chinese,english,math) values(3,\'王五\',87,78,77);
insert into student(id,name,chinese,english,math) values(4,\'李一\',88,98,92);
insert into student(id,name,chinese,english,math) values(5,\'李来财\',82,84,67);
insert into student(id,name,chinese,english,math) values(6,\'张进宝\',55,85,45);
insert into student(id,name,chinese,english,math) values(7,\'黄蓉\',75,65,30);
查询表中所有学生的信息。
select * from student;
查询表中所有学生的姓名和对应的英语成绩。
select name,english from student;
过滤表中重复数据。
select distinct english from student;
在所有学生分数上加10分特长分。
select name,english+10,chinese+10,math+10 from student;
统计每个学生的总分。
select name,english+chinese+math as sum from student;
使用别名表示学生分数。
where 子句
查询姓名为李一的学生成绩
select * from student where name=\'李一\';
查询英语成绩大于90分的同学
select * from student where english>90;
查询总分大于200分的所有同学
select name,english+chinese+math sum from student where english+chinese+math>200;
此处可以不用as
运算符
查询英语分数在 80-90之间的同学。
select * from student where english between 65 and 85;
查询数学分数为89,90,91的同学。
select name,math from student where math in(89,90,91);
查询所有姓李的学生成绩。
select * from student where name like \'李%\';
// 查询姓李的两个字的学生
select * from student where name like \'李_\';
查询数学分>80,语文分>80的同学。
select * from student where math>80 and chinese>80;
查询英语>80或者总分>200的同学
select *,chinese+math+english from student where english>80 or chinese+english+math>200;
order by 子句
对数学成绩排序后输出。
select * from student order by math;
对总分排序后输出,然后再按从高到低的顺序输出
select *,chinese+math+english from student order by chinese+math+english desc;
对姓李的学生成绩排序输出 order从句是需要放在where从句的后面
select *,chinese+math+english from student where name like \'李%\' order by chinese+math+english;
合计函数
count
统计一个班级共有多少学生?
select count(*) from student;
统计数学成绩大于90的学生有多少个?
select count(*) from student where math>90;
统计总分大于230的人数有多少?
select count(*) from student where chinese+math+english>230;
sum
统计一个班级数学总成绩?
select sum(math) from student;
统计一个班级语文、英语、数学各科的总成绩
select sum(math),sum(chinese),sum(english) from student;
统计一个班级语文、英语、数学的成绩总和
select sum(math+chinese+english) from student;
统计一个班级语文成绩平均分
select sum(chinese)/count(*) from student;
缺考的不参与计算
select sum(chinese)/count(chinese) from student;
avg
语文平均分
select avg(chinese) from student;
max/min
语文最 高分
select max(chinese) from student;
select语句(6)
group by
订单表
create table orders(
id int,
product varchar(20),
price float
);
insert into orders(id,product,price) values(1,\'电视\',900);
insert into orders(id,product,price) values(2,\'洗衣机\',100);
insert into orders(id,product,price) values(3,\'洗衣粉\',90);
insert into orders(id,product,price) values(4,\'桔子\',9);
insert into orders(id,product,price) values(5,\'洗衣粉\',90);
将商品归类
select * from orders group by product;
显示单类商品总结
select *,sum(price) from orders group by product;
商品分类 显示单类商品总价大于100的
select *,sum(price) from orders group by product having sum(price)>100;
// 将单价大于20 的商品进行归类显示 按照价格排序
select * from orders where price>20 group by product order by price;
5、表的约束
表的约束就是在定义表时,我们可以在创建表的同时为字段增加约束,对将来插入的数据做一些限定
一、表的约束
表的约束就是在定义表时,为表中的字段加一些约束条件,对将来插入的数据做一些限定
1. 唯一约束 unique
create table a
(
id int,
username varchar(20) unique,
password varchar(20)
);
insert into a (id,username,password) values(1,\'zhangsan\',\'1111\');
insert into a (id,username,password) values(2,\'wangwu\',\'1111\');
2. 非空约束 not null
create table b
(
id int not null,
name varchar(20)
);
insert into b (id,name) values (1,\'aaaa\');
insert into b (id,name) values (1,\'bbbb\');
3. 主键约束 相当于 唯一约束+非空约束
数据库中的每张表都应该至少有一个主键,通常是id
create table c
(
id int primary key,
name varchar(20)
);
insert into c(id,name) values (1,\'aaaa\');
insert into c(id,name) values (2,\'bbbb\');
create table d
(
firstname varchar(20),
lastname varchar(20),
primary key(firstname, lastname)
);
insert into d (firstname, lastname) values (\'tom\', \'cat\');
insert into d (firstname, lastname) values (\'tom\', \'hks\');
create table e
(
id int ,
name varchar(20)
);
insert into e (id,name) values(1,\'aaa\');
为表加上主键约束
alter table e add primary key(id);
此处修改的命令:
修改job列,使其长度为60。
alter table employee modify job varchar(60);
删除主键约束
alter table e drop primary key;
4. 定义主键自动增长
这个的作用就是让id键随着条目的增加,自动往上增长。
注意主键类型必须是int,只有int类型的才可以自增
create table f
(
id int primary key auto_increment,
name varchar(20)
);
insert into f(name) values (\'aaa\');
insert into f(id,name) values (11,\'bbb\');
mysql> select * from f;
+----+------+
| id | name |
+----+------+
| 1 | aaa |
| 2 | aaa |
| 3 | aaa |
| 4 | aaa |
| 11 | bbb |
| 12 | aaa |
| 13 | aaa |
| 14 | aaa |
| 15 | aaa |
| 16 | aaa |
+----+------+
外键约束
约束力: 插入的外键值必须为被参照列存在的值
被参照表中被参照的数据不允许删除
注意:外键约束并没有非空和唯一的约束力
创建丈夫表和妻子表
create table husband
(
id int primary key auto_increment,
name varchar(20)
);
create table wife
(
id int primary key auto_increment,
name varchar(20),
husbandid int,
constraint husbandid_FK foreign key(husbandid) references husband(id)
);
外界约束:Constraint是定义外键约束的,foreign key是外键的名称 参照某张表的主键
分别添加两条记录
insert into husband(name) values (\'laobi\');
insert into husband(name) values (\'laoyu\');
insert into wife(name,husbandid) values (\'fengjie\',2);
insert into wife(name,husbandid) values (\'furongjie\',1);
fengjie 找老公
select * from husband where id=(select husbandid from wife where name=\'fengjie\');
delete from husband where name=\'laoyu\';
6 表的关系
1 多对一
创建部门表
create table department
(
id int primary key auto_increment,
name varchar(20)
);
添加三个部门信息
insert into department(name) values(\'开发部\');
insert into department(name) values(\'销售部\');
insert into department(name) values(\'人事部\');
创建员工表
create table employee
(
id int primary key auto_increment,
name varchar(20),
departmentid int,
constraint departmentid_FK foreign key(departmentid) references department(id)
);
添加六个员工信息
insert into employee(name,departmentid) values (\'张三\',1);
insert into employee(name,departmentid) values (\'李四\',1);
insert into employee(name,departmentid) values (\'王五\',2);
insert into employee(name,departmentid) values (\'赵六\',3);
insert into employee(name,departmentid) values (\'田七\',3);
insert into employee(name,departmentid) values (\'周八\',null);
多表的查询
查出1号部门所有的员工
select * from employee where departmentid=1;
查出开发部所有的员工
select * from employee where departmentid=(select id from department where name=\'开发部\');
查出赵六在那个部门
select * from department where id=(select departmentid from employee where name=\'赵六\');
--------------------------------------
联合查询
查出开发部所有的员工
select * from department,employee;
+----+--------+----+------+--------------+
| id | name | id | name | departmentid |
+----+--------+----+------+--------------+
| 1 | 开发部 | 1 | 张三 | 1 |
| 2 | 销售部 | 1 | 张三 | 1 |
| 3 | 人事部 | 1 | 张三 | 1 |
| 1 | 开发部 | 2 | 李四 | 1 |
| 2 | 销售部 | 2 | 李四 | 1 |
| 3 | 人事部 | 2 | 李四 | 1 |
| 1 | 开发部 | 3 | 王五 | 2 |
| 2 | 销售部 | 3 | 王五 | 2 |
| 3 | 人事部 | 3 | 王五 | 2 |
| 1 | 开发部 | 4 | 赵六 | 3 |
| 2 | 销售部 | 4 | 赵六 | 3 |
| 3 | 人事部 | 4 | 赵六 | 3 |
| 1 | 开发部 | 5 | 田七 | 3 |
| 2 | 销售部 | 5 | 田七 | 3 |
| 3 | 人事部 | 5 | 田七 | 3 |
| 1 | 开发部 | 6 | 周八 | NULL |
| 2 | 销售部 | 6 | 周八 | NULL |
| 3 | 人事部 | 6 | 周八 | NULL |
+----+--------+----+------+--------------+
笛卡尔集 多张表的所有记录的排列组合
笛卡尔集当中有很多部匹配的数据(参照表外键列的值和被参照表主键的值不一致) 为了方便 以下称为废数据
加条件去掉废数据
select * from department,employee where employee.departmentid=department.id;
加条件做查询
select * from department,employee where employee.departmentid=department.id and department.name=\'开发部\';
优化 给表加别名 只保留需要的数据
select e.* from department d,employee e where e.departmentid=d.id and d.name=\'开发部\';
查出赵六在那个部门
select d.* from department d,employee e where e.departmentid=d.id and e.name=\'赵六\';
2. 多对多
创建老师表
create table teacher
(
id int primary key auto_increment,
name varchar(20)
);
添加三个老师
insert into teacher(name) values (\'老方\'),(\'老余\'),(\'老毕\');
create table student
(
id int primary key auto_increment,
name varchar(20)
);
添加三个学生
insert into student(name) values(\'大毛\'),(\'二毛\'),(\'三毛\'),(\'四毛\'),(\'五毛\'),(\'六毛\'),(\'七毛\'),(\'八毛\'),(\'小毛\');
创建中间表描述关系
create table tea_stu
(
teaid int,
stuid int,
primary key(teaid,stuid),
constraint teaid_FK foreign key(teaid) references teacher(id),
constraint stuid_FK foreign key(stuid) references student(id)
);
添加数据
insert into tea_stu (teaid,stuid) values (1,1),(1,2),(1,4),(1,5),(1,6),(1,8),(2,1),(2,3),(2,5),(2,7),(2,9),(3,2),(3,3),(3,4),
(3,5),(3,6),(3,7),(3,8);
查询2号老师教过的学生
select s.* from student s,tea_stu ts where ts.stuid=s.id and ts.teaid=2;
查询老余教过的所有的学生
select s.* from student s,tea_stu ts,teacher t where ts.stuid=s.id and ts.teaid=t.id and t.name=\'老余\';
多表联合查询
查询的结果为笛卡尔集
n张表联合查需要n-1个条件来去掉废数据
去掉废数据的条件 参照表的外键列=被参照表的主键列
再加上查询条件即可得到结果
3. 一对一
create table person
(
id int primary key auto_increment,
name varchar(20)
);
create table idcard
(
id int primary key,
location varchar(20),
constraint personid_FK foreign key(id) references person(id)
);
insert into person (name) values(\'zhangsan\');
insert into person (name) values(\'lisi\');
insert into idcard (id,location) values(2,\'天津\');
insert into idcard (id,location) values(1,\'上海\');
查李四的身份证
select idcard.* from person,idcard where idcard.id=person.id and person.name=\'lisi\';
附件:mysql安装图解