标签:rac error 服务器 etc dep cad 信息 date enc
1、sql语句
库,表,记录的增删改查
2、库详细操作
3、表详细操作
创建表
数据类型
完整性约束
1、数据库是什么?
数据库本质就是一个C/S的套接字软件
常见的数据库:
关系型:
mysql
mariadb
oracle
db2
sqlserver
非关系:
存取数据都是以key:value
mongodb
redis
memcache
2、数据库相关概念
数据库服务器:运行有数据库管理软件的计算机
数据库管理软件mysql:就是一个套接字服务端
库:就是一个文件夹
表:就是一个文件
记录:就相当于文件中的一行内容(抽取事物一系列典型的特征拼到一起,)
数据:用于记录现实世界中的某种状态
破解密码
#1、关闭mysql net stop mysql #2、重新启动 mysqld --skip-grant-tables #3 mysql -uroot -p update mysql.user set password=password("egon123") where user="root" and host="localhost"; flush privileges; #4、关闭mysql,正常启动 net start mysql
基本SQL语句
文件夹:库
增
create database db1 charset utf8;
删
drop database db1;
改
alter database db1 charset gbk;
查
show databases;
show create database db1;
文件:表
切换文件夹
use db1;
select database(); 查看当前所在的库
增
create table t1(id int,name char);
create table db1.t1(id int,name char);
删
drop table t1;
改
alter table t1 add age int;
alter table t1 modify name char(15);
alter table t1 change name NAME char(15);
alter table t1 drop age;
查
show tables;
show create table t1;
desc t1;
文件内的一行行内容:记录
增
insert into t1(id,name) values
(1,‘egon‘),
(2,‘lxx‘),
(3,‘alex‘);
删
delete from db1.t1 where id >= 2;
create table t2(id int primary key auto_incremnt,name char(15));
insert into t2(name) values
(‘egon‘),
(‘lxx‘),
(‘wxx‘),
(‘axx‘);
清空表应该使用:
truncate t2;
改
update db1.t1 set name=‘lxx_dsb‘ where id=2;
查
select id from db1.t1;
select id,name from t1
select name,id from t1;
select * from t1;
select * from t1 where id >= 2;
表详细操作
一、创建表的完整语法
#语法:
create table 库名.表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
约束条件:是在数据类型之外对字段附加的额外的限制
#注意:
1、最后一个字段之后不能加逗号
2. 在同一张表中,字段名是不能相同
3. 宽度和约束条件可选,字段名和类型是必须的
二、数据类型
#1、整型:默认是有符号的
create table t3(x tinyint);
ps:修改sql_mode为严格模式,必须重启客户端才能生效
set global sql_mode="strict_trans_tables";
select @@sql_mode;
create table t4(x tinyint unsigned);
# 强调:整型类型后面的宽度限制的根本不是存储宽度,限制的是显示宽度
create table t5(id int(1));
create table t6(id int(5));
#2、浮点型:
float(255,30)
double(255,30)
decimal(65,30)
create table t8(x float(255,30));
create table t9(x double(255,30));
create table t10(x decimal(65,30));
insert into t8 values(1.111111111111111111111111111111);
insert into t9 values(1.111111111111111111111111111111);
insert into t10 values(1.111111111111111111111111111111);
3、日期类型
year 1999
date 1999-11-11
time 08:30:00
datetime/timestamp 1999-11-11 08:30:00
create table student(
id int primary key auto_increment,
name char(16),
born_year year,
birth date,
class_time time,
reg_time datetime
);
insert into student(name,born_year,birth,class_time,reg_time) values
(‘egon1‘,now(),now(),now(),now());
insert into student(name,born_year,birth,class_time,reg_time) values
(‘egon1‘,2000,20001111,now(),now());
insert into student(name,born_year,birth,class_time,reg_time) values
(‘egon1‘,2000,‘2000-11-11‘,083000,now());
insert into student(name,born_year,birth,class_time,reg_time) values
(‘egon1‘,2000,‘2000-11-11‘,"08:30:00",20171111111111);
insert into student(name,born_year,birth,class_time,reg_time) values
(‘egon1‘,2000,‘2000-11-11‘,"08:30:00","2017-11-11 11:11:11");
create table t11(x timestamp);
create table t12(x datetime not null default now());
4、字符类型
# 注意:宽度指限制的是字符个数
char:定长
char(5)
varchar:变长
varchar(5)
相同点:宽度指的都是最大存储的字符个数,超过了都无法正常存储
不同点:
char(5):
‘m‘--->‘m ‘5个字符
varchar(5)
‘m‘--->‘m‘1个字符
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
注意:mysql在查询时针对where 字段="值 "会忽略掉右面的空格,即where 字段="值"
如果时like模糊匹配就不会忽略右面的空格了
char(5)
egon |axx |lxx |fm |
varchar(5)
1bytes+egon|1bytes+axx|1bytes+lxx|1bytes+fm|
# 宽度相关练习
mysql> create table t13(x char(5));
Query OK, 0 rows affected (0.20 sec)
mysql> create table t14(x varchar(5));
Query OK, 0 rows affected (0.27 sec)
mysql>
mysql>
mysql> insert into t13 values(‘xxxxxx‘);
ERROR 1406 (22001): Data too long for column ‘x‘ at row 1
mysql> insert into t14 values(‘xxxxxx‘);
ERROR 1406 (22001): Data too long for column ‘x‘ at row 1
5、枚举与集合类型
枚举enum(‘a‘,‘b‘,‘c‘):多选一
集合set(‘a‘,‘b‘,‘c‘):多选多
create table emp(
name varchar(15),
sex enum(‘male‘,‘female‘,‘unkown‘),
hobbies set(‘read‘,‘music‘,‘yinshi‘,‘play‘)
);
insert into emp values
(‘zhangming‘,‘xxx‘,‘xxxx‘);
mysql> insert into emp values(‘zhangming‘,‘female‘,‘read,play‘);
Query OK, 1 row affected (0.03 sec)
mysql> select * from emp;
+-----------+--------+-----------+
| name | sex | hobbies |
+-----------+--------+-----------+
| zhangming | female | read,play |
+-----------+--------+-----------+
1 row in set (0.00 sec)
表的完整性约束
一、创建表的完整语法
#语法:
create table 库名.表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
约束条件:是在数据类型之外对字段附加的额外的限制
#注意:
1、最后一个字段之后不能加逗号
2. 在同一张表中,字段名是不能相同
3. 宽度和约束条件可选,字段名和类型是必须的
二 not null与default
create table t1(
id int primary key auto_increment,
name varchar(16) not null,
sex enum(‘male‘,‘female‘) not null default ‘male‘
);
insert into t1(name) values(‘egon‘),(‘lxx‘),(‘alex‘);
三 unique key
create table t2(x int unique);
create table t3(
x int,
y varchar(5),
unique key(x)
);
create table t4(
x int,
y varchar(5),
constraint uni_x unique key(x)
);
create table service(
ip varchar(15),
port int,
unique key(ip,port)
);
insert into service values
(‘1.1.1.1‘,3306),
(‘1.1.1.1‘,3306);
四 primary key
站在约束角度看primary key=not null unique
以后但凡建表,必须注意:
1、必须有且只有一个主键
2、通常是id字段被设置为主键
create table t5(
id int primary key auto_increment
);
# 补充存储引擎:
create table t12(x int)engine=‘myisam‘;
create table t13(x int)engine=‘innodb‘;
create table t14(x int)engine=‘memory‘;
create table t15(x int)engine=‘blackhole‘;
五 foreign key:限制关联表某一个字段的值必是来自于被关联表的一个字段的
# foreign key注意:
# 1、被关联的字段必须是一个key,通常是id字段
# 2、创建表时:必须先建立被关联的表,才能建立关联表
create table dep(
id int primary key auto_increment,
dname varchar(20),
info varchar(50)
);
create table emp(
id int primary key auto_increment,
name varchar(15),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);
# 3、插入记录时:必须先往被关联的表插入记录,才能往关联表中插入记录
insert into dep(dname,info) values
(‘IT‘,‘技术能力有限部门xxx‘),
(‘Sale‘,‘文化程度不高‘),
(‘HR‘,‘招不到人部门‘);
insert into emp(name,age,dep_id) values
(‘egon‘,18,1),
(‘alex‘,28,2),
(‘wsj‘,38,2),
(‘lxx‘,30,1),
(‘xiaohou‘,18,3);
ps:删除时:应该先删除关联表emp中的记录,再删除被关联表对应的记录
# 找两张表的关系的窍门
emp dep
#1、先站在左表的角度:去找左表emp的多条记录能否对应右表dep的一条记录
翻译:多个员工能否属于一个部门
#2、然后站在右表的角度:去找右表dep的多条记录能否对应左表emp的一条记录
翻译:多个部门能否拥有同一名员工
# 多对一:结果的判断
#1、如果只有单向的多对一成立,那么最终的关系就是多对一
#2、在emp表新增一个字段dep_id, 该字段外键关联dep(id)
# 多对多:结果的判断
#1、双向的多对一就是多对多
#2、需要建立第三张表,有一个字段值fk左表,一个字段的值fk右表
create table author(
id int primary key auto_increment,
name varchar(16),
age int
);
create table book(
id int primary key auto_increment,
bname varchar(20),
price int
);
create table author2book(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id) on update cascade on delete cascade,
foreign key(book_id) references book(id) on update cascade on delete cascade
);
# 一对一:无需参考窍门,左表的一条数据唯一对应右表的一条记录
fk+unique
?一 ?子查询
什什么是?子查询?
当?一个查询是另?一个查询的条件时,这个查
询称之为?子查询(内层查询)
什什么时候?用?
当查询需求?比较复杂,?一次性查询?无法得到
结果,需要多次查询时,
例例如:给出?一个部?门名称,需要获得该部
?门所有的员?工信息
需要先确定部?门的id,
然后才能通过id确定员?工
解决问题的?方式是把?一个复杂的问题拆
分为若?干个简单的问题
如何使?用?
?首先明确?子查询就是?一个普通的查询,
当?一个查询需要作为?子查询使?用时,?用括号包
裹即可
案列列:
准备数据:
create table emp (id int,name char(10),sex char,age int,dept_id int,job
char(10),salary double);
insert into emp values
(1,"刘备","男",26,1,"总监",5800),
(2,"张?飞","男",24,1,"员?工",3000),
(3,"关?羽","男",30,1,"员?工",4000),
(4,"孙权","男",25,2,"总监",6000),
(5,"周瑜","男",22,2,"员?工",5000),
(6,"?小乔","?女女",31,2,"员?工",4000),
(7,"曹操","男",19,3,"总监",10000),
(8,"司?马懿","男",24,3,"员?工",6000);
create table dept(id int primary key,name char(10));
insert into dept values(1,"市场"),(2,"?行行政"),(3,"财务");
需求:财务部有哪些:
数据在两张表中 可以使?用链接查询
select emp.name from emp inner join dept on dept.id = emp.dept_id
where dept .name = "财务";
?子查询?方式:
数据在两张表中,先查询那张?
emp? 不不?行行 不不知道部?门名 查dept
第?一步 需要知道财务部的id
select id from dept where name = "财务";
第?二步 ?用查询的到的id作为判断条件查询emp
select name from emp where dept_id = 3;
3不不能写死 是上?一个查询的结果 所以直接写在后?面 加上括号就变成了了?子查询
select name from emp where dept_id = (select id from dept where name
= "财务");
in 关键字?子查询
查询平均年年龄?大于25的部?门名称
?子查询?方式:
平均年年龄?大于25的部?门有哪些?
先要求出每个部?门的平年年龄!每个表示什什么? 分组
select name from dept where id in (select dept_id from emp group by
dept_id having avg(age) > 25);
多表查询?方式:
先把数据拼接到?一起 在加以筛选
select dept.name from emp inner join dept
on emp.dept_id = dept.id
group by dept.name
having avg(age) >25;
exists关键字?子查询
exists 后跟?子查询 ?子查询有结果是为True 没有结果时为False
为true时外层执?行行 为false外层不不执?行行
select *from emp where exists (select *from emp where salary > 1000);
select (exists (select *from emp where salary > 10000));
综合练习:
查询每个部?门?工资最?高的员?工信息
先查询每个部?门的最?高?工资
select *from emp inner join
(select dept_id,max(salary) m from emp group by dept_id) t2
on emp.dept_id = t2.dept_id
where
emp.dept_id = t2.dept_id
and
emp.salary = t2.m;
?二 正则表达式匹配
正则表达式?用于模糊查询,模糊查询已经讲
过了了
like 仅?支持 % 和 _ 远没有正则表达式灵活
当然绝?大多数情况下 like?足够使?用
语法:
insert into emp values(1,"laowangba","男",26,1,"总监",5800);
insert into emp values(1,"laoliba","男",26,1,"总监",5800);
insert into emp values(1,"laocheng","男",26,1,"总监",5800);
select *from table where name regexp
"正则表达式";
三 mysql?用户管理理
!这是dba的活?儿!,但是万?一公司没有dba?
mysql?用户指的是什什么?
我们每?一次在操作前都需要指定账号和密码,这个账号就是mysql的?用户;
为什什么要管理理?
?一个公司不不可能只有?一个?工程师,?大公司,不不不不仅有很多?工程师 还有很多不不
同部?门,但是数据库服务器?只有?一个,?大家都要访问,这就涉及到?用户和权限问题了了
?一个?工程师对应?一个账户,
哪些?工程师可以操作哪些数据库,哪些表,甚?至哪些字段,都可以进?行行控制,
例例如,腾讯,有qq和微信不不同项?目,qq的?工程师,就不不应该去访问微信项?目的数据;
mysql是如何管理理的
mysql本质上是?一款cs软件,它具备?用户认证!
我们有没有做过?用户认证呢? ATM! 购物?车,都做过,
我们是如何实现的?写?入?文件,mysql也是?一样的,
登录流程简述!
只不不过它把?文件称为表
那我们需要添加账户,要怎么添加呢?
把?用户信息写?入表中就可以了了,
我们来看看它都把数据放在哪个表中了了!
?自带的mysql数据库,
user
db
table_priv
columns_priv
四个表?用于存储账户信息以及权限
权限优先级:
user->db->table_priv->columns_priv
desc查看结构
内置root账户字段信息解析
创建账号:
create user ?用户名@"ip地址" "identified" by 密码;
create user tom@"192.168.101" identified by "123";
该语句句表?面tom只能在101机器?上使?用,别的机器?就?无法登录
?用%可以表示在任意机器?可?用
注意:该?方式创建的账号没有任何权限
需要使?用授权语句句
授权:
授权语句句执?行行时如果账号不不存在会?自动创建账号 所以推荐使?用
注意:默认只有root才能为其他账号授权
grant all on *.* to tom@"localhost" identified by "123";
该语句句中的all 也不不包括grant权限
*.* 表示任何数据库 任何表 存储在user表
grant all on db.* to tom@"localhost" identified by "123"
db.* 该?用户可以操作db数据库的任何表 存储在 db表
grant all on db.t1 to tom@"localhost" identified by "123"
db.* 该?用户可以操作db数据库的t1表 存储在 table_privi表
精确到字段 和 操作级别
grant select(id) on db.t1 to tom@"localhost" identified by "123"
该?用户只能查询 db下的t1表
grant all on *.* to tom@"localhost" identified by "123" with grant option;
with grant option 表示该账户可以将权限授予其他?用户
收回权限
REVOKE all privileges [column] on db.table from user@"host";
删除?用户
drop user@"host"
flush privileges;
刷新权限表
四 pymysql
是什什么? python编写的mysql客户端
pip install pymysql
?无论是什什么客户端第?一件事?干啥?
c/s程序 socket
链接服务器?
指定相关的参数
获取链接对象
获取游标对象
执?行行sql语句句
获取执?行行结果
提取数据
fetchone
fetchall
fetchmany
scroll
增删改查
指定查询结果为字典类型
pymysql.cursor.DictCursor
sql 注?入
实现?用户登录注册
登录时 演示sql注?入
如何避免
客户端限制
模拟请求怎么破?
服务器?端验证
标签:rac error 服务器 etc dep cad 信息 date enc
原文地址:https://www.cnblogs.com/sanqiansi/p/9637414.html