管理数据库

create database 等同于 create schema

#导入数据库脚本
     MariaDB [db1]> source /root/mysql/hellodb_innodb.sql

管理数据表

数据类型:
    1.数字类型
    2.时间类型
    3.字符串类型

timestamp 只要表中任何一个字段发生修改,自动存储记录时间精确到秒

创建表:
          MariaDB [db1]> create table myuser select user,host,password from mysql.user;

表结构一旦定义好,通常不建议进行修改

CASCADE 表示级联删除 一般指的是主外键的关系

选择数据类型
        set      多选
        enum   单选

复合主键
        primary key(name,city)

快速删除(不可恢复)
         truncate table students;

生产环境一般用update标志位来代替删除操作

SQL基础语法

查询语句写法不同会造成巨大的性能差别,一条很差的查询可能导致服务器宕机

 6记录不是null 7记录才是null  null会在对应的位置显示NULL字符
不能通过=null来查询, 只能是 is null 或者 is not null来过滤
MariaDB [db1]> select * from students;
+----+------+-------+------+-------+
| id | name | phone | sex | score |
+----+------+-------+------+-------+
| 1 | aa | 111 | f | 80 |
| 2 | bbb | 2222 | m | 90 |
| 3 | cccc | 33333 | f | 80 |
| 4 | ffff | 44444 | m | 80 |
| 5 | ff | 555 | f | 90 |
| 6 | 666 | | m | 40 |
| 7 | 777 | NULL | m | 40 |

null处理机制

MariaDB [db1]> select sex from students group by sex;
#表示sex这个列有几个不同的值就会被分成几个组
#分完组之后就可以对数据进行相关汇总了
+------+
| sex |
+------+
| f |
| m |
+------+
group by 语法注意点:
1.select 后面只能加分组的列本身
2.各种聚合函数 分组后的过滤条件语法只能使用having 多个分组
MariaDB [db1]> select class,sex,avg(score) from students group by class,sex;
+-------+------+------------+
| class | sex | avg(score) |
+-------+------+------------+
| 1 | f | 80.0000 |
| 1 | m | 85.0000 |
| 2 | f | 60.0000 |
| 2 | m | 40.0000 |
+-------+------+------------+

group by语法

 1.内连接
取两张表的交集 也可以取多张表的交集
select s.name,t.name from students s,teachers t where s.teacherid=t.tid;
select s.name,t.name from students s inner join teachers t on s.teacherid=t.tid; 2.交叉连接
两张表的记录分别组合一遍
select * from students cross join teachers; 3.左外连接(谁左谁右十分重要)
默认取左边表的全部记录,取右边表和左边表有交集的记录. 可取左表和右表没有交集的记录 添加一个过滤条件即可
and left.id is null 4.右外连接(谁左谁右十分重要)
取右边表的全部记录,取左边表和右边表有交集的记录. 取右表记录和左表没有交集的记录
and right.id is null 5.自连接 把一张表当成两张表来使用
select s1.name,s2.name from students as s1 inner join students as s2 on s1.id=s2.id 6.union连接 竖直排列组合显示
两个条件:
1.两个select查询的列的数量必须一致
2.两个select查询的对应的列的数据类型必须一致
select id,name from students union select id,name from teachers

连接查询

 select * from students where stuid in(select stuid from scores where score > (select avg(score) from scores));

子查询

select查询语句执行流程

1.   先执行from 指定对哪张表进行操作
   2.   执行where 过滤表中的行
   3 .  执行group by 分组
   4.   执行having 对分组后的结果过滤
   5.   执行order by 排序
   6.   执行select columns 挑选需要显示的字段
   7.   执行limit 限定需要显示的记录条数

select查询出来的数据默认是按照磁盘存放次序来排序显示的

select 语法有点类似于awk

=  是精确匹配  where name='abc'

select 可以给字段和表取别名

like 模糊搜索查询
         %  任意个任意字符
          -   任意单个字符

 MariaDB [db1]> select 'hello word'
-> ;
+------------+
| hello word |
+------------+
| hello word |
+------------+
1 row in set (0.00 sec) MariaDB [db1]> select 1+2;
+-----+
| 1+2 |
+-----+
| 3 |
+-----+
MariaDB [db1]> select '1+2',1+2 from user1;
+-----+-----+
| 1+2 | 1+2 |
+-----+-----+
| 1+2 | 3 |
| 1+2 | 3 |
| 1+2 | 3 |
| 1+2 | 3 |
MariaDB [db1]> desc user1;
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| user | char(80) | NO | | | |
| host | char(60) | NO | | | |
| password | char(41) | NO | | | |
+----------+----------+------+-----+---------+-------+ MariaDB [db1]> select user as "姓名",host as "主机" from user1;
+--------+-----------+
| 姓名 | 主机 |
+--------+-----------+
| root | localhost |
| root | centos7 |
| root | 127.0.0.1 |
| root | ::1 |
+--------+-----------+
MariaDB [db1]> select class,sex,avg(score) from students group by class,sex;
+-------+------+------------+
| class | sex | avg(score) |
+-------+------+------------+
| 1 | f | 80.0000 |
| 1 | m | 85.0000 |
| 2 | f | 60.0000 |
| 2 | m | 40.0000 |
+-------+------+------------+
MariaDB [hellodb]> select s.name,sc.score,c.course from students s,scores sc,courses c where s.stuid=sc.stuid and sc.courseid=c.courseid limit 5;
+-------------+-------+----------------+
| name | score | course |
+-------------+-------+----------------+
| Shi Zhongyu | 77 | Kuihua Baodian |
| Shi Zhongyu | 93 | Weituo Zhang |
| Shi Potian | 47 | Kuihua Baodian |
| Shi Potian | 97 | Daiyu Zanghua |
| Xie Yanke | 88 | Kuihua Baodian |
+-------------+-------+----------------+ MariaDB [hellodb]> select s.name,sc.score,c.course from (select * from students limit 5) s,scores sc,courses c where s.stuid=sc.stuid and sc.courseid=c.courseid;
+-------------+-------+----------------+
| name | score | course |
+-------------+-------+----------------+
| Shi Zhongyu | 77 | Kuihua Baodian |
| Shi Zhongyu | 93 | Weituo Zhang |
| Shi Potian | 47 | Kuihua Baodian |
| Shi Potian | 97 | Daiyu Zanghua |
| Xie Yanke | 88 | Kuihua Baodian |
| Xie Yanke | 75 | Weituo Zhang |
| Ding Dian | 71 | Daiyu Zanghua |
| Ding Dian | 89 | Kuihua Baodian |
| Yu Yutong | 39 | Hamo Gong |
| Yu Yutong | 63 | Dagou Bangfa |
+-------------+-------+----------------+ MariaDB [hellodb]> select re.name,avg(score) from (select s.name,sc.score,c.course from (select * from students limit 8) s,scores sc,courses c where s.stuid=sc.stuid and sc.courseid=c.courseid ) as re group by name order by avg(score) desc;
+-------------+------------+
| name | avg(score) |
+-------------+------------+
| Shi Qing | 96.0000 |
| Shi Zhongyu | 85.0000 |
| Xi Ren | 84.5000 |
| Xie Yanke | 81.5000 |
| Ding Dian | 80.0000 |
| Lin Daiyu | 75.0000 |
| Shi Potian | 72.0000 |
| Yu Yutong | 51.0000 |
+-------------+------------+ MariaDB [hellodb]> select c.course,re.stucount from courses as c,(select courseid,count(stuid) as stucount from scores group by courseid) as re where c.courseid=re.courseid;
+----------------+----------+
| course | stucount |
+----------------+----------+
| Hamo Gong | 3 |
| Kuihua Baodian | 4 |
| Jinshe Jianfa | 1 |
| Taiji Quan | 1 |
| Daiyu Zanghua | 2 |
| Weituo Zhang | 2 |
| Dagou Bangfa | 2 |
+----------------+----------+ MariaDB [hellodb]> select * from students where age > (select avg(age) from students);
+-------+--------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+--------------+-----+--------+---------+-----------+
| 3 | Xie Yanke | 53 | M | 2 | 16 |
| 4 | Ding Dian | 32 | M | 4 | 4 |
| 6 | Shi Qing | 46 | M | 5 | NULL |
| 13 | Tian Boguang | 33 | M | 2 | NULL |
| 25 | Sun Dasheng | 100 | M | NULL | NULL |
+-------+--------------+-----+--------+---------+-----------+ MariaDB [hellodb]> select name from students where stuid in(select stuid from scores where courseid in(1,2,4,7));
+-------------+
| name |
+-------------+
| Shi Zhongyu |
| Shi Potian |
| Xie Yanke |
| Ding Dian |
| Yu Yutong |
| Shi Qing |
| Xi Ren |
| Lin Daiyu |
+-------------+
MariaDB [hellodb]> select s.name,s.age from students s,(select classid,avg(age) as age,count(stuid)from students group by classid having count(stuid)>=3) as re where s.classid = re.classid and s.age > re.age;
+---------------+-----+
| name | age |
+---------------+-----+
| Shi Potian | 22 |
| Xie Yanke | 53 |
| Ding Dian | 32 |
| Yu Yutong | 26 |
| Yuan Chengzhi | 23 |
| Xu Zhu | 21 |
| Lin Chong | 25 |
| Hua Rong | 23 |
| Huang Yueying | 22 |
+---------------+-----+
9 rows in set (0.00 sec)

查询实例

视图

VIEW,虚表        保存有实表的查询结果

视图中的数据事实上存储于“基表”中    因此,其修改操作也会针对基表实现; 其修改操作受基表限制

函数

系统函数和自定义函数   保存在mysql.proc表中

存储过程

存储过程           存储过程保存在mysql.proc表中

触发器

trigger_name:触发器的名称

trigger_time:{ BEFORE | AFTER },表示在事件之前或之后触发

trigger_event::{ INSERT |UPDATE | DELETE },触发的具体事件

tbl_name:该触发器作用在表名

触发器的执行不是由程序调用,   也不是由手工启动,而是由事件来触发,激活从而实现执行

触发器实例,在向学生表INSERT数据时,学生数增加,DELETE学生时,学生数减少

MySQL用户和授权管理

用户管理

创建用户:CREATE USER

CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];  默认权限:USAGE   只能连接不能进行任何操作

用户重命名:RENAME USER  RENAME USER old_user_name TO new_user_name

删除用户:  DROP USER 'USERNAME'@'HOST‘

示例:删除默认的空用户  DROP USER ''@'localhost';

修改密码:

mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');

mysql>UPDATE mysql.user SET password=PASSWORD('your_password') WHERE clause;

此方法需要执行下面指令才能生效:mysql> FLUSH PRIVILEGES;

#mysqladmin -u root –poldpass  password  ‘newpass‘

忘记管理员密码的解决办法:

启动mysqld进程时,为其使用如下选项:  --skip-grant-tables --skip-networking  修改配置文件/etc/my.cnf中的mysqld

使用UPDATE命令修改管理员密码

关闭mysqld进程,移除上述两个选项,重启mysqld

权限管理

授权和创建用户可以都通过grant命令一步来实现,因为grant授权的用户如果不存在,mysql会自动创建对应的用户

权限类别:

1.数据库级别

2.表级别

3.字段级别

4.管理类

5.程序类

授权语法:

GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password']

priv_type: ALL [PRIVILEGES]

object_type:TABLE | FUNCTION | PROCEDURE

priv_level:  *(所有库)  | *.*  | db_name.*  | db_name.tbl_name  | tbl_name(当前库的表)  | db_name.routine_name(指定库的函数,存储过程,触发器)

GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';

MariaDB [(none)]> grant all on hellodb.* to yxh@"192.168.%.%" identified by 'root';
       MariaDB [(none)]> grant select,insert on hellodb.* to laoge@'%' identified by 'root';

MariaDB [(none)]> grant select(stuid,name) on hellodb.students to dage@'%' identified by 'root';

MariaDB [(none)]> show grants for yxh@"192.168.%.%";

回收授权语法:

REVOKE   priv_type [(column_list)]  [, priv_type [(column_list)]] ...    ON [object_type] priv_level  FROM user [, user] ...

示例:   REVOKE  DELETE  ON   testdb.*   FROM   'testuser'@'%'

查看用户的授权信息:

Help SHOW GRANTS

SHOW GRANTS FOR 'user'@'host';

SHOW GRANTS FOR CURRENT_USER[()];

注意:MariaDB服务进程启动时会读取mysql库中所有授权表至内存

(1) GRANT或REVOKE等执行权限操作会保存于系统表中,MariaDB的服务进程通常会自动重读授权表,使之生效

(2) 对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表

mysql> FLUSH PRIVILEGES;

MySQL语法和用户授权的更多相关文章

  1. MySQL使用root用户授权出现错误ERROR 1045 (28000) at line 2: Access denied for user 'root'@'%' (using password: YES)解决办法

    参考:https://blog.csdn.net/open_data/article/details/42873827 使用MySQL的root用户登录出现错误提示 ERROR 1045 (28000 ...

  2. MySQL 数据库新用户授权

    --- 新建数据库用户授权 --远程的 GRANT ALL PRIVILEGES ON `testdb`.* TO 'username'@'%' IDENTIFIED BY 'pwd2017'; -- ...

  3. MySql中创建用户,授权

    第一天搞MySql好多东西都不会,幸好有网络的强大资源,首先需要注意的是任何一条sql语句都是要以分号结尾的,不然很是蛋疼的 1.新建用户. //登录MYSQL @>mysql -u root  ...

  4. mysql常用的用户授权语句

    一:授权主要的 SQL //某个数据库所有的权限 ALL 后面+ PRIVILEGES GRANT ALL PRIVILEGES ON 库名.* TO '用户'@'%' IDENTIFIED BY ' ...

  5. 数据库之mysql篇(2)—— mysql常识引入/用户授权

    常识引入 1.概念: 数据库:本质上是一个文件夹 1)查看本机所有数据库:show databases; 结束符:分号[:],一切数据行的结尾都以分号作为结束 2)创建数据库:create  数据库名 ...

  6. mysql root给其它用户授权问题

    今天登录mysql,给其它用户授权遇到问题 mysql> grant all privileges on testdb.* to 'dbuser'@'10.4.14.14' identified ...

  7. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  8. MySQL创建一个用户,指定一个数据库 授权

    Mysql 创建一个用户 hail,密码 hail,指定一个数据库 haildb 给 hail mysql -u root -ppassworduse mysql;insert into user(h ...

  9. MySQL中用户授权/删除授权的方法

    用户授权方法 你可以通过发出GRANT语句增加新用户:  代码如下 复制代码 shell> mysql --user=root mysql mysql> GRANT ALL PRIVILE ...

随机推荐

  1. 面向切面编程AOP,一些通用装饰器

    1.一些装饰器,可以减少重复编写.比较常用的. 用的时候函数上面加上装饰器就可以.这是一些装饰器,加在函数或者方法上,减少了很多重复代码. 除此之外工作中也用一些mixin类大幅减少代码. impor ...

  2. Mercurial (hg) Hook : PHP Syntax Check , hg 代码检测 钩子

    用百度搜了一遍hg的hook教程,发现真的是太少了.公司目前正要用到这个,正好本人负责,So. 百度是个坑,少有的几篇文章,再加上善于发现的眼睛,发现TortoiseHg的UI操作都会在控制台显示动作 ...

  3. 升级 Centos 6.5/6.7 的 php 版本

    Centos 6.5/6.7 的 php 预设是用 5.3.3 这个版本号 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-releas ...

  4. 机器人学 —— 轨迹规划(Artificial Potential)

    今天终于完成了机器人轨迹规划的最后一次课了,拜拜自带B - BOX 的 Prof. TJ Taylor. 最后一节课的内容是利用势场来进行轨迹规划.此方法的思路非常清晰,针对Configration ...

  5. node-sass 安装

    设置 export ELECTRON_MIRROR="https://npm.taobao.org/mirrors/electron/" export SASS_BINARY_SI ...

  6. Tarjan 强连通分量 及 双联通分量(求割点,割边)

    Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1)         有向图的强联通分量 (2)         无向图的双联通分量(求割点,桥) ...

  7. VS2015 工具箱 保存位置

    我的文档\Visual Studio 2015\Settings\CurrentSettings.vssettings Environment_Toolbox 节点 <Category name ...

  8. ubuntu创建用户的两种方式

    ubuntu创建用户有两种方式: useradd和adduser 这两者,就像零件与产品的关系.useradd是DIY,需要自己调配,adduser是品牌机,拿来就能用. 对于创建一般用户来讲,use ...

  9. MYSQL数据库在Windows系统中重置root密码

    1.以系统管理员身份打开cmd 2.查看MySQL是否启动: net start 3.如果启动就停止:net stop MySQL55 注:MySQL55是在我的电脑上的mysql数据库服务名 4.再 ...

  10. [No0000FF]鸡蛋煮熟了蛋黄为什么发黑?

    你是否发现,鸡蛋煮熟后,蛋黄表面会呈现青黑色. 这是怎么回事? 这是因为鸡蛋的蛋白质富含有半胱氨酸,鸡蛋如果加热过度使半胱氨酸部分分解产生硫化氢,与蛋黄中的铁结合形成黑色的硫化铁.煮蛋中如果鸡蛋表面的 ...