@(数据库)
##MySQL基本操作
- 登录 mysql -uroot -p
- net start mysql,在bin目录下(管理员权限运行的cmd)
创建数据库
--create database 数据库的名字
create database day06;
--创建数据库,指定字符集
create database 数据库名字 character set 字符集
create database day06_1 character set utf8;
查看数据库
--查看数据库定义的语句(有3个是自带的)
show create database 数据库名字
show create database day06;
--查看所有数据库
show databases;
修改数据
--修改数据库字符集
alter database 数据库名字 character set 字符集
alter database day06_1 character set gbk;
表的CRUD
create table 表名字(
列名 列的类型 约束,
列名2 列的类型 约束
);
//不能插入中文,建表设置字符集
create table student (
sid int primary key,
sname varchar(31),
sex int,
age int
) default chartset=utf8;
- 列的约束
主键约束: primary key
唯一约束:unique
非空约束:not null
查看表
--查看所有表
show tablas
--查看表的创建
show create table student
--查看表结构
desc student
修改表
添加列(add),修改列(modify),删除列(drop),修改表明(rename),修改表的字符集
添加列(add)
alter table 表名 add 列名 列类型 列约束
alter table student add chengji int not null;
//修改列
alter table student modify sex varchar(2);
//修改列名(列的类型要带上)
alter table student change sex gender varchar(2);
//删除列
alter table student drop chengji;
//修改表名和字符集一般不要动
alter table student to stu ;
alter table student character set gbk ;
删除表
drop table student;
sql完成对表中数据的CRUD操作
#####插入数据
inset into 表名 (列表1,列名2,列名3)values(值1,值2,值3);
insert into student(sid,sname,gender,age)values(1,''songbl'',1,25);
//简单写法,插入全列,表名后面的列名可以省略
insert into student values(1,''songbl'',1,25);
//插入部分列,列名不可以省略
insert into student(id,sname) values(3,'xiaolong');
--批量插入(中间以逗号隔开)
insert into student values(4,''songbl'',1,25),(5,''songbl'',1,25),(6,''songbl'',1,25);
删除数据
//如果不写限制条件,所有的数据都会一条一条删除
delete from 表名 where 条件
delete from student where id= 6;
---面试问题,delete和truncate删除数据
delete:DML,一条一条删除数据(数据少,搞笑)
truncate:DDL,先删除表在重建表(数据多,高效)
更新表数据
//如果不写限制条件,会修改所有数据
update 表名 set 列名=列值,列名2=列值2 where条件
//如果参数是字符串或者日期要加上单引号
update student set sname = 'longlong' where id =4;
update student set sname = 'longlong',age=24 where id =5;
查询数据
select [distinct] [*] [列名1,列名2] from 表名 [where条件]
distinct :去除重复数据
select 用于控制显示那些列
---商品分类:手机数码,鞋靴箱包
1. 分类的id
2. 分类的名称
3. 分类描述
create table category (
cid int primary key auto_increment,
cname varchar(10),
cdesc varchar(30)
)
//主键自增长,就不需要传了
insert into category values(null,'手机数码','电子产品 ');
insert into category values(null,'鞋靴箱包','江南皮革厂 ');
insert into category values(null,'香烟酒水','茅台飞天 ');
insert into category values(null,'酸奶饼干','娃哈哈,纯甄 ');
insert into category values(null,'你妹的','瓜子,测试 ');
--再新建商品表,有名称,价格,时间(null取当前时间),类别(对应category)
如下查询操作:
//查询所有商品
select *from product ;
//查询商品名称和商品价格
select pname,price form product;
//别名查询,as关键字,as关键字可以省略
--表别名 select p.pname,p.price form product p;(主要用于多表查询)
select p.pname,p.price form product as p;
//列别名 select pname as 商品名称,price as 商品价格 from product;
查询结果列名pname就变成了商品名称..
--去掉重复数据
//有商品价格一样的,就显示一条了
select distinct price from product;
---运算符;仅仅在查询结果上做了+-*/运算,数据库内容不变
//查询所有的列,外加price价格乘以1.5的列
select *,price*1.5 as 打折价 from pruduct;
where
---条件查询[where]
--where后的写法
-关系运算符> >= < <= != <>
<>不等于,标准的SQL语句
//查询所有价格不等于88的商品
select *from product where price <> 88;
//查询价格在10到100之间
select *from product where price > and price <100;
-between...and ....(从小到大写)
select *from product where price between 10 and 100;
---逻辑运算符 and 、or、not
//查询商品价格小于100或者大于1000
select *from product where price < 100 or price >1000;
复杂查询
---like :模糊查询
-- %:代表多个字符 _:代表一个字符
//查询出名字中带有饼的所有商品 ‘%饼%’
select *from product where pname like ‘%饼%’ ;
(结果小熊饼干、旺旺大饼)
//查询第二个字是熊的所有商品‘_熊%’
select *from product where pname like ‘_熊%’ ;
(结果小熊饼干)
---in 在某个范围内获得值
--查询出商品分类ID在1,4,5里面的所有商品
select *from product where cid in(1,4,5);
---排序查询:order by 关键字
asc:ascend,升序(默认的排序方式)
desc:descend,降序
--0.查询所有商品,按照价格进行降序排序
select *from product order by price desc;
--1.查询名称有 小 的商品(小米手机,小熊饼干),按照价格升序
第一步:查询出所有带小的商品
select *from product where pname like '%小%';
第二步:进行排序
select *from product where pname like '%小%' order by price desc;
聚合函数
- sum()求和
- avg()平局
- count()统计数量
- max()最大值
- min()最小值
//获得所有商品价格的总和
select sum(price) from product;
//获取所有商品的平均价格
select avg(price) from product;
//获取所有商品的个数
select count(*) from product;(这个count其实就是查询有多少行)
---where后面不可以跟聚合函数
分组
group by
根据某个字段,做一个分组操作。
//根据cno(类别)分组,分组后统计商品的个数
select cno,count(*) from product group by cno ;

—根据cno分组,分组后统计每组商品的平均价格,并且商品平均价格大于60
select cno,avg(price)
from product group by cno
having avg(price) >60;

having关键字可以接聚合函数,在分组之后执行
where关键字不可以接聚合函数,在分组之前执行
顺序
编写顺序:
select … from … where … group by … having … order by
执行顺序:
from(从那张表) … where(得到表的数据,再条件判断,还是一张表)…group by(可能需要对这张表进行分组)…having(分组之后,可能需要做一些过滤筛选)…select(最后控制显示)…order by(显示的结果可能再做一下排序)
杂记
首先明确的是,char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。
尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。
再者,char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节

被折叠的 条评论
为什么被折叠?



