修改 root 用户密码 :mysqladmin -u root -p password 新密码
显示所有数据库列表:show databases;
创建一个数据库:create database 数据库名
打开一个数据库:use 数据库名
显示数据库的所有数据表 show tables;
查询表结构:desc 表名
新建一个表
查看索引 SHOW INDEXES FROM 表名
以创建user 表为例, 表中将存放 学号(id)、姓名(name)、性别(sex)、年龄(age)、联系电话(tel) 这些内容:
create table user
(
id int unsigned not null auto_increment primary key,
name char(8) not null,
sex char(4) not null,
age tinyint unsigned not null,
tel char(13) null default "-"
);
以 “id int unsigned not null auto_increment primary key” 行进行介绍:
“id” 为列的名称;
“int” 指定该列的类型为 int(取值范围为 -8388608到8388607), 在后面我们又用 “unsigned” 加以修饰, 表示该类型为无符号型, 此时该列的取值范围为 0到16777215;
“not null” 说明该列的值不能为空, 必须要填, 如果不指定该属性, 默认可为空;
“auto_increment” 需在整数列中使用, 其作用是在插入数据时若该列为 NULL, MySQL将自动产生一个比现存值更大的唯一标识符值。在每张表中仅能有一个这样的值且所在列必须为索引列。
“primary key” 表示该列是表的主键, 本列的值必须唯一, MySQL将自动索引该列。
char(8) 表示存储的字符长度为8, tinyint的取值范围为 -127到128, default 属性指定当该列值为空时的默认值数据类型
向表中插入数据
(1) insert [into] 表名 [(列名1, 列名2, 列名3, …)] values (值1, 值2, 值3, …);(一次性插入多条记录)
(2) insert into 表名 set 列名=’值’,列名=’值’;(最多一条)
(3)insert into 表名 select…. 可以将查询到的数据写入到一个表中
区别 第二种可以使用子查询 ,第三种可以将查询的结果插入数据表中
复制插入数据 insert into 表名… select (搜索显示的字段) from 表名 where 条件(插入范围)
insert into user valuses(NULL, "张三", "男", 20, "18311111111");
insert into user (name, sex, age) values("王五", "女", 34);
/**
*可以插入表达式
*/
insert into user values(DEFAULT,'Gso','789',20*5-67,1);
/**
*可以插入函数md5,多行插入
*/
insert into user values(default,'Tom',123,3*7-5,1),(null,'Rose',md5('123'),2,2);
/**
* insert set 只能插入一列
*/
insert into user set username='Ben',password='456';
/**
*将查询到的数据 插入数据表
*要插入的数据表必须和要插入的列数量一致
*插入多条
*/
insert into test select username from user where age>=30;
insert into tdb_goods_cates (cate_name) select goods_cate from tdb_goods group by goods_cate;
/**
*复制插入数据
*/
INSERT tdb_goods(goods_name,cate_id,brand_id) SELECT goods_name,cate_id,brand_id FROM tdb_goods WHERE goods_id IN (19,20);
查询表中数据
select 列名 from 表名 [查询条件]
按特定条件查询:
select 列名称 from 表名称 where 条件;
查询表中所有内容
select * from 表名
/**
*通过表 查询数据 针对多表
*/
select user.id,user.username from user;
/**
*设置列的别名 通过as
*/
select id as userId,username as uname from user;
/**
*分组 group by 列名对应的数据
*/
select 列名 from 表名 group by 列名;
/**
* having 使用聚合函数 比如sum count
*/
select * from test group by id having sum(id)>2
/**
*排序 order by
*desc
*/
select * from user(表名) order by id(根据那一列排序) desc(降序)
/**
*多个条件排序
*先降序 但如果age有相同的,会根据id 将相同的降序排序
*/
select * from user order by age desc,id desc;
/**
*limit 限制 比如:取前三位 、第二位第三位。数据库表从0开始
*/
select * from user limit 3;
select * from user limit 2,2;
子查询
嵌套在查询内部,必须在括号里面
子查询的外层可以是select 、update、 insert、 set
select * from 表1 where 表1列名=(select 表2列名 from 表2);
/**
*比较运算符的子查询
*=、>、<、>=、<=、<>、!=、<=>
*如果子查询中结果有多个可以使用 any some(符合其中一个) all(符合全部)
*通过子查询判断goods_price 是否大于平均值
*/
select goods_id,goods_name,goods_price from tdb_goods where goods_price>= (select round(avg(goods_price),2) from tdb_goods);
//使用all some any
select goods_id,goods_name,goods_price from tdb_goods where goods_price>= all (select goods_price from tdb_goods where goods_cate='超级本');
更新表中的数据
update 表名称 set 列名称=新值 where 更新条件;
update user set name="李四" where id=1;
删除表中的数据
delete from 表名称 where 删除条件;
delete from user where id=1;
DELETE t1 FROM tdb_goods AS t1 LEFT JOIN (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2 ON t1.goods_name = t2.goods_name WHERE t1.goods_id > t2.goods_id;
创建后表的修改
添加列
基本形式: alter table 表名 add 列名 列数据类型 [after 插入位置];
修改列
基本形式: alter table 表名 change 列名称 列新名称 新数据类型;
alter table user change name name CHAR(10) CHARSET utf8 not null;
删除列
基本形式: alter table 表名 drop 列名称;
重命名表
基本形式: alter table 表名 rename 新表名;
删除整张表
基本形式: drop table 表名;
删除整个数据库
基本形式: drop database 数据库名;
约束
1.auto_increment 自增长 和 primary key 一起使用 不能有重复且不能为空
2.unique key 列中不能有重复的值
3.not null 该列不能为空
4.defult 默认值
外键
要求:
1.父表和子表必须使用相同的引擎InnoDB
2.外键和参照列必须数据类型相同
3.外键和参照列必须创建索引
由于父表中id 有auto_prement primary key 自增长主键,所以索引已经创建好了。
但外键列没有创建系统会自动创建。
第一张表
第二张表
修改数据表
alter table 表名 add
//默认添加到最后
alter table student add username char(10) charset utf8 not null default '吖吖';
//添加到age 后面
alter table student add password VARCHAR(32) not null after age;
//添加到最前面
alter table student add name varchar(32) not null first;
//删除单列
alter table student drop name;
//删除多列 逗号隔开 可以同时添加列只要用逗号分开
alter table student drop password,drop username;
//添加主键 constraint 主键的名字(可以添加也可以不添加)
alter table user2 add constraint pk_user2_id primary key(id);
//添加唯一约束
alter table user2 add unique key (username);
//添加外键约束
alter table user2 add foreign key (pid) references provinces(id);
//添加 删除默认值 alter age 要设置的列名
alter table user2 alter age set default 19;
alter table user2 alter age drop default;
//删除主键
alter table user2 drop primary key;
//删除约束 index | key 都可以
alter table user2 drop index pid;
//删除外键 show create table 表名;
alter table user2 drop foreign key 外键名
//修改数据表
alter table 表名 rename 新表名;
rename table 表名 to 新表名
//修改列名
alter table 表名 change 旧列名 新列名 数据类型等 first(最前面)
多表连接
连接类型:内连接 inner join、左外连接 left join 、右外连接 right join
区别:内连接 仅显示符合连接的条件共同的内容
左外连接显示第一张表的所有符合条件内容
右外连接显示第一张表的所有符合条件内容和第二张表不符合条件的内容
多张表连接使用多个inner join
select goods_id,goods_name,cate_name,brand_name,goods_price from tdb_goods as g
inner join tdb_goods_cates as c on g.cate_id=c.cate_id
inner join tdb_goods_brands as b on g.brand_id=b.brand_id;
关联表的方法
(1) 把 一个表的数据写入另一个新表的方法:insert into 表名 select
(1)insert into tdb_goods_cates (cate_name) select goods_cate from tdb_goods group by goods_cate;
(2)新建表的时候直接写入create table tdb_goods_brands
-> (
-> brand_id smallint unsigned primary key auto_increment,
-> brand_name varchar(40)charset utf8 not null
-> )
-> select brand_name from tdb_goods group by brand_name;
(2)连接两张表(记得要修改第一张表的数据类型)
/**
* update 表名 (如果两张比较表的列名相同要起别名(as 别名)或者按表来)inner join 要关联的表名
* on 关联的条件相同的字段 set 更新表的字段
*/
update tdb_goods as g inner join tdb_goods_brands as b on g.brand_name=b.brand_name
-> set g.brand_name=b.brand_id;
(3)记得要修改第一张表的数据类型 让与关联的表数据类型相同
alter table tdb_goods
-> change goods_cate cate_id smallint unsigned not null,
-> change brand_name brand_id smallint unsigned not null;
/**
*将 tdb_goods 表 和 tdb_goods_cates 进行连接
因为tdb_goods表中的goods_cate 和tdb_goods_cates表中的cate_name相同
update 表名 连接类型 连接的表 on 两个表相同的字段 set 改变的字段;
*/
update tdb_goods inner join tdb_goods_cates on goods_cate = cate_name
-> set goods_cate=cate_id;
运算符和函数
1.字符函数(拼接字符串)
/**
*concat
*/
select concat (username,'_',password) from user;
/**
*concat_ws 通过分隔符链接字符串
concat_ws('分隔符','值','值',....)
*/
select concat_ws('_',username,password) from user;
/**
*数字格式化format select format(值,位数);
四舍五入
*/
select format(12000.2333,2); 结果12,000.23
/**
*大写转换小写 lower
*/
select lower(值);
/**
*大写转换小写 upper
*/
select upper(值);
/**
* 从左边起获取几位 left
*/
select left('sfdsf',2)
/**
*从右边起截取几位
*/
select right('fsfssg',3);
/**
*获取字符串长度
*/
select length('sfsf ');
/**
*去除空格
*/
select ltrim(' mysql');
select rtrim('mysql ');
select trim(' mysql ');
/**
*也可以删除特定的字符
leading 领先、前面
trailing 后面、落后
both 前后都删除
*/
select trim(leading '?' from '??mysql?');
/**
*替换 replace
*/
select replace('??mysq?l','?','');
/**
*截取字符串 substring
*/
select substring('mysql',1,2);
/**
*模糊匹配 like
*/
select * from user where username like '%o%';
select * from user where username like '%1%%' escape '1';
如果要匹配的也是% 其中escape表示1后面的那个不是通配符
数值运算符和函数
/**
*向上取整ceil
*/
select ceil(3.01);
/**
*向下取整floor
*/
select floor(3.01);
/**
*整数除法 div
*/
select 3 div 4;
/**
*取余 mod = %
*/
select 4 mod 5;
/**
*幂运算 power
*/
select power(3,3);
/**
*四舍五入 round
*/
select round(3.654,2);
/**
*数字截取 truncate
*/
select truncate(125.89,1);
比较运算符
/**
*在...范围 between ...and...
*/
select 15 between 1 and 22;
/**
*在...之间 in()
*/
select 10 in(5,10,15,20);
/**
*判断 is
*/
select '' is null;
日期时间函数
/**
*当前日期和时间 now()
*/
select now();
/**
*当前日期
*/
select curdate();
/**
*当前时间 curtime();
*/
select curtime();
/**
*日期变化 date_add();
*/
select date_add('2014-3-12',interval 365 day);
select date_add('2014-3-12',interval -365 day);
select date_add('2014-3-12',interval 2 month);
/**
*日期差值 datediff
*/
select datediff('2013-3-12','2014-3-12');
/**
*日期格式转换 date_format
*/
select date_format('2014-3-12','%m/%d/%Y');
信息函数
/**
*链接id connection_id()
*/
select connection_id();
/**
*最后插入数据的id号
表中必须存在id
*/
select last_insert_id();
/**
*当前的数据库database()
*/
select database();
/**
*当前用户user()
*/
select user();
/**
*版本信息 version()
*/
select version();
聚合函数—只能返回一个值
加密函数
自定义函数
/**
不带参数的
*returns返回值类型 return 返回值
*/
create function f2() returns varchar(30) charset utf8 return date_format(now(),'%Y年%m月%d日%H点:%i份:%s秒');
select f2();
/**
*带参数
*/
create function f3(num1 smallint unsigned,num2 smallint unsigned) returns float(10,2) unsigned return (num1+num2)/2
select f3(5,10);
MySQL存储过程
delimiter 修改结束符
存储过程的优点:
1.增强了sql语句的灵活性和功能
2.实现较快的执行速度
3.减少了网络流量
创建存储过程
MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类型…])
IN 输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:调用时指定,并且可被改变和返回
如果结构中有两个以上的条件使用begin…end
调用存储过程 call 名字();
/**
*不带参数的存储过程
*/
create procedure sq1() select version();
call sq1();
/**
*带参数
*/
create procedure removeUserById(IN id int unsigned)
-> begin
->delete from tdb_goods where goods_id=id;
->end
->
/**
*返回结果 输出参数
*/
create procedure removeUserAndReturnUserNums(IN p_id int unsigned,out userNums int unsigned)
->begin
->delete from tdb_goods where goods_id=p_id;
->select count(goods_id)from tdb_goods into userNums; 返回数量并且插入到userNums
->end
call removeUserAndReturnUserNums(3,@nums);
/**
*删除存储过程
*/
drop procedure 存储过程名
数据库相关知识完善中…….见谅