SQL数据库基础中的基础
SQL数据库基础中的基础
1.数据库操作
0.0 提前准备
再开始操作之前,需要有数据库,如果没有安装的可以看我上一篇的内容。以下所有操作均在数据库上操作。
1.1 DDL操作
1.1.1 数据库操作
mysql> create database yyx; //创建数据库 yyxmysql> create database if not exists yyx; //如果存在这个数据库,即先删除再创建,通常使用这个语法。mysql> show databases; //查看所有数据库 注:database后有s
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| yyx |
+--------------------+
5 rows in set (0.01 sec)mysql> drop database yyx; //删除名为yyx的数据库mysql> drop database if exists yyx; //存在即删除。
mysql> show databases;//验证是否删除
mysql> use yyx; //切换到名为yyx的数据库,以下的操作均在yyx数据库中操作
1.1.2 表操作
mysql> create table yyx(id int unique,name varchar(20) not null,age int );
//创建名为yyx的表,里面设置三个字段,分别为依次字段名,数据类型,约束/是否为空,默认为空;mysql> desc yyx; //查看表yyx的结构
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
| name | varchar(20) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+mysql> show tables; //查看当前数据库有哪些表,同理,后面需要接s,表示多表;
+---------------+
| Tables_in_yyx |
+---------------+
| yyx |
+---------------+mysql> drop table yyx;//删除名为yyx的表
mysql> drop table if exists yyx;//同理,存在即删除;
//alter 修改表结构
mysql> alter table yyx add sex varchar(4); //给表yyx添加一个名为sex的新字段,数据类型为varchar;mysql> desc yyx; //查看更改
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | UNI | NULL | |
| name | varchar(20) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | varchar(4) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+mysql> alter table yyx add sal int first; //添加新字段且定于第一列,after则为最后一列。
mysql> desc yyx; //验证
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| sal | int(11) | YES | | NULL | |
| id | int(11) | YES | UNI | NULL | |
| name | varchar(20) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | varchar(4) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+mysql> alter table yyx modify age tinyint(4); //modify 修改字段名称及类型mysql> alter table yyx change sal tel int(20);
//change 也是修改字段名称类型大小mysql> alter table yyx alter age set default 18; //修改表yyx age字段的默认值为18mysql> alter table yyx alter age drop default;//删除默认值mysql> alter table yyx engine = innoDB;//修改数据表类型mysql> alter table yyx rename to yyxx;//修改表名mysql> alter table yyx add index y(name,age);//添加索引ymysql> alter table yyx add primary key name;//给name字段添加主键mysql> alter table yyx drop sex;//删除名为sex的字段mysql> alter table yyx drop index y ;//删除名为y的索引
1.1.3 用户操作
mysql> create user 'xxx'@'localhost' IDENTIFIED BY '951Yyx!!'; //添加用户[root@yyx2 ~]# mysql -uxxx -p'951Yyx!!' //验证登陆
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.37 MySQL Community Server (GPL)Copyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> drop user 'xxx'@'localhost'; //删除用户
1.2 DML操作
1.2.1 insert 添加数据
mysql> insert yyx value(13456,1,'yyx',18,'boy'); //往yyx表里插入一条数据。
mysql> insert yyx(id,name,age) value(2,'xxy',20); //往yyx表里id,name,age三个字段插入一条数据
mysql> insert yyx(id,name,age) values(3,'xy',20),(4,'xxxx',60); //往yyx表里三个字段批量插入数据
//结果
mysql> select * from yyx;
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
| NULL | 2 | xxy | 20 | NULL |
| NULL | 3 | xy | 20 | NULL |
| NULL | 4 | xxxx | 60 | NULL |
+-------+------+------+------+------+
1.2.2 delete 删除数据
mysql> delete from yyx where age =20; //删除yyx表中年龄等于20的数据mysql> select * from yyx; //验证结果
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
| NULL | 4 | xxxx | 60 | NULL |
+-------+------+------+------+------+
1.2.3 update 更改数据
mysql> update yyx set tel =666666 where name ='xxxx'; //修改name字段为xxxx的tel字段数据为666666mysql> select * from yyx; //验证
+--------+------+------+------+------+
| tel | id | name | age | sex |
+--------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
| 666666 | 4 | xxxx | 60 | NULL |
+--------+------+------+------+------+
1.2.4 select 查询表数据
mysql> select * from yyx; //查看表的全部数据
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
| NULL | 4 | xxxx | 60 | NULL |
+-------+------+------+------+------+mysql> select id ,name from yyx; //仅查询表的id和name字段
+------+------+
| id | name |
+------+------+
| 1 | yyx |
| 4 | xxxx |
+------+------+mysql> select id 学号,name as 姓名 from yyx;//对查询结果字段进行更改别名,as可以省略
+--------+--------+
| 学号 | 姓名 |
+--------+--------+
| 1 | yyx |
| 4 | xxxx |
+--------+--------+mysql> select * from yyx order by id; //根据id字段进行排序正序
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
| NULL | 4 | xxxx | 60 | NULL |
+-------+------+------+------+------+mysql> select * from yyx order by id desc; //根据id字段进行倒叙排序
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| NULL | 4 | xxxx | 60 | NULL |
| 13456 | 1 | yyx | 18 | boy |
+-------+------+------+------+------+mysql> select * from yyx order by id limit 1; //对排序的结果进行筛选,1代表只显示第一条
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
+-------+------+------+------+------+mysql> select * from yyx order by id limit 1,1;
//对排序的结果进行筛选,1,1 表示跳过第一个,然后显示一个
+------+------+------+------+------+
| tel | id | name | age | sex |
+------+------+------+------+------+
| NULL | 4 | xxxx | 60 | NULL |
+------+------+------+------+------+mysql> select * from yyx where name ='yyx'; //where代表对表数据进行匹配,只显示匹配到的数据
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
+-------+------+------+------+------+mysql> select * from yyx where age between 10 and 60; //between ……and 用于匹配符合范围内的数据
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
| NULL | 4 | xxxx | 60 | NULL |
+-------+------+------+------+------+mysql> select count(*) as 总人数 from yyx; //显示总人数
+-----------+
| 总人数 |
+-----------+
| 2 |
+-----------+mysql> select avg(age) 平均年龄 from yyx; //显示age字段的平均值
+--------------+
| 平均年龄 |
+--------------+
| 39.0000 |
+--------------+mysql> select sum(age) 年龄总和 from yyx; //显示age字段的总和
+--------------+
| 年龄总和 |
+--------------+
| 78 |
+--------------+
mysql> select min(age) 最大年龄 from yyx; //显示最大年龄
+--------------+
| 最大年龄 |
+--------------+
| 18 |
+--------------+
mysql> select min(age) 最小年龄 from yyx; //显示最小年龄
+--------------+
| 最小年龄 |
+--------------+
| 18 |
+--------------+mysql> select * from yyx where name like 'y%'; //查找yyx表里name字段以y开头的数据,%代表任意字符,_代表一个字符
+-------+------+------+------+------+
| tel | id | name | age | sex |
+-------+------+------+------+------+
| 13456 | 1 | yyx | 18 | boy |
+-------+------+------+------+------+mysql> select concat(name,'+')姓名 from yyx; //拼接字符
+--------+
| 姓名 |
+--------+
| yyx+ |
| xxxx+ |
+--------+
1.3 DCL操作
1.3.1 授权
//语法 GRANT [权限,all为全部] ON [数据库名,*为全部].[表名,*为全部] TO '[用户名]'@'[IP地址,%为任何地址]' IDENTIFIED BY '[用户密码]';
mysql> grant all on *.* to 'yy'@'%' identified by '951Yyx!!'; //给与yy用户所有的权限到所有的数据库和表
//常见授权类型:
CREATE [DATABASE/FUNCTION/TABLE...] 创建权限
SELECT 查询数据权限
DELETE 删除数据权限
UPDATE 修改数据权限
ALTER 修改表结构
SHOW [DATABASES/TABLES/VIEW...] 查看权限
DROP 删除权限mysql> show grants; //查看授权
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+mysql> show grants for yy; //查看用户yy的授权
+-----------------------------------------+
| Grants for yy@% |
+-----------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'yy'@'%' |
+-----------------------------------------+mysql> flush privileges; //刷新表的权限
1.3.2 取消授权
mysql> revoke all on *.* from 'yy'@'%'; //取消yy用户的所有权限;
mysql> show grants for yy; //验证权限
+--------------------------------+
| Grants for yy@% |
+--------------------------------+
| GRANT USAGE ON *.* TO 'yy'@'%' |
+--------------------------------+
2.表联合查询
当查询的数据在多张表上时,一般采用表联合查询。
MySQL 支持以下 SQL 连接查询:
- 内连接(INNER JOIN);
- 左外连接(LEFT OUTER JOIN);
- 右外连接(RIGHT OUTER JOIN);
- 交叉连接(CROSS JOIN);
- 自连接(Self Join)。
2.1 内连接
内连接用于返回两个表中满足连接条件的数据,使用关键字INNER JOIN
表示,也可以简写成JOIN
;
//例 查看各个员工属于哪个部门
mysql> select e.name,d.department_name from employee e join department d on e.department_id=d.department_id;
+--------+-----------------+
| name | department_name |
+--------+-----------------+
| Tom | management |
| Joe | management |
| Jack | develpo |
| John | develpo |
| Donnie | develpo |
| Hark | financial |
| Lucy | financial |
| Hubby | financial |
| Jonah | clean |
+--------+-----------------+
2.2 左外连接
左外连接返回左表中所有的数据行;对于右表,如果没有匹配的数据,显示为空值。左外连接使用关键字LEFT OUTER JOIN
表示,也可以简写成LEFT JOIN
。
//依旧是查询各个员工属于哪个部门
mysql> select e.name,d.department_name from employee e left join department d on e.department_id=d.deppartment_id;
+----------+-----------------+
| name | department_name |
+----------+-----------------+
| Tom | management |
| Joe | management |
| Jack | develpo |
| John | develpo |
| Donnie | develpo |
| Hark | financial |
| Lucy | financial |
| Hubby | financial |
| Jonah | clean |
| Wangqing | NULL |
+----------+-----------------+
//此时发现Wangqing的部门为空值
是因为查询首先返回左表中的全部数据department表中不存在对应的数据,所以返回空值
2.3 右外连接
右外连接返回右表中所有的数据行;对于左表,如果没有匹配的数据,显示为空值。右外连接使用关键字RIGHT OUTER JOIN
表示,也可以简写成RIGHT JOIN
;
//还是查询各个员工属于哪个部门
mysql> select e.name,d.department_name from employee e right join department d on e.department_id=d.department_id;
+--------+-----------------+
| name | department_name |
+--------+-----------------+
| Tom | management |
| Joe | management |
| Jack | develpo |
| John | develpo |
| Donnie | develpo |
| Hark | financial |
| Lucy | financial |
| Hubby | financial |
| Jonah | clean |
| NULL | guard |
+--------+-----------------+
//这时发现guard部门没有人
2.4 交叉连接
当连接查询没有指定任何连接条件时,就称为交叉连接。交叉连接使用关键字CROSS JOIN
表示,也称为笛卡尔积(Cartesian product)。
两个表的笛卡尔积相当于一个表的所有行和另一个表的所有行两两组合,结果数量为两个表的行数相乘。假如第一个表有 100 行,第二个表有 200 行,它们的交叉连接将会产生 100 × 200 = 20000 行结果。
mysql> select * from employee cross join department ;
+----+----------+--------+---------------+------+---------------+-----------------+--------------------+
| id | name | salary | department_id | age | department_id | department_name | department_manager |
+----+----------+--------+---------------+------+---------------+-----------------+--------------------+
| 1 | Tom | 15000 | 1 | 34 | 1 | management | 1 |
| 1 | Tom | 15000 | 1 | 34 | 2 | develpo | 1 |
| 1 | Tom | 15000 | 1 | 34 | 3 | financial | 2 |
| 1 | Tom | 15000 | 1 | 34 | 4 | clean | 3 |
| 1 | Tom | 15000 | 1 | 34 | 5 | guard | 5 |
| 2 | Joe | 12000 | 1 | 32 | 1 | management | 1 |
| 2 | Joe | 12000 | 1 | 32 | 2 | develpo | 1 |
| 2 | Joe | 12000 | 1 | 32 | 3 | financial | 2 |
| 2 | Joe | 12000 | 1 | 32 | 4 | clean | 3 |
| 2 | Joe | 12000 | 1 | 32 | 5 | guard | 5 |
| 3 | Jack | 10000 | 2 | 36 | 1 | management | 1 |
| 3 | Jack | 10000 | 2 | 36 | 2 | develpo | 1 |
| 3 | Jack | 10000 | 2 | 36 | 3 | financial | 2 |
| 3 | Jack | 10000 | 2 | 36 | 4 | clean | ……………………………………………………………………………………………………………………………………………………………………………………………………………………………………
//查询结果过于庞大,通常情况下不会使用交叉连接
2.5 自连接
自连接(Self join)是指连接操作符的两边都是同一个表,即把一个表和它自己进行连接。自连接本质上并没有什么特殊之处,主要用于处理那些对自己进行了外键引用的表。
//例 查询每个部门由谁来管理
mysql> select d.department_name,e.department_manager from department d join department e on d.department_id=e.department_manager;
+-----------------+--------------------+
| department_name | department_manager |
+-----------------+--------------------+
| management | 1 |
| management | 1 |
| develpo | 2 |
| financial | 3 |
| guard | 5 |
+-----------------+--------------------+
附录
//表创建指令
reate table employee(id int(10) primary key auto_increment,name varchar(20) not null,salary int,department_id int,age int(10));
insert employee(name,salary,department_id,age) values('Tom',15000,1,34),('Joe',12000,1,32),('Jack',10000,2,36),('John',7500,2,28),('Donnie',6000,2,29),('Hark',5000,3,27),('Lucy',4000,3,20),('Hubb'y',4000,3,20),('Jonah',3000,4,40),('Wangqing',1000,10,34);
create table department(department_id int primary key auto_increment,department_name varchar(50) unique,department_manager int);
insert department(department_name,department_manager) values('management',1),('develpo',1),('f),('')inancial',2),('clean',3),('guard',5);
SQL数据库基础中的基础相关推荐
- 先来先服务算法代码_程序员算法与数据结构基础中的基础,栈与递归
在此之前,我们介绍了动态规划.深度优先搜索等基础算法,但是,有部分好友评论说,难度太难了,我们知道动态规划的自顶向下跟深度优先搜索一般都用递归实现,今天我们就先来讲讲算法与数据结构中,基础中的基础递归 ...
- ssm插入数据时候栈溢出_程序员算法与数据结构基础中的基础,栈与递归
在此之前,我们介绍了动态规划.深度优先搜索等基础算法,但是,有部分好友评论说,难度太难了,我们知道动态规划的自顶向下跟深度优先搜索一般都用递归实现,今天我们就先来讲讲算法与数据结构中,基础中的基础递归 ...
- 将sql数据库字段中的NULL都替换为空
NULL与空字符串 '' 是相同的????? 在MySQL中,这两者是完全不同的.NULL是指没有值,而"则表示值是存在的,只不过是个空值.(在Oracle中是相同的) 将sql数据库字段中 ...
- SQL数据库语句中escape的用法及含义
SQL数据库语句中escape的用法及含义 escape是用来转译的 例如: 数据库中有个表 A字段abc 中存du了字符'%',那么我查询的时候如果只想查询第二位是 '%'的记录就需要进行模糊查询, ...
- 关于SQL 数据库表中的聚集索引和非聚集索引等
原文地址:http://www.cppblog.com/zuoyinbo/archive/2008/06/03/52075.html 1.概念 索引是在数据库表或者 ...
- python sql数据库管理系统_【基础】练习册42-Python3_带数据库的学生管理系统
# 学生信息管理系统:显示所有信息.追加信息.删除信息.查询 # 细节:清空控件内容 # 待增加功能:查询增加鼠标事件来进行修改 # Treeview import tkinter as tk imp ...
- 【基础中的基础】引用类型和值类型,以及引用传递和值传递
一直在博客园怼人,非常惭愧.所以郑重决定: 好好写一篇干货,然后再接着怼人. 这是一起帮上陈百万同学的求助,讲了一会之后,我觉得很有些普世价值,干脆就发到园子来.面向小白,高手轻拍. 我们从最简单的说 ...
- python开始之路—基础中的基础
python之路: 基础篇 一.Python 1.python是怎么来的 是在1989年吉多·范罗苏姆,在圣诞节的时候闲着无聊自己用C语言开发的,一个脚本解释程序,作为ABC语言的一种继承. ...
- Java基础中的基础
Java简介 jdk:Java开发工具包 jre:Java运行环境 如果想要运行java程序,只需要jre. 很多java开发的工具,里边自带jre. Java,原来是sun公司开发,后来被oracl ...
最新文章
- [BZOJ 1002] [FJOI 2007] 轮状病毒
- roaringbitmap java,BitMap、RoaringBitmap与JavaEWAH
- 算法设计与分析python_Python算法设计与分析
- c语言调试出错误怎么改,C语言调试常见错误及修改方法(附习题)
- 中国颜色(鼠标双击)
- js判断对象为空_在 JavaScript 中如何检查对象为空
- jquert ajax文件 mvc,jquery ajax file upload NET MVC 无刷新文件上传
- js面向对象编程:命名空间
- Linux下的字符界面扫雷游戏
- 创新课程管理系统——测试心得
- 局域网共享工具_局域网一键共享软件2019最新版
- 详细介绍如何在华为云调用SDK的Python代码(以文字识别OCR技术实现身份证识别为例)
- python种子数是什么意思_Python:随机种子问题
- Wifi 破解原理及教程
- 简单好用的苹果手机软件数据备份软件
- epoch训练时间不同_epoch、batch size和iterations
- C语言实现通过日期计算这是一年中的第几天
- 【shiro基础】springboot + shiro整合thymeleaf
- 通过js实现电灯开关案例
- linux修改禅道端口,CentOS7上安装了gitlab和禅道,改了禅道端口访问不了