关系型数据库常见对象
SQL语言规范
SQL语言是关系型数据库的语言标准
SQL语言规范
1,数据库系统中,sql语句不区分大小写
2,SQL可单行或多行书写,以;结束
3,--用来注释,单行注释
4,对象的命名以字母开头,不使用系统保留字
SQL语言分类
数据类型
数值型与字符型
数值型: 整数(int) 小数(float)
字符串型: 定长(char) 变长(varcher)
字段修饰符
null 可为空
not null 不可为空
primary key 主键
unique key 唯一键
default 默认值
character set 指定字符集
auto_increment 自动递增
unsigned 无符号
enum() 多选一
mysql基本用法
~/.mysql_history #mysql的命令历史
mysql 登录
[库名] mysql命令加上数据库名可直接登录并进入数据库
-u 用户
-h 服务器主机
-p 密码
-e 直接执行mysql命令
-s 指定socket文件
mysqladmin 命令
ping 查看数据库是否正常
password 修改密码
例: mysqladmin -uroot -pssy192011 ping
安全初始化脚本mysql_secure_installation
mysql基本使用
status --查看mysql详细信息
use --切换目录
system ls /data/ --调用shell命令
quit --退出
DDL语句
show databases/tables; --列出所有 库/表
show create database/table db1; --查看库/表的创建过程
desc hellodb.user; --查看表的结构
create database db1; --创建数据库
drop database/table db1; --删除数据 库/表
alter database/table db1 character set utf8; --修改字符集为utf8
创建数据表
create table yun (
id int unsigned auto_increment primary key,
name varchar(20) not null,
gender enum("m","f") default "m",
age int ) auto_increment=1;
create table yyy select * from user;--创建表内容为slect的标准输出
create table sss like yyy; --创建表sss结构结构和yyy一样
修改数据表
alter table sss rename yyy; --修改表名称
alter table sss add gender enum('m','f'); --增加字段
alter table sss change has_email has_email int(1) default 1; --修改字段名
alter table sss drop gender; --删除字段
alter table sss add primary key (stuid); --添加主键
DML语句(增删改)
insert(增),delete(删),update(改)
insert: --添加记录
insert ssy (classid,class,numofstu) values (10,"yunge",21),(11,"mage",28);
insert ssy values (11,"niuge",33)
--注:不指定字段名即所有字段次序赋值,字符串数据要用引号
update --修改记录
update ssy set class="jj" where classid=12;
delete --删除记录
delete from ssy where classid=12;
DQL语句(查)
单表查询
--字段过滤
select * from classes; --显示表中所有字段
select user,host from classes; --显示表中user和host两个字段
select name 姓名,age 年龄,gender 性别 from students; --字段显示使用别名
--记录过滤
--条件判断 where
--比较操作符: =等于 <>不等于 >大于 <小于
--逻辑操作符: and且 or或 not取反
--通配符查询: like %任意字符 _任意单个字符 s%以s开头 %s以s结尾 %s%包含s
select * from students where gender="m"; --取gender为m的行
select * from students where gender<>"m"; --取gender不为m的行
select * from students where gender="m" and age>25; --取gender为m并且age大于25的行
select * from students where classid is null; --取classid为空的行
select * from students where classid is not null; --取classid不为空的行
select * from students where name like 's%'; --取name以s开头的行
select * from students where not name like 's%'; --取name不以s开头的行
select * from students order by age; --将age字段中的行排升序
select * from students order by age desc; --将age字段中的行排降序
--聚合函数 count()数量 avg()平均值 max()最大值 min()最小值
select count(*) from students; --统计表中总行数
select avg(age) from students; --统计表中age的平均值
--分组 group by
select classid,avg(age) from students where classid is not null group by classid; --取每个班级的平均年龄
select classid,gender,avg(age) from students where classid is not null group by classid,gender; --取每个班级男生女生的平均年龄
多表查询
联合查询: union 纵向连接,字段名可以不同,字段数需相同,具有去重功能
select stuid,name,age,gender from students union select tid,name,age,gender from teachers;
子查询: select的执行结果被其他sql语句调用
--用于比较表达式中的子查询;子查询仅能返回单个值
select name,age from students where age>(select avg(age) from students );
--用于FROM子句中的子查询
select aage,classid from (select avg(age) aage,classID from students group by Classid) s where aage>10;
交叉连接: cross join(横向笛卡尔)
--两张表完全结合
select * from students cross join teachers;
--两张表完全结合,并表起别名取students的stuid和name,取teachers的tid和name
select s.stuid,s.name,t.tid,t.name from students s cross join teachers t;
内连接: inner join 横向连接
--从结果表中删除与其他被连接表中没有匹配行的所有行
select * from teachers inner join students on teachers.tid=students.teacherid;
--一旦定义表的别名,原表名将无法使用
select t.tid,t.name,s.name,s.stuid from teachers t inner join students s on t.tid=s.teacherid;
外连接: 横向连接
左外连接:left join 取1表的全部记录且取2表的与1表交集的记录,无交集用null表示
select s.name,s.age,t.name,t.age from students s left join teachers t on s.teacherid=t.tid;
右外连接:right join 取2表的全部记录且取2表的与1表交集的记录,无交集用null表示
select s.name,s.age,t.name,t.age from students s right join teachers t on s.teacherid=t.tid;
完全外连接: 左外连接加右外连接 取表一和表二全部记录
select * from students s left join teachers t on s.teacherid=t.tid
union
select * from students s right join teachers t on s.teacherid=t.tid;
自连接: 表1与表1连接
select e.name,l.name from db1 as e inner join db1 as l on e.leaderid=l.id;
三表连接
select st.name,co.course,sc.score from scores sc inner join courses co on sc.courseid=co.courseid inner join students st on st.stuid=sc.stuid;
view 视图
视图: 是一种虚拟的表,select命令的查询结果,基表的修改会使视图变化
视图创建:
create view jj as select students.name,courses.course,scores.score from courses inner join scores on courses.courseid=scores.courseid inner join students on students.stuituid=scores.stuid;
视图查询 select * from jj;
视图删除 drop view jj;
用户管理DCL
用户数据库: mysql.user
%通配符,任意字符
_通配符,单个字符
create user yun@'10.0.0.%'; 创建用户
drop user yun@'10.0.0.8'; 删除用户
rename user jj@'10.0.0.8' to mage@'10.0.0.8'; 用户名修改
设置密码
update mysql.user set password=password('ssy192011') where user='root';
flush privileges; 修改后生效
破解mysql root密码
vim /etc/my.cnf
[mysqld]
skip-grant-tables 跳过密码验证
skip-networking 禁止远程
权限管理DCL语言
grant select(user,host),insert(user) on mysql.user to yun@'10.0.0.%'; 字段授权
grant all on *.* to root@'10.0.0.%'; 授予所有权限针对所有库所有表
grant all on mysql.* to yun@'10.0.0.%'; 授予所有权限针对mysql库下的所有表
show grants for yun@'10.0.0.%'; 查看用户获得的权限
revoke delete on mysql.* from yun@'10.0.0.%'; 取消用户权限
revoke all on mysql.* from yun@'10.0.0.%'; 取消用户全部权限