sql 基础语句




'''
一、数据库管理系统DBMS
软件,
bin
config
db = 保存数据
- admin
-随机字符串 封装了【user,pwd,class】
- course
- school
main or src

写程序:
a:数据库在本地
1、找到目录
2、添加数据
3、找到数据
b:数据库在远程
1、socket连接上远程机器
2、cocket发送(命令) #add|数据名

做些什么????
a、
1 程序
程序 socket客户端
2 数据
socket_server
3 制作一套规则
add|增删改查
4 socket:server or client 用户认证 授权 限制

有人做了DBMS:(就是以上做了什么)
-- SqlServer(收费的)
-- oracle ,sqlite,access。。。
一般都在MySQL

Mysql:
server端 and client端

二,下载安装
1 下载
2 解压
3 服务器端运行起来
mysqld
4 客户端连接
net start mysql
net stop mysql

三、 mysql数据库:
1 概念
数据表,文件
数据行,文件中的一行数据
数据库,文件夹
2 mysql命令:
show databases; 查看当前mysql都有哪些数据,根目录都有哪些文件夹
create database; 创建库名,创建文件夹
use 数据库名; 使用选中数据库,进入目录
show tables; 查看当前数据库下都有哪些表
create table 表名(nid int,name 字符串varchar(20 最多20个,如有25 20后面的就扔了),
pwd varchar(64个字符));创建数据库表
select * from 表名‘; 查看表中的所有数据
insert into 表名(nid,name,pwd) values(1,'alex','123'); 插入数据
-- select * from 表名; 查看表中的所有数据

四、用户授权:
用户管理的时候有特殊命令:
创建用户:
create user '用户名'@'ip地址' identified by '密码';
删除用户:
drop user '用户名'@'ip地址';
修改用户:
rename user '用户名'@'ip地址' to ‘新用户名’@‘ip地址’;
修改密码:
set password for ‘用户名’@‘IP地址’ = Password(‘新密码’)

登录默认是local 如果是127.0.0.1 的话 需要在-u 后面加上 -t 127.0.0.1 -p 在输入密码登录

初试:
show databases; # 查看当前Mysql都有那些数据,根目录都有那些文件夹
create database 数据库名; # 创建文件夹
use 数据库名; # 使用选中数据库,进入目录
show tables; # 查看当前数据库下都有那些表,
create table 表名(nid int,name varchar(20), pwd varchar(64)); # 创建数据库表
select * from 表名; # 查看表中的所有数据
insert into 表名(nid,name,pwd) values(1,'alex','123'); # 插入数据
-- select * from 表名;

权限管理:
grant 权限 on 数据库,表 to ‘用户’@‘ip地址’ --授权 把这个数据库,表 的什么权限 赋给用户
select 查权限
数据库,表
test。tb1 只能查看
test。* test里的全部
*。* 全部
‘用户’@‘ip地址’
xiaohu@localhost

===================重要,远程连接=======================

a 解放双手 自己不用操作文件 直接将命令发送给mysql服务端 自动操作
b 数据库 表 行
c 开户,授权
没有特殊字符 不用加“”
推荐大家用“”
密码必须用“” 其他的推荐用
d 客户端连接(mysql提供的客户端)
1 mysql -u root -h192.168.1.1 -P 3306 -p
pwd:输入密码

2 show databases; 查看当前mysql都有哪些数据,根目录都有哪些文件夹
create database; 创建库名,创建文件夹
use 数据库名; 使用选中数据库,进入目录
show tables; 查看当前数据库下都有哪些表
create table 表名(nid int,name 字符串 varchar(20 最多20个,如有25 20后面的就扔了),
pwd varchar(64个字符));创建数据库表
select * from 表名‘; 查看表中的所有数据
insert into 表名(nid,name,pwd) values(1,'alex','123'); 插入数据
-- select * from 表名; 查看表中的所有数据

3 ;;;;;;;;;


五、sql语句:
数据库级别
show databases;
create database 数据库名称;
create database 数据库名称 default charset utf8 collate utf8_general_ci;
usr 数据库名称;
drop database 数据库名称

表级别
show tables;
desc tb1; 看数据库的基本结构

***create table tb1(nid int, name varchar(10)); 创建表
create table 表名(
列名 类型 是否可以为空,not null 不可以为空
列名 类型 是否可以为空 null 可以为空
)ENGINE=InnoDB DEFAULT CHARSET=utf8 设置引擎
InnoDB == 事务,原子操作 装逼
事务 就是 a加钱 b减钱 如果a,b 都完成 则事务成立 如果有一个未完成 则失败 返回原点 不加不减 回滚

默认值, 创建列时可以指定默认值,当插入数据时如果为主动设置 则自动添加默认值
create table tb1(
nid not int null default 2, 不能为空 为空有默认值
num int not null。 不能为空
)ENGINE=InnoDB DEFAULT CHARSET=utf8 设置引擎

****重要*****
自增:
create table tb1(
nid not int null auto_increment primary key, auto_increment自增
num int not null。
)ENGINE=InnoDB DEFAULT CHARSET=utf8
a 默认值
b 是否可以为空
c 自增列(一张表只能有一个自增列,数字,必须是索引-主键)
d 主键索引: 主键是跟别人不一样 主要的键
create table tb1(
nid not int null auto_increment primary key, primary key 主键索引
num int not null。
)ENGINE=InnoDB DEFAULT CHARSET=utf8
一张表只能有一个主键,也是自增的并且唯一的不能重复的并且不能为null,一般情况下,会将增列设置成主键
1,2,3,4,5,6,7
create table student(
#nid int not null auto_increment key, 不能为空 自增的一列数据
name varchar(10) not null,
num int not null,
age int,
gender int
primary key(name,num) 两列联合做主键 从约束的角度看
)NGINE=InnoDB DEFAULT CHARSET=utf8
约束:
name num age
a 88 9
a 99 9
a 88 0
主键:
不能null
不能重复
一张表只有个主键(可以多列组成主键)
一般用法:
#nid int not null auto_increment key 不能为空 自增的一列数据

唯一索引:
唯一列可以为null,一张表可以有多个唯一列
1,2,3,4,5,6,7,null

-- 约束
-- 都叫索引 查找速度都非常快

最后不能加逗号 否则报错


drop table tb1;删除表
delete from tb1; 清空表的内容
truncate table tb1;清空内容 有点不一样 性能高 速度快 可以从1开始

select * from tb1; 查询

数据行级别 *****重要
select * from tb1; 查询

外键:
创建外键
create table 表名;
nid 。。。。
name 。。。。
constraint fk_新建表名 foreign key 需要关联的表(列nid) references 和被关联的表(的列nid)
比如是公司部门用数字代替 如2 nid列的2 是公关部
--2是被(被关联表约束)

还可以直接创建外键 直接创建关联
create table 表名;
nid 。。。。
name 。。。。
constraint fk_新建表名 foreign key (列nid) references 和被关联的表(的列nid)
不用写需要关联的表 是因为建立的就是自己的列 只需要写上列即可

foreign key; 一个部门对多个员工

两张表建立约束,
防止脏数据的产生 约束

增加列
alter table 表名 add 列名 类型
删除列
alter table 表名 drop column 类型
修改列
alter table 表名 modify column 列名 类型, -- 类型
alter table 表名 change 原列名 新列名 类型, -- 列名,类型
添加主键
alter table 表名 add primary key(列名);
删除主键
alter table 表名 drop primary key;
alter table 表名 modify 列名 int,drop primary key;
添加外键
alter table 需要关联的表 add constraint 外键名称(形如fk_需要关联的表_被关联的表) foreign key 需要关联的表(列) references 被关联的表(列)
删除外键
alter table 表名 drop foreign 外键名称(形如fk_需要关联的表_被关联的表)
修改默认值就是给某个列增加默认值
ALTER TABLE testalter_tb1 ALTER i SET DEFAULT 1000;
这个表名 i=列名 等于1000
删除默认值
ALTER TABLE testalter_tb1 ALTER i DROP DEFAULT;

mysql 基本数据类型
数值:
正数:
bit 二进制 m=表示长度有多少位
tinyint:默认是有符号的
无符号的是正数0-255 创建无符号create table 表名(num int unsigned)
有符号的可能是负数-128-127 创建有符号create table 表名(num int)没有unsigned
smallint
int
bigint
-- 以上都是范围不一样

小数:
decimal 比如发工资 扣社保 有小数 --精确的 内部存的是字符串
create table tb14(num dacimal(6,2)) 最多有6位有效数字 ,2 是有几位小数 如 8888.18 小数后还有就四舍五入
FLOAT 数值越大 越不精准 不靠谱 一般都用不到
DOUBLE 数值越大 越不精准 不靠谱 一般都用不到
字符串:
定长
char 跟其他都有区别 最大255
create table tb13(n char(7)) 只会给你留有7位的位置
insert ssss 有面3位是空的 但是是留位置的
变长
create table tb13(n varchar(7))
给你留7个位置 但是用不了 就只会占所写的空间
varchar 最大255
text
mediumtext
longtext
定长浪费空间查找速度快 变长节省空间 查找相对速度慢

二进制数据:
TinyBlob blob MediumBlob LongBlob
图片 或者 视频
varchar(65)将上传文件保存在硬盘上 比如保存在D盘 保存路径就可以了 以后用在读取就可以了

时间:
TATE:
YYYY-MM-DD(1996-12-12)
TIME:
HH:MM:SS('-838:59:59'/'838:59:59')
DATETIME:
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:29:59 Y)
TIMESTAMP:
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

enum枚举:
不重要
单选: 跟excel 有效性 差不多
集合 :SET但是可以写多个值也就是多选

*********重点***********
数据行级别
select * from tb1;
insert into 表名(name,age) values(‘alex’,18);

增:
insert into 表名(name,age) values(‘alex’,18),('eric',19);插入多条数据
重要在这
create table tb1(
nid int auto_increment primary key,
name varchar(20),
age int)engine=innodb default charset=utf8;
创建好几个表
插入表:
insert into tb1(caption,gender)values(‘alex’,1),(‘eric’,2),。。。。。。。
向把TB1 导入 TB2
只导入前两条
insert 表名(列名,列名,。。。) select 列名,列名,。。。 from 表名;select 不要括号

删:
delete from 表名 where nid=3 and name=’行的名字‘; where是查找条件
这里
delete from 表名 where nid=3 or name=’行的名字‘; where是查找条件
有 and or > < >= <= !=

改:
updata 表名 set age=2;
updata 表名 set age=2 where nid=10;
updata 表名 set name=’opop‘,age=2 where nid>12;
updata 表名 set name=’opop‘,age=2 where nid>12 and 1=1;

查:select*效率低, 全拿就写一遍列名
select * from 表名 where nid>12 and name=’内容‘;
select name,age,nid from 表名 where nid>12 and name=’内容‘;

其他:
条件:
Select * from table where id between 5 and 16. 把5-16的数全拿出来
通配符:
Select * from table where name like 'ale%"- ale开头的所有(多个字符)
Select * from table where name like 'ale_"- ale开头的所有(一个字符)
分页:
select * from limit 前几条;
select * from limit 起始位置,一次取多少条;
select * from limit 5 offset 4;倒序
排序:
select * from 表名 order by nid asc;asc从小到大 desc从大到小 好记 a到c正序 d到c 倒序
select * from 表名 order by name desc,nid desc; nid和name都倒序

****重要****分组: 去重
select 列名 from 表名 group by 列名;
select 列名,max(列名) from 表名 group by 列名; max取最大值
select 列名,min(列名) from 表名 group by 列名; min取最小值
select 列名,sum(列名) from 表名 group by 列名; sum取和
select 列名,count(列名) from 表名 group by 列名; count取几个
select 列名,avg(列名) from 表名 group by 列名; 取平均数
select 列名,count(列名) as a, from 表名 group by 列名; count计数
a=起名表头
select distinct 列 from 表名;也是去重
*****重要*****
根据聚和条件筛选不能用where
*****根据聚和条件筛选应该用having
select 列名 from 表名 group by 列名 having count(列名)>1;

联合:
select 列名 from 表名 union select 列名 from 表; 打印在一列 默认去重复
select 列名 from 表名 union all select 列名 from 表; 打印在一列
不去重

******最最最最重要******
连表操作:
1.联表形式
select * from 表名,表名;表1 7条数据 表2 4条数据 这样打印,会使表1的7条数据每条打印4遍
select * from 表名,表名 where 表1.列名=表2.列名; 这样打印就可以 把对应的数字代表那个部门 打印出来
2.join
select * from 表名1 left join 表名2 on 表1.列名=表2.列名;那个表在前面就显示全部也就是主表 没有就null进行补
优先用left left=以左面为主表
select * from 表名1 inner join 表名2 on 表1.列名=表2.列名;
inner join=永远不出现null,并且那个表在前面都行




。。。。。。。整理重点。。。。。。。。sql 语句pycharm没有语句提示 必须都会
1,数据库的概念,很多软件
2,什么是数据库,表,行
3.服务端运行起来就是个socket server
-启动服务端
-启动客户端
-用户管理
-权限管理

4.sql语句
数据库操作 *
表操作 **
- 是否可以为空
- 默认值
- 主键
- 外键
- 自增
- 数据类型(char和varchar的区别)
数据行:***** 必须全部会
增删改查 必须会
limit offset 必须会
left join 必须会
order by
group by , having max,min,sun,count
条件,模糊匹配必须会


***********重点***********
1.增删改查
2.其他
分组:
group by
group by having 集合条件
分页:
limit
连表:
left join
inner join
排序:
desc
asc
order by
union:
> < = >= <= !=
in
not in
in
连表,外键:****重要的******
一对多的关系

回顾:
用户管理

权限管理(*****远程******)

命令:
数据库
增删改查
数据表
增删改查 主键 外键 是否可以为空 默认值 自增 数据类型(char varchar) char定长 varchar变长
时间
数据行:
left join inner join 连表
分组:
group by distinct 分组 having 条件
排序:
order by 排序
分页:
limit 0,1
临时表:
as 临时列名































'''
原文地址:https://www.cnblogs.com/xuexihainan/p/12543683.html