liangzhiwen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
用户的创建 ----》修改 ----》删除用户
create          alter        drop    (数据定义语言 DDL)

授权: insert  update  delete  
grant *.*    revoke     -- 数据控制语言DCL

数据库:database
create database 数据库名 character set = utf8

drop database 数据库

表:table
create table 表名(字段名  数据类型 [约束], 字段名  数据类型 [约束], 字段名  数据类型 [约束])

删除表: drop table 表名

修改表: alter table 表名 add 列名  数据类型  [约束]
        alter table 表名 drop 列名



SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

1. 数据查询语言DQL
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
子句组成的查询块:
SELECT <字段名表>
FROM <表或视图名>
WHERE <查询条件>

2 .数据操纵语言DML
数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE

3. 数据定义语言DDL
数据定义语言DDL用来创建数据库中的各种对象-----表、视图、
索引、同义词、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
表 视图 索引 同义词 簇
drop
Alter
DDL操作是隐性提交的!不能rollback(回滚)

4. 数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制
数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权。
2) ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。
回滚---ROLLBACK
回滚命令使数据库状态回到上次最后提交的状态。其格式为:
SQL>ROLLBACK;
3) COMMIT [WORK]:提交


更改表得的定义把某个栏位设为主键。
ALTER TABLE tab_name ADD PRIMARY KEY (col_name) ;
实例sql:
alter table tab_name add primary key(id);
alter table tab_name change id id int(10) not null auto_increment;

说明:把主键的定义先删除
alter table tab_name change id id int(10);
 
9.3 再删除主键
alter table tab_name drop primary key;

在表中添加一个字段
在tab_name表中增加一个名为address的字段且类型为varchar(20)
alter table tab_name add address varchar(20);

删除表中的字段

在tab_name中将address字段删除
alter table tab_name drop address;

表操作

查看当前数据库中所有表
show tables;
创建表
auto_increment表示自动增长

create table 表名(列及类型);
如:
create table students(
id int auto_increment primary key,
sname varchar(10) not null
);
修改表结构

alter table 表名 add|change|drop 列名 类型;
如:
alter table students add birthday datetime;
删除表
drop table 表名;
查看表结构
desc 表名;
更改表名称
rename table 原表名 to 新表名;
查看表的创建语句
show create table '表名';
数据操作

查询
select * from 表名
增加
全列插入:insert into 表名 values(...)
缺省插入:insert into 表名(列1,...) values(值1,...)
同时插入多条数据:insert into 表名 values(...),(...)...;
或insert into 表名(列1,...) values(值1,...),(值1,...)...;
主键列是自动增长,但是在全列插入时需要占位,通常使用0,插入成功后以实际数据为准

添加数据:
1. 表结构完全一样
insert into 表1
select * from 表2
2. 表结构不一样(这种情况下得指定列名)
insert into 表1 (列名1,列名2,列名3)
select 列1,列2,列3 from 表2

修改
update 表名 set 列1=值1,... where 条件

删除:
删除
delete from 表名 where 条件

查询的基本语法
select * from 表名;
from关键字后面写表名,表示数据来源于是这张表
select后面写表中的列名,如果是*表示在结果中显示表中所有列
在select后面的列名部分,可以使用as为列起别名,这个别名出现在结果集中
如果要查询多个列,之间使用逗号分隔
消除重复行

在select后面列前使用distinct可以消除重复的行
select distinct gender from students;


条件

使用where子句对表中的数据筛选,结果为true的行会出现在结果集中
语法如下:
select * from 表名 where 条件;
比较运算符

等于=
大于>
大于等于>=
小于<
小于等于<=
不等于!=或<>
查询编号大于3的学生
select * from students where id>3;
查询编号不大于4的科目
select * from subjects where id<=4;
查询姓名不是“黄蓉”的学生
select * from students where sname!='黄蓉';
查询没被删除的学生
select * from students where isdelete=0;
逻辑运算符

and
or
not
查询编号大于3的女同学
select * from students where id>3 and gender=0;
查询编号小于4或没被删除的学生
select * from students where id<4 or isdelete=0;
模糊查询

like
%表示任意多个任意字符
_表示一个任意字符
查询姓黄的学生
select * from students where sname like '黄%';
查询姓黄并且名字是一个字的学生
select * from students where sname like '黄_';
查询姓黄或叫靖的学生
select * from students where sname like '黄%' or sname like '%靖%';
范围查询

in表示在一个非连续的范围内
查询编号是1或3或8的学生
select * from students where id in(1,3,8);
between ... and ...表示在一个连续的范围内
查询学生是3至8的学生
select * from students where id between 3 and 8;
查询学生是3至8的男生
select * from students where id between 3 and 8 and gender=1;
空判断

注意:null与''是不同的
判空is null
查询没有填写地址的学生
select * from students where hometown is null;
判非空is not null
查询填写了地址的学生
select * from students where hometown is not null;
查询填写了地址的女生
select * from students where hometown is not null and gender=0;
优先级

小括号,not,比较运算符,逻辑运算符
and比or先运算,如果同时出现并希望先算or,需要结合()使用

排序

为了方便查看数据,可以对数据进行排序
语法:
select * from 表名
order by 列1 asc|desc,列2 asc|desc,...
将行数据按照列1进行排序,如果某些行列1的值相同时,则按照列2排序,以此类推
默认按照列值从小到大排列
asc从小到大排列,即升序
desc从大到小排序,即降序
查询未删除男生学生信息,按学号降序
select * from students
where gender=1 and isdelete=0
order by id desc;
查询未删除科目信息,按名称升序
select * from subject
where isdelete=0
order by stitle;

获取部分行

当数据量过大时,在一页中查看数据是一件非常麻烦的事情
语法
select * from 表名
limit start,count
从start开始,获取count条数据
start索引从0开始
示例:分页

已知:每页显示m条数据,当前显示第n页
求总页数:此段逻辑后面会在python中实现
查询总条数p1
使用p1除以m得到p2
如果整除则p2为总数页
如果不整除则p2+1为总页数
求第n页的数据
select * from students
where isdelete=0
limit (n-1)*m,m


聚合

为了快速得到统计数据,提供了5个聚合函数
count(*)表示计算总行数,括号中写星与列名,结果是相同的
查询学生总数
select count(*) from students;
max(列)表示求此列的最大值
查询女生的编号最大值
select max(id) from students where gender=0;
min(列)表示求此列的最小值
查询未删除的学生最小编号
select min(id) from students where isdelete=0;
sum(列)表示求此列的和
查询男生的编号之后
select sum(id) from students where gender=1;
avg(列)表示求此列的平均值
查询未删除女生的编号平均值
select avg(id) from students where isdelete=0 and gender=0;

常用函数:(扩展自学内容)
数学函数

ABS(x) 返回x的绝对值

BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)

EXP(x) 返回值e(自然对数的底)的x次方

GREATEST(x1,x2,…,xn) 返回集合中最大的值

LEAST(x1,x2,…,xn) 返回集合中最小的值

LN(x) 返回x的自然对数

LOG(x,y) 返回x的以y为底的对数

MOD(x,y) 返回x/y的模(余数)

PI() 返回pi的值(圆周率)

RAND() 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定的值。

FLOOR(x) 返回小于x的最大整数值,(去掉小数取整)

CEILING(x) 返回大于x的最小整数值,(进一取整)

ROUND(x,y) 返回参数x的四舍五入的有y位小数的值,(四舍五入)

TRUNCATE(x,y) 返回数字x截短为y位小数的结果

SIGN(x) 返回代表数字x的符号的值(正数返回1,负数返回-1,0返回0)

SQRT(x) 返回一个数的平方根

聚合函数(常用于GROUP BY从句的SELECT查询中)

——下面五个函数会忽略值为NULL的行

AVG(col) 返回指定列的平均值

COUNT(col) 返回指定列中非NULL值/行的个数(当函数参数为星号*时不会忽略)

MIN(col) 返回指定列的最小值

MAX(col) 返回指定列的最大值

SUM(col) 返回指定列的所有值之和

GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果

字符串函数

ASCII(char) 返回字符的ASCII码值

BIT_LENGTH(str) 返回字符串的比特长度

CONCAT(s1,s2…,sn) 将s1,s2…,sn连接成字符串

CONCAT_WS(sep,s1,s2…,sn) 将s1,s2…,sn连接成字符串,并用sep字符间隔

INSERT(str,x,y,instr) 将字符串str从第x位置开始,y个字符长的子串替换为字符串instr,返回结果

FIND_IN_SET(str,list) 分析逗号分隔的list列表,如果发现str,返回str在list中的位置

LCASE(str)或LOWER(str) 返回将字符串str中所有字符改变为小写后的结果

UCASE(str)或UPPER(str) 返回将字符串str中所有字符转变为大写后的结果

LEFT(str,x) 返回字符串str中最左边的x个字符

RIGHT(str,x) 返回字符串str中最右边的x个字符

LENGTH(str) 返回字符串str中的字符数

POSITION(substr,str) 返回子串substr在字符串str中第一次出现的位置

QUOTE(str) 用反斜杠转义str中的单引号

REPEAT(str,srchstr,rplcstr) 返回字符串str重复x次的结果

REVERSE(str) 返回颠倒字符串str的结果

LTRIM(str) 去掉字符串str开头的空格

RTRIM(str) 去掉字符串str尾部的空格

TRIM(str) 去除字符串首部和尾部的所有空格

日期和时间函数

DATE_ADD(date,INTERVAL int keyword) 返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);

DATE_SUB(date,INTERVAL int keyword) 返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);

DATE_FORMAT(date,fmt) 依照指定的fmt格式格式化日期date值

FROM_UNIXTIME(ts,fmt) 根据指定的fmt格式,格式化UNIX时间戳ts

MONTHNAME(date) 返回date的月份名(英语月份,如October)

DAYNAME(date) 返回date的星期名(英语星期几,如Saturday)

NOW() 返回当前的日期和时间 如:2016-10-08 18:57:39

CURDATE()或CURRENT_DATE() 返回当前的日期

CURTIME()或CURRENT_TIME() 返回当前的时间

QUARTER(date) 返回date在一年中的季度(1~4)

WEEK(date) 返回日期date为一年中第几周(0~53)

DAYOFYEAR(date) 返回date是一年的第几天(1~366)

DAYOFMONTH(date) 返回date是一个月的第几天(1~31)

DAYOFWEEK(date) 返回date所代表的一星期中的第几天(1~7)

YEAR(date) 返回日期date的年份(1000~9999)

MONTH(date) 返回date的月份值(1~12)

DAY(date) 返回date的天数部分

HOUR(time) 返回time的小时值(0~23)

MINUTE(time) 返回time的分钟值(0~59)

SECOND(time) 返回time的秒值(0-59)

DATE(datetime) 返回datetime的日期值

TIME(datetime) 返回datetime的时间值

加密函数

AES_ENCRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法加密后的结果,调用AES_ENCRYPT的结果是一个二进制字符串,以BLOB类型存储

AES_DECRYPT(str,key) 返回用密钥key对字符串str利用高级加密标准算法解密后的结果

DECODE(str,key) 使用key作为密钥解密加密字符串str

ENCRYPT(str,salt) 使用UNIXcrypt()函数,用关键词salt(一个可以惟一确定口令的字符串,就像钥匙一样)加密字符串str

ENCODE(str,key) 使用key作为密钥加密字符串str,调用ENCODE()的结果是一个二进制字符串,它以BLOB类型存储

MD5() 计算字符串str的MD5校验和

PASSWORD(str) 返回字符串str的加密版本,这个加密过程是不可逆转的,和UNIX密码加密过程使用不同的算法。

SHA() 计算字符串str的安全散列算法(SHA)校验和

格式化函数

DATE_FORMAT(date,fmt) 依照字符串fmt格式化日期date值

FORMAT(x,y) 把x格式化为以逗号隔开的数字序列,y是结果的小数位数

INET_ATON(ip) 返回IP地址的数字表示

INET_NTOA(num) 返回数字所代表的IP地址

TIME_FORMAT(time,fmt) 依照字符串fmt格式化时间time值

其中最简单的是FORMAT()函数,它可以把大的数值格式化为以逗号间隔的易读的序列。
具体案例可以参考:
https://blog.csdn.net/sinat_38899493/article/details/78710482

分组

按照字段分组,表示此字段相同的数据会被放到一个组中
分组后,只能查询出相同的数据列,对于有差异的数据列无法出现在结果集中
可以对分组后的数据进行统计,做聚合运算
语法:
select 列1,列2,聚合... from 表名 group by 列1,列2,列3...
查询男女生总数
select gender as 性别,count(*)
from students
group by gender;
查询各城市人数
select hometown as 家乡,count(*)
from students
group by hometown;
分组后的数据筛选

语法:
select 列1,列2,聚合... from 表名
group by 列1,列2,列3...
having 列1,...聚合...
having后面的条件运算符与where的相同
查询男生总人数
方案一
select count(*)
from students
where gender=1;
-----------------------------------
方案二:
select gender as 性别,count(*)
from students
group by gender
having gender=1;
对比where与having

where是对from后面指定的表进行数据筛选,属于对原始数据的筛选
having是对group by的结果进行筛选


总结

完整的select语句
select distinct *
from 表名
where ....
group by ... having ...
order by ...
limit star,count
执行顺序为:
from 表名
where ....
group by ...
select distinct *
having ...
order by ...
limit star,count
实际使用中,只是语句中某些部分的组合,而不是全部

 

posted on 2018-09-12 09:33  liangzhiwen  阅读(259)  评论(0编辑  收藏  举报