mysql 常用语句

来源:互联网 发布:中文分词python 编辑:程序博客网 时间:2024/06/10 01:09

------- android培训、java培训、期待与您交流! ----------

 

sql语句
用于操作数据库的语句

 


一、针对数据库和表的操作
数据库 database     表  table
创建  create
删除  drop
修改  alter
查看  show

// 创建库
create database aaa;

// 删除库
drop database aaa;

创建一个名称为mydb1的数据库。
create database mydb1;
查看所有的数据库
show databases;
创建一个使用utf-8字符集的mydb2数据库。
create database mydb2 character set utf8;
查看数据库的创建语句(查看定义信息)
show create database mydb2;
创建一个使用utf-8字符集,并带校对规则的mydb3数据库。
create database mydb3 character set utf8 collate utf8_general_ci;
删除前面创建的mydb3数据库
drop database mydb3;
将mydb2的字符集修改为gbk
alter database mydb2 character set gbk;


备份和恢复数据库

准备工作
在mydb1库中创建一个a表 插入一点数据
使用mydb1
use mydb1;
创建表
create table a
(
  name varchar(20)
);
向表中插入两条数据
insert into a (name) values('aaa');
insert into a (name) values('bbb');
查询表中的数据
select * from a;

备份数据库
mysqldump -uroot -proot mydb1 > d:\a.sql

恢复数据库
数据库是不能恢复的  恢复的只是数据库中的数据

创建库
create database mydb1;
使用库
use mydb1;
恢复数据
source d:\a.sql

表的操作
创建一个员工表
字段 属性
Id 整形
name 字符型
gender 字符型或bit型
brithday 日期型
Entry_date 日期型
job 字符型
Salary 小数型
resume 大文本型

create table employee
(
  id int not null,
  name varchar(20),
  gender varchar(6),
  birthday date,
  entry_date date,
  job varchar(60),
  salary float,
  resume text
);

查看库中所有的表
show tables;
查看表的定义语句
show create table employee;
查看表的结构
desc employee;
在上面员工表的基础上增加一个image列
alter table employee add image blob;
修改job列,使其长度为100。
alter table employee modify job varchar(100);
删除gender列。
alter table employee drop gender;
表名改为users。
rename table employee to users;
修改表的字符集为gbk
alter table users character set gbk;
列名name修改为username
alter table users change name username varchar(20);

二、对表中数据的操作
对数据的操作分为四个方面: 增删改查  crud
添加: insert
删除: delete
更新:  update
查询: select

1. insert 语句 添加数据
create table employee
(
 id int,
 name varchar(20),
 gender varchar(10),
 birthday date,
 salary float,
 entry_date date,
 resume text
);
向员工表插入三条数据
insert into employee (id,name,gender,birthday,salary,resume) values(1,'zhangsan','male','1980-11-22',1000,'good boy');
insert into employee (id,name,gender,birthday,salary,resume) values(2,'wangwu','male','1982-6-22',1000,'good boy');
insert into employee (id,name,gender,birthday,salary,resume) values(3,'xiaohong','female','1992-4-15',1000,'good girl');

// 查看表中所有的记录
select * from employee;

插入一条带中文的
insert into employee (id,name,gender,birthday,salary,resume) values(4,'小芳','female','1992-4-15',2000,'一个好女孩');

查看数据库的编码
show variables like 'character%';

修改客户端编码为 gbk   原因是dos命令行窗口使用系统默认字符集 gbk
set character_set_client=gbk;

修改结果集的编码
set character_set_results=gbk;

查看文档   了解 insert 语句
insert employee (id,name,birthday,gender,salary,resume) values(5,'lisi','1980-11-22','male',1000,'good boy');

insert employee (id,name) values(6,'zhaoliu'),(7,'zhangbozhi');

2. update 语句
将所有员工薪水修改为5000元
update employee set salary=5000;
将姓名为’zhangsan’的员工薪水修改为3000元。
update employee set salary=3000 where name='zhangsan';
将姓名为’lisi’的员工薪水修改为4000元,gender改为female。
update employee set salary=4000,gender='female' where name='lisi';
将xiaohong的薪水在原有基础上增加1000元。
update employee set salary=salary+1000 where name='xiaohong';

3. delete 语句
删除表中name为’zhangsan’的记录。
delete from employee where name='zhangsan';
删除表中所有记录。
delete from employee;
使用truncate删除表中记录。  先摧毁表 再创建表  相当于删除所有的记录   但是效率高
truncate employee;


4. select 语句  查询表中的数据

查询表中所有学生的信息
select * from student;
查询表中所有学生的姓名和对应的英语成绩
select name,english from student;
过滤表中重复数据
select distinct english from student;

在所有学生分数上加10分特长分
select name,english+10 as english,chinese+10 as chinese,math+10 as math from student;
统计每个学生的总分
select name,english+chinese+math as sum from student;
使用别名表示学生分数
select name,english e from student;

where 子句
查询姓名为李一的学生成绩
select * from student where name='李一';
查询英语成绩大于80分的同学
select * from student where english>80;
查询总分大于200分的所有同学
select name,english+chinese+math sum from student where english+chinese+math>200;
查询英语分数在 80-90之间的同学
select * from student where english between 80 and 90;
查询数学分数为89,90,91的同学
select * 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 name,english,english+chinese+math sum from student where english>80 or english+chinese+math>200;

order by 子句
对数学成绩排序后输出
select * from student order by math;
对总分排序后输出,然后再按从高到低的顺序输出  降序
select *,english+chinese+math sum from student order by english+chinese+math desc;
对姓李的学生成绩排序输出   order by 子句要位于where 后面
select *,english+chinese+math sum from student where name like '李%' order by english+chinese+math;

合计函数-count  统计记录数
统计一个班级共有多少学生
select count(*) from student;
统计数学成绩大于90的学生有多少个
select count(*) from student where math>80;
统计总分大于220的人数有多少

合计函数-SUM
统计一个班级数学总成绩
select sum(math) from student;
统计一个班级语文、英语、数学各科的总成绩
select sum(math),sum(chinese),sum(english) from student;
统计一个班级语文、英语、数学的成绩总和
select sum(english+chinese+math) from student;
统计一个班级语文成绩平均分
select sum(chinese)/count(*) from student;
select sum(chinese)/count(chinese) from student;

合计函数-AVG
求一个班级数学平均分
select avg(math) from student;

合计函数-MAX/MIN
select max(math) from student;


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 id,product,sum(price) price from orders group by product;
查询分组总价大于100的
select id,product,sum(price) price from orders group by product having sum(price)>100;

三、表的约束
约束:为了防止对表的误操作,我们需要对表的操作进行一些约束   约束都是加在列上  用于限定某一列数据的存储方式
比如不允许在表的某一列上插入重复的值,就可以加唯一约束
比如某一列上不允许出现null值 就可以加非空约束

定义唯一约束unique
create table a
(
  name varchar(20) unique,
  pass varchar(20)
);

insert into a (name,pass) values('zhangsan','123');
insert into a (name,pass) values('wangwu','123');

定义非空约束not null
create table b
(
  name varchar(20) not null,
  pass varchar(20)
);
insert into b (name,pass) values('zhangsan','123');
insert into b (name) values('zhangsan');

通常来讲 数据库的每张表都有一个id字段,用于标示一条记录
id需要具备唯一性  需要非空
id通常会作为主键列   因为加上主键约束primary key  主键约束=非空约束+唯一约束
create table c
(
  id int primary key,
  name varchar(20)
);

删除主键约束
alter table c drop primary key;


insert into c(id,name) values(1,'aaaa');
insert into c(id,name) values(2,'bbbb');

增加主键约束
alter table c add primary key(id);

如果id为int型 可以定义为自动增长 auto_increment
create table d
(
  id int primary key auto_increment,
  name varchar(20)
);

insert into d(name) values('aaaa');

外键约束  一张表的一列去参照另一张表的一列,  参照列的数据必须填被参照列有的数据   被参照的记录不允许删除
husband 表
create table husband
(
  id int primary key auto_increment,
  name varchar(20)
);

wife 表
create table wife
(
   id int primary key auto_increment,
   name varchar(20),
   husbandid int
);

insert into husband(name) values('冠希哥');
insert into husband(name) values('犀利哥');

insert into wife(name,husbandid) values('zhangbuzhi',1);
insert into wife(name,husbandid) values('凤姐',2);

凤姐查询自己老公是谁?
select husbandid from wife where name='凤姐';
select * from husband where id=(select husbandid from wife where name='凤姐');

犀利哥要将自己移除
delete from husband where name='犀利哥';

加入外键约束    wife表的husbandid要作为外键  参照 husband 表的 id
create table wife
(
   id int primary key auto_increment,
   name varchar(20),
   husbandid int,
   constraint husbandid_FK foreign key(husbandid) references husband(id)
);

四、表的关系

多表操作
多对一
部门表
create table department
(
  id int primary key auto_increment,
  name varchar(20)
);

员工表 有外键约束
drop table employee;

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 department(name) values('开发部');
insert into department(name) values('销售部');
insert into department(name) values('人事部');


添加7个员工
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('李四',1);
insert into employee (name,departmentid) values('李五',2);
insert into employee (name,departmentid) values('李六',1);
insert into employee (name) values('李七');

多表查询
查询2号部门所有的员工
select * from employee where departmentid=2;

查询开发部所有的员工
select * from employee where departmentid=(select id from department where name='开发部');

联合查询
select * from employee,department;

笛卡尔集
+----+------+--------------+----+--------+
| id | name | departmentid | id | name   |
+----+------+--------------+----+--------+
|  1 | 李一 |            1 |  1 | 开发部 |
|  1 | 李一 |            1 |  2 | 销售部 |
|  1 | 李一 |            1 |  3 | 人事部 |
|  2 | 李二 |            2 |  1 | 开发部 |
|  2 | 李二 |            2 |  2 | 销售部 |
|  2 | 李二 |            2 |  3 | 人事部 |
|  3 | 李三 |            3 |  1 | 开发部 |
|  3 | 李三 |            3 |  2 | 销售部 |
|  3 | 李三 |            3 |  3 | 人事部 |
|  4 | 李四 |            1 |  1 | 开发部 |
|  4 | 李四 |            1 |  2 | 销售部 |
|  4 | 李四 |            1 |  3 | 人事部 |
|  5 | 李五 |            2 |  1 | 开发部 |
|  5 | 李五 |            2 |  2 | 销售部 |
|  5 | 李五 |            2 |  3 | 人事部 |
|  6 | 李六 |            1 |  1 | 开发部 |
|  6 | 李六 |            1 |  2 | 销售部 |
|  6 | 李六 |            1 |  3 | 人事部 |
|  7 | 李七 |         NULL |  1 | 开发部 |
|  7 | 李七 |         NULL |  2 | 销售部 |
|  7 | 李七 |         NULL |  3 | 人事部 |
+----+------+--------------+----+--------+
21 rows in set (0.00 sec)

笛卡尔集就是多表所有记录的组合
在笛卡尔集中有很多不匹配的项  可以称为废数据
处理笛卡尔集第一步  去掉废数据    参照表的外键列应该和被参照列一致

select * from employee,department where employee.departmentid=department.id;

+----+------+--------------+----+--------+
| id | name | departmentid | id | name   |
+----+------+--------------+----+--------+
|  1 | 李一 |            1 |  1 | 开发部 |
|  4 | 李四 |            1 |  1 | 开发部 |
|  6 | 李六 |            1 |  1 | 开发部 |
|  2 | 李二 |            2 |  2 | 销售部 |
|  5 | 李五 |            2 |  2 | 销售部 |
|  3 | 李三 |            3 |  3 | 人事部 |
+----+------+--------------+----+--------+
6 rows in set (0.00 sec)
没有废数据了  此时应加上条件再查询

select * from employee,department where employee.departmentid=department.id and department.name='开发部';

结果只需要显示查询的表   最好用别名
select e.* from employee e,department d where e.departmentid=d.id and d.name='开发部';


多对多
创建老师表
create table teacher
(
  id int primary key auto_increment,
  name varchar(20)
);
 
创建学生表
create table student
(
  id int primary key auto_increment,
  name varchar(20)
);

中间表
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 teacher (name) values('老方'),('老黎');

插入五个学生
insert into student(name) values('zhangsan'),('xiaohong'),('李四'),('小兰'),('小白');

描述关系
insert into tea_stu (teaid,stuid) values(1,1),(1,2),(1,3),(1,5),(2,1),(2,3),(2,4);
 
多表查询
2号老师教过的学生
select s.* from student s,tea_stu ts where ts.stuid=s.id and ts.teaid=2;

老方教过的学生
select s.* from student s,teacher t,tea_stu ts where ts.teaid=t.id and ts.stuid=s.id and t.name='老方';

n张表联合查询  去掉笛卡尔集中的废数据要n-1个条件   再加上最后的限制性查询条件 就能得到结果

原创粉丝点击