数据库意义
1.解放双手,在重复操作文件,直接将命令发送给mysql服务端,自动操作
2.数据库,表,行
3.开户和授权
在授权时推荐加引号
密码必须用
其他,推荐用
4.客户端连接(mysql提供的客户端)
也可以用python操作mysql
1.
mysql -u root -h 192.168.1.1 -p 3306
#输入密码
SQL语句
数据库级别
show databses;
create databses 数据库名称;
utf-8
CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci; COLLATE utf8_general_ci是一个排序
gbk
CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; gbk 类似
表级别
数据行级别
SQL语句
数据库级别
USE 数据库名称;
drop databse 数据库名称;
表级别
show tables;
desc tb1;
***create tables XXX(nid int);#创建表
# 事务,原子操作(两步操作当成一个,失败回滚)(引擎要改为innodb)
例create table tb4(
nid int not null auto_increment primary key,
num int)engine=innodb default charset=utf8;#自增列必须是个索引
a.默认值
b.是否可以为空
c.自增列(一张表只能有一个,数字,必须是索引-主键)
d.主键索引:(一般是和自增一起用)
一张表只能有一个主键,唯一的,不能重复的,且不能为null.-一般情况下会将自增列设为主键;
1,2,3,4
唯一索引:
唯一列:
可以为null,一张表可以有多个唯一列
1,2,3,null
--约束
--索引,加速查找
create table XXX(
nid...primary key,
...
)
例子1
create table student(
name varchar(10) not null,
num int not null,
age int,
gender int,
primary key (name,num)
)
约束:
name num age
a 88 9
a 99 9
# 主键:
不能为null
不能重复,
一张表只有一个主键(可以多列)
# 一般用法:
nid int auto_increment primary key,(创建表时创造一个自增列当做主键)
简便方法:create table 表名(
nid int not null auto_increment primary key,
name varchar(16)
age int default 19
)engine=innodb default charset=utf8;
例子2:
创建一张表,表中职位一栏用数字代替,然后建立另一张表,数字和职位关联;
create table userinfo(
nid int not null auto_increment primary key,#自增列
name varchar(10),
age int,
part_nid int)engine= innodb default charset=utf8;
create table part(
nid int not null auto_increment primary key,#自增列
caption varchar(20)engine=innodb default charset=utf8;#?
1.insert into part(caption) values('IT');
2.insert into part(caption) values('AA');#创建部门
insert into userinfo(name,age,part_nid)values('h',19,1);#创建人
insert into userinfo(name,age,part_nid)values('h',19,3);#其中数字为部门
问题:创建部门需要给个限制,防止人物表出现未关联的部门.
外键:
alter table userinfo add constraint fk_u_p foreign key userinfo(part_nid) references part(nid);#外键约束 fk_u_p是外键名称
--约束
--foreign key,一对多(一个部门多个员工)
drop table XXX;#直接删除表
delate from XXX;#清空表内容(自增不会回到原点)
truncate table XXX;#清空表内容(会使自增列回原点)
select * from XXX;#查看表的内容
update XXX set part_nid=2;#更新表中nid的内容全为2
alter table userinfo add constraint fk_u_p foreign key userinfo(part_nid) references part(nid);#外键约束 fk_u_p是外键名称
数据行级别
select * from XXX;#查看表的内容
www.cnblogs.com/wupeiqi/articles/5713315.html
数据类型:
数值.时间和字符串
数值:
bit 二进制
tnyint
smallint
int
bigint
- 范围不一样
decimal(十进制的小数)--精确的
create table tb3(num decimal(6,2))#8888.18 六位数,两位小数点
字符串:
#定长
char
create table tb13(n char(7))会创建7个位置的数据,仅仅只有7位,超过会截取,过少也会占空间
insert zzzz
#变长
varchar
create table tb13(n varchar(7))7是占用空间最大数,可节省空间,但是比char效率低(例:有多个列的时候,定长可以直接跳过k个位置,而变长还需计算)
二进制数据:
TinyBlob.Blob.MediumBlob.LongBlob#例上传文件时,一般不会吧文件保存在数据库里,而是路径保存
时间:仅一下几种(格式+例子)
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS('-838:59:59'/'838:59:59')
YEAR
YYYY(1901/2155)
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
枚举和集合
enum
枚举类型,
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.)
示例:
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'),('polo shirt','small');
例子:#创建了一个枚举 (会放到内存里)
enum week:
x='星期一'
y='星期二'
z='星期三'
例子2:
CREATE TABLE shirts(
name VARCHAR(40),
size ENUM('x-small','small','medium','large')
);
INSERT INTO shirts(name,size)VALUES('dress shirt','large');
只能单选
set
集合类型
A SET column can have a maximum of 64 distinct members.
示例:
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
能多选
text
mediumtext
longtext
FLOAT--比如插入特别大的数,以
DOUBLE--
创建一张表 无符号
create table tb2(num int unsiged)
insert into tb2(num) values(-9)会报错,因为不允许有负数存在
数据行级别
select * from XXX;#查看表的内容
insert into tb1(name,age) values('alex',18);#添加数据
#增
insert into tb1(name,age) values('alex',18);#添加数据
insert into tb1(name,age) values('alex',18),('eric',19);#添加多条数据
insert into tb1(name,age) selectcaption,age from tb2;#由表2添加数据(类型要相对应)
#删
#改
#查
#其他
www.cnblogs.com/wupeiqi/articles/5713315.html
1、增
insert into 表 (列名,列名...) values (值,值,值...)
insert into 表 (列名,列名...) values (值,值,值...),(值,值,值...)
insert into 表 (列名,列名...) select (列名,列名...) from 表
2、删
delete from 表
delete from 表 where id=1 and name='alex'
3、改
update 表 set name = 'alex' where id>1
4、查
select * from 表
select * from 表 where id > 1 (少用*,因为效率低,可以通过一个个打出来)
select nid,name,gender as gg from 表 where id > 1
5、其他
a、条件
select * from 表 where id > 1 and name != 'alex' and num = 12;#支持条件语句
select * from 表 where id between 5 and 16;
select * from 表 where id in (11,22,33)
select * from 表 where id not in (11,22,33)
select * from 表 where id in (select nid from 表)
b、通配符#模糊搜索
select * from 表 where name like 'ale%' - ale开头的所有(多个字符串)
select * from 表 where name like 'ale_' - ale开头的所有(一个字符)
select * from 表 where name like '%le%' - 只要有'le'的所有(多个字符串)
select * from 表 where name like '_le%' - le前面任意的所有(多个字符串)
c、限制
select * from 表 limit 5; - 前5行
select * from 表 limit 4,5; - 从第4行开始的5行
select * from 表 limit 5 offset 4 - 从第4行开始的5行
d、排序
select * from 表 order by 列1 asc - 根据 “列1” 从小到大排列
select * from 表 order by 列2 desc - 根据 “列2” 从大到小排列
select * from 表 order by 列3 desc,列2 asc - 根据 “列3” 从大到小排列,如果列3有重复内容则按列2从小到大排序
e、分组
select num from 表 group by num
select num,nid from 表 group by num,nid
select num,nid from 表 where nid > 10 group by num,nid order nid desc
select num,nid,count(*),sum(score),max(score),min(score) from 表 group by num,nid#聚合函数,其中max(score)为nid分类下的最大值
select num as a,nid as b from 表 group by num,nid 把num取名为a ,nid取名为b
select num from 表 group by num having max(id) > 10#对聚合条件进行筛选时一定要用having
特别的:group by 必须在where之后,order by之前
f、连表#两张表,第一张表被称为主表,后面的表成为迎合第一张表的副表
无对应关系则不显示
select A.num, A.name, B.name
from A,B
Where A.nid = B.nid#第一种连表形式 where
无对应关系则不显示
select A.num, A.name, B.name
from A inner join B
on A.nid = B.nid#第二种连表形式 join on
A表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name
from A left join B
on A.nid = B.nid#left jion(优先用,因为效率高)
B表所有显示,如果B中无对应关系,则值为null
select A.num, A.name, B.name
from A right join B
on A.nid = B.nid#inne join 相当于对left jion进行过滤,不会出现null
g、组合
组合,自动处理重合
select nickname
from A
union#会自动去重
union all#不去重
select name
from B
组合,不处理重合
select nickname
from A
union all
select name
from B