MySQL(一) 基础语法

MySQL概述

MySQL是目前最流行的关系数据库(关系数据库,是创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据;现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示,它是在 1970 年被 IBM 公司的 E. F. Codd 发明的)中之一,它是由瑞典 MySQL AB 公司开发,该公司后来被Oracle收购,因此目前属于 Oracle 公司。

SQL语法

创建数据库

格式:

create database 数据库名;

查看所有数据库的名称

格式:

show create databases;

选库

格式:

use 库名;//选库完之后才能创建表

创建表

格式:

create table 表名(

          列名 类型,

          列名 类型

          ..........

);

创建用户

create user 用户名 identified by '密码';

主键

每张表只能有一个主键,并且主键的值必须是唯一,且非空的,primary key表示主键。

格式:

create table 表名(

          列名 类型 primary key,

          列名 类型,

          ..........

);

自增列

用来解决主键冲突问题,在主键列后加入:auto_increment,到时候主键列会自动编号(从1开始,如:1 2 3 4 ....),因此你就可以不用给该列赋值了,如果你想指定编号的开始数字,你就给auto_increment赋上开始的值,放在最后的括号后面。

格式:

create table 表名(

          列名 类型 primary key auto_increment,

          列名 类型,

          ..........

)auto_increment=指定的开始的编号;

查看某数据库中所有表的名称

格式:

show create tables;

删除数据库、表

格式:

drop database 数据库名;//会把数据库及其包含的所有数据都删除

drop table 表名;//删除表和数据

delete from 表名;//删除表中所有记录,也就是表中的所有数据,不包括表

delete from 表名 where 条件;//删除表中符合条件的记录,不会删除整张表,只删除数据

插入数据

格式:

insert into 表名(列名1,列名2,...) values (值1,值2,...);//注:值的个数要与列的个数一致,并且是按顺序赋值的

//这个是MySQL独有的插入方法,可以一次性赋值,注意事项与以上相同

insert into 表名(列名1,列名2,...) values (值1,值2,...),(值1,值2,...),...;

查询数据

格式:

select 列名1,列名2,... from 表名 where 条件;//查询符合条件的列

select  *  from 表名;//查询该表的所有列

insert into 表2 select * from 表1;//从表1查询,把查询结果插入表2,注意的是这两个表的结构要相同,或要插入的列类型相同

 

文件导入数据库

可以把外部文本文件的内容导入到数据库表中。

格式:

load data infile '文件路径\文件名字' into table 表名;

注:要让load data命令生效,必须在你自定义的.ini文件里修改设置,如下:

             [mysqld]
             character-set-server=utf8mb4
             secure-file-priv=

其中secure-file-priv默认是null值,表示不允许加载文件,可以改为具体目录名,表示只能从这个目录加载文件,如果改为"",表示可以从任意目录加载文件,character-set-server=utf8mb4表示可以使用中文字符,把写好的.ini文件保存并放在与bin目录在同一级下,然后重启数据库服务,分别打上net stop mysql、net start mysql。

如果文件中的列分隔符不是默认的\t 键,需要用 fields TERMINATED BY来指定分隔符,如:分隔符是逗号的话,                           load data infile '文件路径\文件名字' into table person fields TERMINATED BY ',';

导入包含sql语句的文件到数据库

与load的区别:不用引号,建议使用/分隔路径,文件编码与操作系统编码一致(gbk)。

格式:

source 文件路径/文件名;//其文件内容必须是合法的sql语句

从数据库导出数据

格式:

1. cmd > mysqldump -uroot -p 库名 >> 要保存的文件.sql  (source的逆操作, 内部是sql语句)

2. 把表中的数据保存到文本文件中 (load data infile的逆操作)
                          select * from 表 into outfile '文件路径\文件名'

更新

格式:

update 表名 set 列名=值 where 条件;//给符合条件的列赋予新值

update 表名 set 列名=值;//给指定的列赋予新值

授权

格式:

grant 权限 to 用户名;//权限有增删改查

//例如:把查询test库中所有表的查询权限授权给user1
grant select on test.* to user1;
//例如:把更新test库中所有表的查询权限授权给user1
grant update on test.* to user1;

收回权限

格式:

revoke 权限 from 用户名;

//例如:把查询test库中所有表的查询权限授权从user1中收回
revoke select on test.* from user1;
//例如:把更新test库中所有表的查询权限授权从user1中收回
revoke update on test.* from user1;

条件

=相等
>大于
<小于
!=不等于
>=大于等于
<=小于等于
and逻辑与,两个条件同时成立,才能返回满足的结果
or逻辑或,只要有一个条件满足就返回满足的结果
not 逻辑非 (条件取反) ,返回不满足条件的结果,常与in、like、between使用,放在它们前面
between 值1 and 值2某值在大于等于值1到小等于值2之间,返回满足的结果
in(值1,值2,...)某值满足括号内的值,就返回满足的结果
like模糊查询,其中匹配通配符 % 表示匹配0~多个任意字符,通配符 _ 表示匹配1个任意字符

 

排序

排序默认是asc(升序,也就是从小到大排序,可以省略),而从大到小是desc(降序),需要与order by一起使用。

格式:order by 列名 desc|asc;

//如下:查询学生表的所有信息,该信息按照从小到大的顺序排列
select * from student order by age;

限制返回结果个数

limit m;    // 最多返回m个结果

limit n,m;  // 最多返回m个结果,n代表起始下标,下标从0开始

//如下:查询学生表的信息,该信息按照年龄从大到小的顺序排列,并且只返回前五条信息
select * from student order by age desc limit 5;
//如下:查询学生表的信息,该信息按照年龄从大到小的顺序排列,并且从第六条信息开始返回,一共返回2条信息(位置是从0开始,因此前面的五代表位置6)
select * from student order by age desc limit 5,2;

分组

分组之后,select子句中只能出现分组条件列和组函数,其他列不能出现在select中;order by 子句中只能出现分组条件列和组函数,其他列不能出现在order by中。

格式:

group by 列名;//根据该列名分组,也就是该列的值相同的分一组

group by 列名1,列名2,...;//多个列取值都相同的分为一组

//如下:查询学生表分组后的年龄,年龄有2个11,3个24,4个15,结果返回的是11,24,15,3行数据,分组也就是把列相同的值压缩到一组中
select age from student group by age;

//但是如果你想按照上面的查询后面加上名字就会出错,因为分组是把列相同的值压缩到一组中,把人都压缩进去了,你这时在查询名字,就不清楚那个年龄是那个名字对应的,就出错了
select age,name from student group by age;//错误

//多组分组,也就是现按照列名1分组,再按照列名2分组,以此类推,如下:
select sid,cid from sc group by sid,cid;
//对成绩表的学号分组完,再对课程分组,结果是学号和对应不同的课程号,如学号1001选了1,2号课程,学号1002选了1,3号课程,结果就是
                       //1001 1
                       //1001 2
                       //1002 1
                       //1002 3

sql语句的执行顺序

where > group by > having > select > order by > limit 

// 因为where先执行,这时候还没有分组,不知道个数,因此错误,年龄有2个11岁,3个24岁,4个15岁
select count(*), age from student where count(*) >2 group by age; 

//改为以下就可以,因为having的执行顺序是在group by之后,也就是先分组在计算在不同组中的个数是多少,并选出个数大于2的年龄,满足的又24和15
select count(*), age from student group by age having count(*)>2;

//有时既可以写在where 上,也可以写在having (优先采用where)
//查询年龄11和24的分组,第一条语句的where先执行,也就是先把满足11或24的人选出来,再按照年龄进行分组,第二条是先按照年龄分组,这时所有年龄段的分组都有,然后在执行having语句,找出11或24年龄段
select count(*), age from student where age=11 or age=24 group by age;
select count(*), age from student group by age having age=11 or age=24;

case when...else end

类似if elseif...,配合select使用。

格式:

         case
            when 条件1 then 结果1
            when 条件2 then 结果2
             ...
         else 结果n
         end

//2000以下显示低工资,2000~3000显示中等,3000以上显示高工资
select empno, ename, sal, 
case 
    when sal <= 2000 then '低工资'
    when sal >2000 and sal <=3000  then '中等工资'
    else '高工资'
end 工资级别  from emp;

常用函数

这些函数可以用在条件中,也可以用在select后面。

count(列名)计算某列行数
sum(列名)计算某列之和
max(列名)返回某列最大值
min(列名)返回某些最小值

avg(列名)

返回某列平均数
rand(列名)生成一个从[0.0 ~ 1.0) 之间的随机小数
floor(列名)舍去小数
round(列名)四舍五入
year(日期列)截取年份
month(日期列)截取月份
date(日期列)返回日期或日期/时间表达式的日期部分

例子

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值