一、操作数据库
1.创建数据库
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
~创建一个名称为mydb1的数据库。
CREATE DATABASE mydb1;
~创建一个使用utf8字符集的mydb2数据库。
create database mydb2 character set utf8;
~创建一个使用utf8字符集,并带校对规则的mydb3数据库。
create database mydb3 character set utf8 collate utf8_bin ;
2.查看数据库
显示数据库语句:查看当前数据库服务器中所有的数据库
SHOW DATABASES
显示数据库创建语句:
SHOW CREATE DATABASE db_name
~查看当前数据库服务器中的所有数据库 show databases;
~查看前面创建的mydb2数据库的定义信息show create database mydb2;
3.删除数据库
DROP DATABASE [IF EXISTS] db_name
~删除前面创建的mydb1数据库 drop database mydb1;
drop database mydb1;
4.修改数据库
ALTER DATABASE [IF NOT EXISTS] db_name [alter_specification [, alter_specification] ...]
alter_specification:
[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
查看服务器中的数据库,并把其中某一个库的字符集修改为gbk;
5.切换数据库
选择数据库:use db_name;
查看所选的数据库: select database();
二、操作表
1.创建表
CREATE TABLE table_name
(
field1 datatype,
field2 datatype,
field3 datatype,
)character set 字符集 collate 校对规则
~创建员工信息表
create table employee(
id int primary key auto_increment,
name varchar(30) unique,
gender bit not null,
birthday date,
entry_date date,
job varchar(255),
salary double,
resume text
);
2.查看表
查看表结构: desc tab_name;
查看表的创建语句: show create table tab_name;
查看当前数据库中的所有表:show tables;
3.修改表
ALTER TABLE table ADD/MODIFY/DROP/character set/change (column datatype [DEFAULT expr] [, column datatype]...);
修改表名:rename table 表名 to 新表名;
~在上面员工表的基本上增加一个image列。
alter table employee add image blob;
~修改job列,使其长度为60。
alter table employee modify job varchar(60);
~删除gender列。
alter table employee drop gender;
~表名改为user。
rename table employee to user;
~修改表的字符集为gbk
alter table user character set gbk;
~列名name修改为username
alter table user change name username varchar(30);
4.删除表
drop table tabName;
~删除user表
drop table user;
三、操作表记录
MySql乱码:
客户端在发送数据时使用的编码和服务器认为的客户端是的编码不相同,则发送时用的编码和接受时用的编码不同,产生乱码
解决方案:客户端一上来就可以使用set names gbk;命令通知服务器当前客户端发送数据时使用的编码是什么,这样服务器在和当前客户端交互时就会使用指定的编码从而可以解决乱码问题。
我们也可以修改mysql安装目录下的my.ini文件,通过修改default-character-set值,可以设置服务器默认认为的客户端的编码。
1.增加记录
INSERT INTO table [(column [, column...])] VALUES (value [, value...]);
~向员工信息表中插入三条记录
insert into employee (id,name,gender,birthday,entry_date,job,salary,resume) values (null,'张飞',1,'1990-09-09','1990-10-01','打手',998.00,'真的很能打');
insert into employee values (null,'关羽',0,'1980-08-08','1980-10-10','耍大刀的',9000.00,'ceo的亲弟弟,虽然只会耍刀,但是挣得的很多');
insert into employee values (null,'刘备',1,'1970-08-08','1970-10-10','公司ceo',900000.00,'公司老总基本很闲'), (null,'赵云',1,'1999-08-08','1999-10-10','保安队长',90.00,'老总贴身保镖');
2.修改记录
UPDATE
tbl_name SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
~将所有员工薪水修改为5000元。
update employee set salary=5000;
~将姓名为’张飞’的员工薪水修改为3000元。
update employee set salary=3000 where name='张飞';
~将姓名为’关羽’的员工薪水修改为4000元,job改为ccc。
update employee set salary=4000,job='ccc' where name='关羽';
~将刘备的薪水在原有基础上增加1000元。
update employee set salary=salary+1000 where name='刘备';
3.删除记录
delete from tbl_name [WHERE where_definition]
~删除表中名称为’张飞’的记录。
delete from employee where name='张飞';
~删除表中所有记录。
delete from employee;
~使用truncate删除表中记录。
truncate employee;
4.查询记录
(1)SELECT [DISTINCT] *|{column1, column2. column3..} FROM table;
~查询表中所有学生的信息。
select * from exam;
~查询表中所有学生的姓名和对应的英语成绩。
select name,english from exam;
~过滤表中重复数据。
select distinct english from exam;
~在所有学生分数上加10分特长分显示。
select name,english+10,chinese+10,math+10 from exam;
~统计每个学生的总分。
select name ,english+chinese+math from exam;
~使用别名表示学生总分。
select name as 姓名,english+chinese+math as 总成绩 from exam;
select name 姓名,english+chinese+math 总成绩 from exam;
select name english from exam;
(2)使用Where子句进行过滤查询
~查询姓名为张飞的学生成绩
select * from exam where name='张飞';
~查询英语成绩大于90分的同学
select name,english from exam where english > 90;
~查询总分大于230分的所有同学
select name 姓名 ,math+english+chinese 总分 from exam where math+english+chinese>230;
~查询英语分数在 80-100之间的同学。
select name,english from exam where english between 80 and 100;
~查询数学分数为75,76,77的同学。
select name,math from exam where math in(75,76,77);
~查询所有姓张的学生成绩。
select * from exam where name like '张%';
select * from exam where name like '张__';
~查询数学分>70,语文分>80的同学。
select * from exam where math>70 and chinese > 80;
(3)排序查询
SELECT column1, column2. column3..
FROM
table
order by column asc|desc
~对英语成绩排序后输出。
select name,english from exam order by english;
~对总分排序按从高到低的顺序输出
select name 姓名,math+english+chinese 总分 from exam order by 总分 desc;
~对姓张的学生成绩排序输出
select name 姓名,math+english+chinese 总分 from exam where name like '张%' order by 总分 desc;
(4)聚合函数
~1.count()返回某一列,行的总数
~统计一个班级共有多少学生?
select count(*) from exam;
~统计数学成绩大于70的学生有多少个?
select count(*) from exam where math > 70;
~统计总分大于250的人数有多少?
select count(*) from exam where math+english+chinese>230;
~2.Sum函数返回满足where条件的行的和
~统计一个班级数学总成绩?
select sum(math) from exam;
~统计一个班级语文、英语、数学各科的总成绩
select sum(chinese),sum(english) ,sum(math) from exam;
~统计一个班级语文、英语、数学的成绩总和
select sum(ifnull(chinese,0)+ifnull(english,0)+ifnull(math,0)) from exam;
~统计一个班级语文成绩平均分
select sum(chinese)/count(*) from exam;
~3.Avg求符合条件的某一列的平均值
~求一个班级数学平均分?
select avg(math) from exam;
~求一个班级总分平均分?
select avg(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) from exam;
~4.Max/min函数返回满足where条件的一列的最大/最小值
~求班级最高分和最低分
select max(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) from exam;
select min(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) from exam;
(5)分组查询
SELECT column1, column2. column3.. FROM
table group by column having ...
~对订单表中商品归类后,显示每一类商品的总价
select product,sum(price) from orders group by product;
~查询购买了几类商品,并且每类总价大于100的商品
select product,sum(price) from orders group by product having sum(price)>100;
where 和 having的区别:
where用来在分组之前进行过滤,having用来在分组之后进行过滤
having子句中可以使用聚合函数,where子句中是不可以使用聚合函数
在很多情况下having可以替代where
~查询单价小于100但是总价大于150的商品的名称
select product,sum(price) from orders where price<100 group by product having sum(price)>150;
!!!!!SQL语句的书写顺序:
select from where groupby having orderby
!!!!!SQL语句的执行顺序:
from where select group by having order by
四、备份/恢复数据库
备份:
在cmd窗口中,mysqldump -u root -p db_name>c:/1.sql
恢复:
创建数据库
回到cmd窗口,mysql -u root -p db_name
或
创建数据库
在mysql命令行下,进入数据库,source c:/1.sql
五、多表设计
外键约束:
create table dept(
id int primary key auto_increment,
name varchar(20)
);
insert into dept values(null,'财务部'),(null,'人事部'),(null,'销售部'),(null,'行政部');
create table emp(
id int primary key auto_increment,
name varchar(20),
dept_id int,
foreign key(dept_id) references dept(id)
);
insert into emp values(null,'奥巴马',1),(null,'哈利波特',2),(null,'本拉登',3),(null,'朴乾',3);
1对多 : 在多的一方设计外键保存一的一方的主键
1对1 : 在任意一方设计外键保存另一方的主键
多对多 : 设计第三方关系表保存两张表的主键的对应关系
六、多表查询
create table tb (id int primary key,name varchar(20) );
create table ta (
id int primary key,
name varchar(20),
tb_id int
);
insert into tb values(1,'财务部');
insert into tb values(2,'人事部');
insert into tb values(3,'科技部');
insert into ta values (1,'刘备',1);
insert into ta values (2,'关羽',2);
insert into ta values (3,'张飞',3);
mysql> select * from ta;
+----+------+-------+
| id | name | tb_id |
+----+------+-------+
| 1 | aaa | 1 |
| 2 | bbb | 2 |
| 3 | bbb | 4 |
+----+------+-------+
mysql> select * from tb;
+----+------+
| id | name |
+----+------+
| 1 | xxx |
| 2 | yyy |
| 3 | yyy |
+----+------+
1.笛卡尔积查询:两张表中一条一条对应的记录,m条记录和n条记录查询,最后得到m*n条记录,其中很多错误数据
select * from ta ,tb;
mysql> select * from ta ,tb;
+----+------+-------+----+------+
| id | name | tb_id | id | name |
+----+------+-------+----+------+
| 1 | aaa | 1 | 1 | xxx |
| 2 | bbb | 2 | 1 | xxx |
| 3 | bbb | 4 | 1 | xxx |
| 1 | aaa | 1 | 2 | yyy |
| 2 | bbb | 2 | 2 | yyy |
| 3 | bbb | 4 | 2 | yyy |
| 1 | aaa | 1 | 3 | yyy |
| 2 | bbb | 2 | 3 | yyy |
| 3 | bbb | 4 | 3 | yyy |
+----+------+-------+----+------+
2.内连接:查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
select * from ta ,tb where ta.tb_id = tb.id;
select * from ta inner join tb on ta.tb_id = tb.id;
mysql> select * from ta inner join tb on ta.tb_id = tb.id;
+----+------+-------+----+------+
| id | name | tb_id | id | name |
+----+------+-------+----+------+
| 1 | aaa | 1 | 1 | xxx |
| 2 | bbb | 2 | 2 | yyy |
+----+------+-------+----+------+
3.外连接
(1)左外连接:在内连接的基础上增加左边有右边没有的结果
select * from ta left join tb on ta.tb_id = tb.id;
mysql> select * from ta left join tb on ta.tb_id = tb.id;
+----+------+-------+------+------+
| id | name | tb_id | id | name |
+----+------+-------+------+------+
| 1 | aaa | 1 | 1 | xxx |
| 2 | bbb | 2 | 2 | yyy |
| 3 | bbb | 4 | NULL | NULL |
+----+------+-------+------+------+
(2)右外连接:在内连接的基础上增加右边有左边没有的结果
select * from ta right join tb on ta.tb_id = tb.id;
mysql> select * from ta right join tb on ta.tb_id = tb.id;
+------+------+-------+----+------+
| id | name | tb_id | id | name |
+------+------+-------+----+------+
| 1 | aaa | 1 | 1 | xxx |
| 2 | bbb | 2 | 2 | yyy |
| NULL | NULL | NULL | 3 | yyy |
+------+------+-------+----+------+
(3)全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
select * from ta full join tb on ta.tb_id = tb.id; --mysql不支持全外连接
select * from ta left join tb on ta.tb_id = tb.id
union
select * from ta right join tb on ta.tb_id = tb.id;
mysql> select * from ta left join tb on ta.tb_id = tb.id
-> union
-> select * from ta right join tb on ta.tb_id = tb.id; --mysql可以使用此种方式间接实现全外连接
+------+------+-------+------+------+
| id | name | tb_id | id | name |
+------+------+-------+------+------+
| 1 | aaa | 1 | 1 | xxx |
| 2 | bbb | 2 | 2 | yyy |
| 3 | bbb | 4 | NULL | NULL |
| NULL | NULL | NULL | 3 | yyy |
+------+------+-------+------+------+