一、sql语句
1.操作数据库
(1)创建数据库
语法:
CREATE DATABASE [IF NOT EXTSTS] db_name
[create_specification[,create_specifition]...]
CREATE_SPECIFITION:
[DEFAULT] CHARCTER SET charset_name
|
[DEFAULT] COLLATE collation_name;
举例:
--创建一个名字为mydb1的数据库
create database mydb1;
--创建一个使用gbk字符集的mydb2的数据库
create database mydb2 character set gbk;
--创建一个使用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;
举例:
drop database mydb2;
(4)修改数据库
语法:
ALERT DATABASE [IF EXISTS] db_name [alert_specifition [,alert specifition]...]
alert specifition;
举例:
查看数据库服务器中的数据库,并把其中的一个数据的字符集修改为utf8
alert dababase mydb1 character set utf8;
(5)选择数据库
语法:
use dn_name;
举例:
use mydb3;
select database();
二、操作数据库表
(1)
创建表:
语法:CREATE TABLE table_name(
field1
datatype,
field2
datatype,
field3
datatype,
...
)character set 字符集
collate 校对规则;
说明:
field:指定列名
datatype:指定要存储的数据类型。
举例:
--创建表employee
create table employee(
id int primary key auto_increment,
name varchar(20),
gender bit not null,
birthday data,
entry data,
job varchar(40),
salary double,
resume text
);
(2)查看表
语法:
desc tabname
----查看表结构
show tables
----查看数据库服务器中的所有表
show create table table_name
----查看创建指定表名的sql语句
(3)修改表
语法:
ALERT TABLE table table_name ADD/MODIFY/DROP/character set/change(colum datatype [DEFAULT expr] [, colum datatype])
rename table 表名 to 新表;
举例:
--在上面员工表的基础上增加以列image
alert table employee add image blob;
--修改job列的长度为60
alert table employee modify job varchar(60);
--删除gender列
alert table employee drop gender;
--将表的名字修改为user
rename table employee to user;
--列名name修改为username
alert table user change name usernaem varchar(20);
(4)删除表
语法:
DROP TABLE table_name;
举例:
删除user表
drop table user;
三、操作表记录(也就是我们通常所说的对数据库中表的增删改查---CRUD)
(1)INSERT
语法:
INSERT INTO table [(colum[,colum...])] value(value[,value]);
举例:
insert into user (id,username,gender,birthday,entry_data,job,salary,resume)
values(null,'小明',1,'1989-01-25','1898-12-24','董事长',9999,'公司的老大....');
insert into user
values(null,'小明',1,'1989-01-25','1898-12-24','董事长',9999,'公司的老大....');
insert into user (id,username,gender,birthday,entry_data,job,salary,resume)
values(null,'小明',1,'1989-01-25','1898-12-24','董事长',9999,'公司的老大....');
values(null,'小明',1,'1989-01-25','1898-12-24','董事长',9999,'公司的老大....');
values(null,'小明',1,'1989-01-25','1898-12-24','董事长',9999,'公司的老大....');
values(null,'小明',1,'1989-01-25','1898-12-24','董事长',9999,'公司的老大....');
需要注意的地方:
mysql中的乱码问题解决方案:
set names gbk;
--通知服务器当前客户端是什么编码的格式,从而让服务器用这种方式的编码处理当前客户端的信息。
但这种方法仅仅是对当前起作用。
修改mysql安装目录下的my.ini,设置default-character-set=gbk;
--修改了服务器的默认编码方式,因为我们通常用的是中文的windows系统,它默认的编码方式就是gbk。
(2)UPDATE
语法:
UPDATE table_name SET col_name1=expr[,col_name2=expr2...] [WHERE where_definition]
举例:
--将所有员工的薪水修改为5000
update user set salary=5000;
--将姓名为'小明'的员工的薪水修改为2000;
update user set salary=2000 where name='小明';
--将小明的薪水修改为4000,job修改为老大
update user set salary=4000,job='老大'
where name='小明';
--将小明的薪水在原来的基础上加1000;
update user set salart=salary+1000 where name='小明';
(3)DELETE
语法:
DELETE FROM table_name [WHERE where_specifition];
举例:
--删除表中名字叫小明的记录
delete from user where name='小明';
--删除表中所有的记录
delete from user;
--删除表中所有记录的另外一种方式
truncate user;
delete和truncate的区别:
**delete是将表中的记录一条一条的删除,比如说一个表中有一万条记录,delete是从第一条开始删除,直到第一万条记录,逐个的删除。
**truncate是将表删除,然后再重新创建一个和删除之前的表一模一样的表,它的效率比较高。
**delete可以删除表中的具体的某一条记录,而truncate则没有这种功能。
(4)SELECT
语法一:
SELECT [DISTINCT] * [{colum1,colum2,colum3....}] FROM table;
举例:
--查询表中所有学生的信息
select * from user;
--查询表中所有学生的姓名和对应的英语成绩
select name,english from user;
--过滤表中的重复数据
select distinct * english from user;
--在所有的成绩上加100分显示
select name,math+100,english+100,chinese+100 from user;
--统计每个学生的总分
select name,math+english+chinese form user;
--使用别名表示学生的总分
select name as 姓名,math+english+chinese as 总分 from user;
select name 姓名,math+english+chinese 总分 from user;
语法二:
使用where子句进行过滤查询
举例:
--查询姓名为小明的学生的成绩
select * form user where name='小明';
--查询英语成绩大于90分的学生
select name,english from user where english>90;
--查询总分大于230的所有的学生
select name,ifnull(math,0)+ifnull(english,0)+ifnull(chinese,0) from user where (ifnull(math,0)+ifnull(english,0)+ifnull(chinese,0))>230;
--查询英语分数在80~100之间的学生
select name,english from user where english between 80 and 100;
--查询数学成绩为75,76,77的同学
select name,math from user where math in(75,76,77);
--查询所有小的学生的成绩
select * from user where name like '小%';
select * from user where name like '小_';
select * from user where name like '小__';
--查询数学分大于70,语文分数大于82的学生的学生
select name,math,chinese form user where math>70 and chinese>82;
(3)使用OEDER BY子句进行排序查询
语法:
SELECT colum1,colnum2,colum3...FROM table; order by colum asc
| desc;
举例:
--对英语成绩排序后输出
select name,english from user order by english desc;
--对总分排序后按照从高到低的顺序输出
selet name,english+math+chinese from user order by desc;
--对性张的学生的成绩排序输出
select * from user where name like '张%' order by ifnull(math,0)+ifnull(english,0)+ifnull(chinese,0)
(4)使用聚合函数
语法一:
count
求符合条件的行的总数:
select count(*) | colum from table_name [where where_specifition]
举例:
--统计一个班级共有多少学生
select count(*) form user;
--统计数学成绩大于70分的学生共有多少个
select count(*) from user where math>70;
--统计总分大于230的学生共有多少个
select count(*) from user where (math+english+chinese)>230;
语法二:
sum
求符合条件的列的和
举例:
--统计一个班数学总成绩;
select sum(math) from user;
--统计一个班数学,英语,语文的各自总成绩
select sum(math),sum(english),sum(chinese) from user;
--统计一个班语文的平均分
select sum(chinese)/count(chinese) from user
语法三
avg
求符合条件的列的平均数
举例:
--求一个班数学的平均分
select avg(math) from user;
--求一个班总的平均分
select avg(math+english+chinese) from user;
语法四:
MAX/MIN
求符合条件的列中的最大值或者最小值
举例:
--求班级最高分和最低分
select max(math+english+chinese) from user;
select min(math+english+chinese) from user;
(5)分组查询
举例:
--对订单表中的商品归类后,显示每一类商品的总价
select product,sum(price) from orders group by product;
--查询购买了几类商品,并且每类商品的总价大于210的商品;
select product,sum(price) form orders group by product having sum(price)>210;
--查询单价小于100,总价大于150的商品
select product from orders where price>100 group product having sum(price)>150;
需要注意的地方:
having子句 对分组的结果进行过滤
having和where都可以进行过滤,但是where是在分组之前进行过滤,having是在分组之后进行过滤
having子句中可以使用聚合函数,而where子句中不能使用聚合函数。
sql语句的书写顺序和执行顺序
书写顺序:select
from
where
group by
having
order by
执行顺序:from
where
select
group by
having
order by
四、数据库的备份和恢复
备份:
--cmd窗口-->mysqldump-->-u root -p mydb2>c:/xxx.sql
恢复:
1.先创建数据库
回到cmd窗口
-->musql-->-u root -p mydb2
2.先创建数据库 回到cmd窗口 --mysql -u root -p root -->source c:/xxx.sql;
备注:所谓的source命令,就是执行一遍xxx.sql;
五、多表设计和多表查询
1.外键约束
数据库中的表和表之间常常具有一定的关系,这些关系往往是通过表中引入参照表的id来进行声明的,此时可以将这种参照关系利用外键明确的通知数据库,
这样一来数据库会帮助我们管理这种参照关系,当对数据进行增删改操作时,数据库会帮我们检查并确保不会违反这些参照关系.
foreign key(ordersid) references orders(id)
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
);
insert into emp values(null,'奥巴马',1),(null,'普京',2),(null,'安倍',2),(null,'朴乾',3);
2.多表设计
1--*:在多的一方保存一的一方的主键作为外键
1--1:在任意一方保存另一方的主键作为外键
*--*:设计第三方表,保存两张表的主键作为外键,从而保存两张表中记录的对应关系
3.多表查询
笛卡尔积查询:如果左边表有m条记录,右边表有n条记录,则笛卡尔积查相当于做乘法查处m*n条记录.这样的查询,查出来的数据往往包含了大量错误的数据
select * from dept,emp;
内连接查询:查询的结果里只有左边有且右边表也有的记录
select * from dept,emp where dept.id=emp.dept_id;
select * from dept inner join emp on dept.id=emp.dept_id;
外连接查询:
左外连接查询(左连接查询):在内连接的基础上,增加上左边表有而右边表没有的记录
select * from dept left join emp on dept.id=emp.dept_id;
右外连接查询(右连接查询):在内连接的基础上,增加上右边表有而左边表没有的记录
select * from dept right join emp on dept.id=emp.dept_id;
全外连接查询(全连接查询):在内连接的基础上增加上左边表有而右边表没有的记录和右边表有而左边表没有的记录
select * from dept full join emp on dept.id=emp.dept_id;--mysql不支持全外连接
select * from dept left join emp on dept.id=emp.dept_id
union
select * from dept right join emp on dept.id=emp.dept_id;