创建数据库 crate database name;
创建一个值得字符集的数据库
create database name character set utf8; //指定utf8类型的数据库
更改字符集 alter database name character set gbk; //改为了gbk字符集
创建校对规则: 用于排序 如张三李四 可以按照拼音、笔画排序
create database name character set utf8 collate uff8_unicode_ci;
显示创建数据库 show databases;
切换数据库 use name; //切换到name数据库
查看当前正在应用的数据库 select database(); //显示出当前数据库 名字
删除数据库 drop database name;
表创建操作
create table users(表名)(
id int,
name varchar(40),
password varchar(40),
birthday date
);
表的数据类型中,除了char 、varchar 必须指定长度,其它类型都有默认长度
mysql常用的数据类型
字符串型 VARCHAR、CHAR
char定长 char(8) ---- 向数据库存入hello 存为hello+3个空格
⼤大数据类型 BLOB、TEXT
text 文本类型数据,主要存储字符文件 --- 文本文件
blob 二进制文件 ,存储任何类型文件(音乐、电影);longtext longblob 最大可以保存4GB文件
数值型 TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE
tinyint (byte) smallint(short) int(int) bigint(long)
逻辑性 BIT
bit(8)表示8位 bit(32)表示32位相当于 int
日期型 DATE、TIME、DATETIME、TIMESTAMP
date 只能保存日期
time 只能保存时间
datetime 日期和时间都有
timestamp 日期和时间都有,自动更新到当前时间
通过desc语句 查看表结构
语法:desc 表名;
单表约束条件:
主键约束(唯一标识一条记录)---- primary key 不能为空、不能重复 一般自动增长 mysql为 auto_increment
唯一约束(该字段内容不允许重复)----- unique 一张表只有最重要那个字段才能作为主键
非空(值不能为空)----- not null
create table employee (
id int primary key not null auto_increment ,
name varchar(40) unique not null,
gender varchar(10) not null,
);
表操作
向已有数据表添加一列 : alter table 表名 add 列名 类型(长度) 约束;
修改已有数据表一列类型、长度: alter table 表名 modify 列名 类型(长度) 约束;
修改已有数据表一列的名称 : alter table 表名 change 旧列名 新列名 类型(长度) 约束;
删除已有一列 : alter table 表名 drop 列名;
修改表名: rename table 旧表名 to 新表名;
修改表的字符集: alter table student character set utf8;
表删除 drop table 表名;
show tables; 查看当前数据 中所有表
向表中添加一列: alter table employee add image varchar(255);
修改一列的长度、类型 alter table employee modify job varchar(60) not null;
修改一列的名字 alter table user change name username varchar(40) unique not null;
删除一列。 alter table employee drop gender;
修改表名。 rename table employee to user;
修改表的字符集为 alter table user character set utf8;
show create table user; 显示表user的信息
表数据操作
表中插入数据
1,insert into employee(id,name,birthday) values(null,'zs','1990-01-10');字符串添加单引号 字符、日期单引号
2,insert into employee(name) values('zs'); //只插入部分
3,insert into employee values(null,'lisi',null); //第一种简写
mysql有六处使用了字符集,分别为:client 、connection、database、results、server 、system。
服务器端相关:database server system(永远无法修改 就是utf-8)
客户端相关 connection client results
解决中文插入乱码问题:将客户端相关三个编码集设置 gbk
set names gbk; ----- 快速设置客户端相关三个编码集
修改mysql 配置文件,永久改变客户端编码集 ----- mysql/my.ini
[mysql] ---- 客户端配置 //修改后注意重启mysql服务
[mysqld] ---- 服务器端配置
记录修改操作
update 表名 set 列名=值,列名=值 where条件语句
update employee set salary = 3000 where name = 'zs';
条件比较前添加 binary 使比较更加精确严格,否则,'ZS '也会被当成‘zs'
update employee set salary = salary+1000 where name = 'wangwu'; //对salary进行加1000操作
没有where语句,对所有数据行进行更新
update employee set salary = 5000 ; //所有人的工资设为5000
表数据删除
delete from 表名 where 条件语句;
delete from employee where name = 'zs';
truncate employee; delete from employee; //删除整个表数据
truncate 删除记录后不可恢复的,不受事务管理,原理:删除整个表,delete可以rollback;回滚恢复
表数据查找
SELECT *|column1, column2. column3 FROM table;
select * from student; //查询所有列
select name from student; //查询名字列
select distinct name from student; //查询结果 不显示重名,distinct去重复
查询时运算
select name,math+chinese+enlish from student; //查询姓名 和总分 也可以加数字 math+10
查询时更改列名 as ;as可以省略
select name as 姓名 from student; //列 改名为 姓名
select name 姓名 from student;
查询时筛选 比较
select name from student where math > 90;
select name from studetn where name like '李%';取出所有姓李的
select name from studetn where name like '李_';取出姓李的 名字两个字的
and 和 or运算优先级 ; and的高,先执行
查询时排序 order by 列 asc|desc; asc升序 desc降序
select name from student order by math desc; //按照数学高到低排序
表函数
count 返回查询结果的条数
select count(*) from student where math > 90; //查询数学大于90 的人数
sum对一列求和
select sum(math) from student ; //查询数学总分
avg 求一列的平均值
select avg(math) from student; //求平均值 ;注意 null不参与运算
max,min 找出一列中最大最小的值
select max(math) from student; //找出数学成绩最高的
表查询分组
group by 列; 筛选 having;
select name from student group by class having math > 80; //选出数学大于80 的名字 按照班级分组
多表查询
内连接:将两张表相同意义字段连接起来
语法:select * from a inner join b on a.id = b.id;
简化:select * from a,b where a.id = b.id;
外连接:用一个表的查询数据去查询另一个表
表a 表b
select * from a left outer join b on a.A_ID = b.A_ID ; //先查询a表 然后 用a表 A_ID 去查表b 有写出,没有为null
select * from a right outer join b on A.A_ID = B.A_ID ;
全连接 mysql不支持 可以使用union 合并且去掉重复的
select * from A left outer join B on A.A_ID = B.A_ID
union
select * from A right outer join B on A.A_ID = B.A_ID;
关联子查询:将第一个查询结果 ,作为第二个查询条件
select name from student where age = (select max(age) from student); //年龄最大学员的名字