连接Mysql服务器
注意 :-h指的是host地址 ;-u指的是user, 之所以打到-p回车再输入密码,是为了防止密码泄露
如果-h不写则默认是localhost
★服务器à数据库 database à多张或一张表table(建表的同时就是声明列)
★基本的语句
(注意分号结束)
1、查看当前服务器有什么数据库:showdatabases
2、创建数据库 :create database
3、删除数据库 :drop database 数据库名
删除表 :drop table表名
4、选择要操作的数据库 :use数据库名
5、查一个数据库有什么表 :show tables;
6、修改表名 : rename table旧表名to新表名 (不能修改数据库的名字)
7、查看一个表的结构 :desc表名 (仅是查看列的结构,不含数据)
8、创建表并添加列 : 自定义表名,同时下面设置列名和类型
Create table表名(
Num int ,
Name char(10)
Age int ) ;
以上是实例 , 注意每个属性用逗号进行隔开,最后一分号结束
Ps :age int unsigned zerofillà zerofill 表示0填充并且默认unsigned
插入数据的语句 :
Insert into 表名
(num,name,age)values(1,’张三’,22),(2,’王四’,25);
注意 :如果插入全部属性则前者可以省略 ,如果要选择插入某些属性则修改前者即可values有个s,且必须有
注意values的拼写
插入新列的语句 :
Alter table 表名 add列名 类型 限制 after列名
限制可以是 :(1)unsigned无符号
After 是为了声明在哪一列后面,默认在最后一列,如果要放在第一则替换为first
修改表之修改列 :
Alter table 表名change旧列名 新列名 新列的类型 限制
如果要修改原来列的属性可把新列名也写为旧列名即可
修改表之删除列 :
Alter table 表名drop 列名
修改表之增加列主键 :
Alter table 表名add primary key (列名)
如 : 令id列为主键
Alter table 表名add primary key (id)
增加主键的时候如果出现duplicate entry错误, 就是因为主键有重复的值
修改表中某列的值 :
Update表名set
name = ‘李四’ , age = 30
Where
Num = 11
注意 : where设置 修改的 条件
删除表中某行的数据 :
Deletefrom 表名 where num = 1;
注 :如果要删除多行,则需要用or
查询语句
查询全部数据 :Select * from 表名 ;
查询部分列的数据 :Select num,name from表名 ;
条件查询 : select num,name
from 表名
where num>1
★★★所谓的建表就是 声明列的过程
★★★插入的时候整型类型讨论
无符号和有符号分别表示不同的 能够取到的 取值范围 ,为了开发的速度合适的类型,默认是有符号存储范围也是在有符号的范围
★★属性进行初始化的赋值时 ,如果没有进行赋值则默认为 null,一般创建时可以用语句
Name char(10) not null default 自定义的默认值, null不好比较一般都是自定义
★★浮点型 float(M,D)M代表精度即是总长度 ;D代表标度即是小数点
如 :price float(6,2)9999.99 ~ -9999.99
★★字符型 (注意该类型的数据需要添加单引号):
Char(M) : 定长字符串 , 如果存的数据小于M也实占M个字符,内容不足部分补0,M代表可容纳的字符数 , 0<=M<=255, 如 :nihao五个字符
好 一个字符(三个字节)
Varchar(M) :不定长字符串,如果存的数据小于M个字符,则占数据实际的大小
0<=M<=65535 (ascii),但是它会有1到2个字节被用于记录长度
速度上char比较快,varechar比较省资源
★★★decimal:高精度浮点数,常用于金融运算,不会出现浮点数计算的误差
★★★见识 history herstory
★★★year类型
★★★Date类型
★★★实战建立106宿舍资料
create table ss106(
id intprimary key auto_increment,// 主键,递增
name char(4) not null default '',
age tinyint unsigned not null default 0,
email varchar(30) not null default '',
telchar(11) not null default '', //电话号码设置为char
salary decimal(7,2) not null default 0, //金钱的问题设置为decimal类型
intro varchar(1000) not null default '' //此处结尾不能添加逗号!!
)charset utf8; //设置为utf8类型
Ps :编写以上代码时 , 单词有的打错了 , 导致修改了几次才能运行!!!所以编写代码的时候一定要认真拼写,脑中一定要有印象
★★★使用delect的时候,有时候id不存在但也能够执行语句
★★★where : 理解为使表达式是否成立,成立则为真
如 :取出数学比语文高20分的同学成绩
Select * from students
Where math-china>20
★★select中where常用运算符
★in : 表示在某个集合内进行取值,
如 取出学号为2,3,5的学生成绩
Select * from students where id in(2,3,5);
★between : 表示在某个范围内进行取值 ,可以取边界值
如 取出学号为2~5的学生成绩
Select * from students where id between 2 and 5 ;
这句等于
Select * from students where id >= 2 and id <= 5 ;
★not:Select * from students where id != 2 ;
Select * from students where not in (2,3);
★like : 模糊查询
(1)取出以某文字开头的 :文字%
如 :取出姓张的成绩
Select * from students where name like ‘张%’;
Ps :不姓张则not like
(2)取出限定字数的 : 文字_ ,一个下划线一个字
Select * from students where name like ‘张_’;
★★★select 之group: 使用于统计,一般配合统计函数用
★ Max :
如 :找出最高成绩
Select max(grade) from students ;
Sum :
如 :求出所有商品库存总和
Select sum(goods_num) from goods ;
Avg :
如 :求出所有手机价格的平均价格
Select avg(price) from goods ;
Conut :
如 :求出行数
Select count(*) from goods ;
★group by: 进行分组和按此列排序,并在分组中寻找和要求的 ,经常和集函数一起使用 , 如果不和集函数使用也是取出分组的排在第一位置的
如 :寻找同分组,最高价格
Select cat_id , max(price) from goods group by type_id;
Ps :添加其他的选项没意义
★把列名当做变量名进行运算 (注:显示出来的栏目统计函数显示的时候会自己占列)
Ps : 显示的名字可以用as令命名
★★having 语句 :
Where 语句不能够 对查询的结果进行操作,需要进一步的操作必须受使用having
如 :查询市场的手机价格和店铺手机价格之间差价为100元的手机
(1) 错误的
Select good_id,good_name,market_price-shop_price as chajia from goods where chajia>100;
(2)正确的
Select good_id,good_name,market_price-shop_price as chajia from goods where market_price-shop_price >100;
但计算了两次
(3)用having语句 :
Select good_id,good_name,market_price-shop_price as chajia from goods having chajia>100;
★having和where同时使用
如 :查询栏目3的,市场的手机价格和店铺手机价格之间差价为100元的手机
Select good_id,good_name,market_price-shop_price as chajia from goods where good_id = 3 having chajia>100;
◇实战 :计算挂科数目在2科以上的同学的平均成绩
Select name,sum(score<60) as shumu,avg(score) as pj from students group by name haing shumu>=2 ;
★★★order by :改变排序的依据,一般默认升序 , 如果要改为降序则要添加desc
Order by 列名1[desc/asc],列名2[desc/asc];
如 :按照价格进行降序排列,在价格排序好之后,如果价格一样的再按照id排
select id,price from goodsorder byprice,id desc
★limit : 配合order by使用,限制选出来的条数
Limit 偏移的数目,限制的条数à偏移的数目可以不写默认为0
如 :按照价格进行降序排列,在价格排序好之后,如果价格一样的再按照id排,且只取出4,5,6行的数据
select id,price from goodsorder byprice,id desc limit 3,3;
★★★ 特殊的错误 :
★★如果出现这个情况,分号在前面,就会使任何的语句都不能执行,需要输入’;进行结束(即是一个分号和冒号)
★★版本不支持中文
★★我擦,用一个insert语句,错了这么多个地方,第一个地方就版本不支持中文,第二个坑爹的地方就是 输入的 字符中含有 中文的字符,特别是标点的问题 , 唉……
★★★where , group by , having , order by , limit多个时,按照这个顺序进行抒写
★★★
★★复制一张表(只是复制表结构) : create table表名like被复制的表名
★★复制某张表的数据 :insert into表名from被复制的表名(后能加order by等)
★★清空一张表的数据 :truncated表名
★★★巧妙的运用
★★查询(select)的结果一般都是一个表结构,所以可以把结果当做表使用,用括号区别
如 :select * from (select id,cat_id,goods_name,shop_price from goods order by cat_id) as temp group by shop_price;
括号内的查询结果当做一个已有的表进行处理,*表示括号内有的列,把括号内的表称为temp
★★把查询结果当做条件使用 :
如 :select goods_id , goods_name from goods where
goods_id = (select max(goods_id ) from goods) ;
★★where带入行中看是否成立来理解,列看做变量来理解可以运算,查询的结果当做临时表来理解
★★★where型子查询 :把内层的查询结果作为外层查询的比较条件,用 in来表示在里面
如 :取出每个栏目中价格最贵的商品
Select id,cat_id,shop _price from goodswhereshop_pricein (select max(shop_price) from goods group by cat_id);
注意 :这里巧妙地把一个查询的结果组作为 外层的查询条件;内层不用cat_id也可以,因为那只是表示显示出来的栏目而已
★★★From型子查询 : 把内层的查询结果当成临时表,供外层Sql再次查询
注意 :使用from型的子查询必须 添加别名 , 即是as
否则出现这个错误
如 :取出每个栏目下最新的商品
Select * from (select id,cat_id,goods_name from goods order by cat_id asc,id des) as temp group by cat_id ;
先排序好,再按栏目进行取出来
★★★不允许这样操作
★★★找出挂科两门以上同学的平均成绩
select name,avg(score) from students where name in (select name from(select name,count(*) as num from students where score = 2) as temp) group by name;
把题目进行分解 两个以上,不及格,平均成绩
所以先找出两科以上,不及格的学生