sql语句基础合集
0x00 大一基础整理
整理一波自己以前用的比较基本的sql语句,还有一些MySQL orcale 数据库的操作,
不包括设置制约关系,触发器等知识(有时间再整理),就是简单的增删改查等操作,整理的比较随意,将就着看 。。。(有时间还会更新)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
mysql -h127.0.0.1 -u用户名 -p密码 本地打开mysql命令行
更改密码 update user set authentication_string = PASSWORD('你自己的密码') where user='root';
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
使设定立即生效 (用于更改密码后) flush privileges;
退出 exit;
查询MySQL版本信息 select version();(可以用于判断是否有可以爆信息的information—schema)
查询使用者权限或者用户名 select user();
查询当前所在的库 select database();
显示所有库 show databases;
使用某个库 use 库名;
显示当前库下的所有表 show tables;
创建一个库 create database 库名;
删除一个库 drop database text;
在当前库下添加一个表,表里有id(整型),username(char字符串型),password(char字符串型)
create table 表名(id int, username varchar(20), password varchar(20) );
在当前库下的某个表下添加括号里数据 insert into 表名 values(1,’admin’,’123’);
要给表添加一列,列名为gender,类型为varchar,长度为2,用如下语句:alter table user add gender varchar(2);
查看列:desc 表名;
修改表名:alter table t_book rename to bbb;
添加列:alter table 表名 add column 列名 varchar(30);
删除列:alter table 表名 drop column 列名;
修改列名MySQL: alter table bbb change nnnnn hh int;
修改列名SQLServer:exec sp_rename't_student.name','nn','column';
修改列名Oracle:lter table bbb rename column nnnnn to hh int;
修改列属性:alter table t_book modify name varchar(22);
删除user表下id=2的数据:delete from user where id=2;
DROP DATABASE tutorial_database;
如果该数据库tutorial_database不存在,那么你会收到此错误:
ERROR 1008 (HY000): Can't drop database 'tutorial_database'; database doesn't exist
为了避免出现此错误使用下面的命令:
DROP DATABASE IF EXISTS tutorial_database;
查询表下所有信息 select * from 表名; *是一个通配符
显示表的字段信息 dasc 表名;
一些关键字:
@@version_compile_os 服务器系统信息
@@basedir MySQL装在电脑那个目录里
@@datadir 也是和MySQL目录有关的
@@temdir 未知
使用方法:mysql> select *from 表名 where id=-1 and 写一个为真的条件(例如1=1) union select version(),@@version_compile_os,@@datadir;(最多同时查寻数据不得超过表中字段数,剩余的位置用数字填充)
这样会显示出MySQL版本信息,服务器系统信息,MySQL安装目录
查询当ID=1时的数据 select * from 表名 where id =1;
查询当id=1时,username,password字段的数据 select username,password from 表名 where id =1;
查询当username=”admin”时,password字段的数据 select password from 表名 where username=”admin”;
查询语句 select * from 表名 where id=‘1’and exists(select * from user );其中exists()是逐条查询函数,只要表里有信息就返回真。(觉得适用于注入时判断表中是否有信息)
判断表中字段条数 order by 数字;
例子:mysql> select *from 表名 where id=1 and 1=1 order by 3;//猜中或者猜小会正常显示
+------+----------+----------+
| id | username | password |
+------+----------+----------+
| 1 | admin | 123 |
+------+----------+----------+
1 row in set (0.00 sec)
mysql> select *from 表名 where id=1 and 1=1 order by 4;//猜大会报错或者不显示
ERROR 1054 (42S22): Unknown column '4' in 'order clause'
联合查询把1234等数字放在显示的表中 union select 1,2,3,4,……,n;(n是上一步查询到的字段条数)
例子:mysql> select *from 表名 where id=1 and 1=1 union select 1,2,3;
+------+----------+----------+
| id | username | password |
+------+----------+----------+
| 1 | admin | 123 |
| 1 | 2 | 3 |
+------+----------+----------+
2 rows in set (0.00 sec)
此时把id=1换成id=-1,可以消去第一条数据
联合查询显示表中所有信息,使用方法见21 union select 字段,字段,.....,字段 from admin;(前后字段数目必须一致)
1、查看mysql版本
方法一:status;
方法二:select version();
2、Mysql启动、停止、重启常用命令
a、启动方式
1、使用 service 启动:
[root@localhost /]# service mysqld start (5.0版本是mysqld)
[root@szxdb etc]# service mysql start (5.5.7版本是mysql)
2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld start
3、使用 safe_mysqld 启动:
safe_mysqld&
b、停止
1、使用 service 启动:
service mysqld stop
2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld stop
3、mysqladmin shutdown
c、重启
1、使用 service 启动:
service mysqld restart
service mysql restart (5.5.7版本命令)
2、使用 mysqld 脚本启动:
/etc/init.d/mysqld restart
orcale数据库
打开服务
sqlplus
解锁scott用户
管理员登录
sqlplus(空格)/nolog
conn sys/password as sysdba
解锁scott
alter user scott account unlock;
修改scott的登录密码:
alter user scott identified by tiger;
scott登录
conn scott/tiger
https://blog.csdn.net/yali1990515/article/details/51732427
以上是大一的时候自学数据库的时候赞的一些sql语句,感觉有一些还挺有意思的,先这么放着吧,懒得整理。
0x01 大二查询操作
通配符
- *查询所有列 一般用在列哪里
- %百分号代表任意长度字符串,a%b代表以a开头,以b结尾的字符串
- _下划线代表一个字符,和%一样用like用于模糊查询之类的,注意数据库字符集为ASCII时一个汉字两个下划线,当字符集为gbk时就只需要一个
不需要通配符,但要输入下划线百分号时用\转义
子句
- order by 列名 ASC/DESC 按这一列升序/降序排序
- group by 列名 having 条件 按照这一列进行分组返回满足条件的,having可以不用,一般和聚集函数配套使用,列可以是一个也可以是多个
关键字
- distinct/all 用在要查询的列名前 distinct去掉这一列重复的数据,默认是all
查询条件where
- 比较 大于小于等于不等之类的符号
- (not) between and 用于确定范围
- (not) like 用于字符匹配
- (not) in 确定是否再某个集合,一般会用在子查询,或者… in (“1”,”2”)
- (not) is NULL 判断是否为空值
- 连接:and or not
聚集函数
- count() 查询元祖(*)个数、或者列中值的个数(列名)
- sum() 计算一列值的总和
- avg() 计算一列值的平均值
- max() 计算一列值的最大值
- min() 计算一列值的最小值
这里的列可以用distinct/all限制,去重复,还有就是除了查询元祖个数,全部跳过空值,聚集函数只等用在select子句和group by 中的having子句中
多表查询
- 连接查询
例:
select stu.*,sc.* from stu,sc where stu.sno=sc.cno;
from后面可以给表重命名,以便相同的表,使用不同条件,还有from后面可以使用left outer join关键字左右连接 - 嵌套查询
例:
select *from stu where sno in(select sno from con='2');
查询选了课程2的学生信息,
查询条件也可以不用in 换成比较条件或者比较条件+any/all 不等于可以用<>表示,
子查询前可以用(not) exists限制 exists限制的子查询只返回true/false
集合查询
- 并操作 union
- 交操作 intersect
- 差操作 except
基于派生表的查询
子查询用在from时生成临时表(派生表),的查询
例:
1
2
3 select sno
from stu,(select sno from sc where cno='1') as sc1
where stu.sno=sc1.sno;
0x02 数据库权限
1. 权限赋予
grant select on table student to u1;
给u1查询student表的权限,to public 代表所有用户 但u1不可以传播权限
grant select(sno) on table student to u1 with grant option;
给u1查询sno的权限,而且u1可以把权限给其他用户
2.权限收回
revoke select on table student from u1;
收回u1对student表的查询权限
revoke select on table student from u1 cascade;
收回u1对student表的查询权限,并收回u1赋予别人对此表的查询权限
0x03 视图
create view as select user,pass from student;
将student表的user,pass建成一个视图,视图使用select查询结果建立,查询视图和查询表基本相同
0x04 索引
create unique index stusno on student(sno);
在student表的sno列建立索引,unique代表唯一索引,还可以建立聚簇索引 ,可以在语句之前使用EXPLAIN,来查看是否使用索引
0x05 数据库导入导出
- 导出 :终端下
mysqldump -u username -ppassword database > /root/aa.sql
密码可以后写 - 导入 :mysql终端下,use要导入表的数据库
source /root/aa.sql