黑马SQL笔记 - 基础篇 - 1. SQL

MySQL概述

MySQL启动

net start mysql80
net stopmysql80

MySQL客户端连接

需配置环境变量
增加路径 C:\Program Files\MySQL\MySQL Server 8.0\bin

mysql [-h 127.0.0.1] [-p 3306] -u root -p
mysql -u root -p

图形界面操作

创建数据库
右键‘@localhost’-->new-->scheam

创建表结构
右键表-->new-->table

修改表
右键表-->new-->modify table

用sql语句操作
右键表/数据库-->new-->query console

SQL

DDL语法

数据库操作

# 查询所有数据库
show databases;

# 创建数据库
create database itcsat;

# 创建数据库并指定类型
create database itheima default charset utf8mb4;

# 添加if not exists避免报错(如果已有相同名称数据库会报错)
create database if not exists test;

# 删除数据库
drop database if exists test

# 添加if exists避免报错(如果没有该名称数据库会报错)
drop database if exists test

# 使用itcast数据库
use itcast;

# 查看当前的数据库
select database();

表操作

# 创建新表tb_user
create table tb_user(
    id int comment '编号',
    name varchar(50) comment '姓名',
    age int comment '年龄',
    gender varchar(1) comment '性别'
) comment '用户表';

# 创建新表emp
create table emp(
    id int comment '编号',
    workno varchar(10) comment '工号',
    name varchar(10) comment '姓名',
    gender char(1) comment '性别',
    age tinyint unsigned comment '年龄',
    idcard char(18) comment '身份证号',
    entrydate date comment '入职时间'
) comment '员工表';

# 查看表信息(简略)
desc tb_user;

# 查看表信息(详细)
show create table tb_user;

# 删除表
drop table [ if exists ] 表名;

# 删除指定表并重新创建该表(原来的数据都没了,表结构还在)
truncate table 表名;

表字段操作

# 添加字段nickname
alter table emp add nickname varchar(20) comment '昵称';

# 修改字段的数据类型
alter table 表名 modify 字段名 新数据类型 (长度);

# 修改字段名和其数据类型(旧:nickname,新username)
alter table emp change nickname username varchar(30) comment '昵称';

# 删除字段(删除emp表的username字段)
alter table emp username;

# 修改表名
alter table emp rename to employee;

DML语法

对数据库中表中的数据操作
添加数据

# 给指定字段添加数据
insert into 表名 (字段名1, 字段名2, ...) values (值1, 值2, ...);

# 查看表
select * from employee;

# 给全部字段添加数据
insert into 表名 (值1, 值2, ...)

# 批量添加数据,用逗号连接多个值
insert into employee values(3,'3','韦一笑','男',38,'123456789012345670','2005-01-01'),(4,'4','赵敏','女',18,'123456789012345670','2005-01-01');

修改数据

update 表名 set 字段名1 = 值1 , 字段名2 = 值2 , .... [ where 条件 ] ;

# 修改id为1的数据,将name修改为itheima
update employee set name = 'itheima' where id = 1;

# 修改id为1的数据, 将name修改为小昭, gender修改为 女(逗号连接)
update employee set name = '小昭' , gender = '女' where id = 1;

# 将所有的员工入职日期修改为 2008-01-01
update employee set entrydate = '2008-01-01';

删除数据

delete from 表名 [ where 条件 ] ;

# 删除gender为女的员工
delete from employee  where gender = '女';

# 删除所有员工
delete from employee;

DQL语法

查询数据库中表的记录

# 查询多个字段
select 字段1, 字段2, 字段3 ... from 表名 ;

# 查询所有字段()不推荐
select * from 表名 ;

# 查询字段时可以给字段设置别名(省去as也行)
select 字段1 [ AS 别名1 ] , 字段2 [ AS 别名2 ] ... from 表名;
select 字段1 [ 别名1 ] , 字段2 [ 别名2 ] ... from 表名;

# 去除重复元素
select distinct 字段列表 from 表名;

# 例子
select name,workno,age from emp;
select workaddress as '工作地址' from emp;
select workaddress '工作地址' from emp;
select distinct  workaddress '工作地址' from emp;

条件查询

比较运算符

  • between ... and ... 在某个范围之内(含最小、最大值)
  • in(...) 在in之后的列表中的值,多选一
  • like 占位符 模糊匹配(_匹配单个字符, %匹配任意个字符)

逻辑运算符

  • AND 或 && 且
  • OR 或 || 或
  • NOT 或 ! 非
# 查询年龄小于等于 20 的员工信息
select * from emp where age <= 20;

# 查询没有身份证号的员工信息(null的)
select * from emp where idcard is null;

# 查询有身份证号的员工信息(非null的)
select * from emp where idcard is not null;

# 查询年龄不等于 88 的员工信息
select * from emp where age != 88;
select * from emp where age <> 88;

# 查询年龄在15岁(包含) 到 20岁(包含)之间的员工信息
select * from emp where age >= 15 && age <= 20;
select * from emp where age >= 15 and age <= 20;
select * from emp where age between 15 and 20;

# 查询性别为 女 且年龄小于 25岁的员工信息
select * from emp where gender = '女' and age < 25;

# 查询年龄等于18 或 20 或 40 的员工信息
select * from emp where age = 18 or age = 20 or age =40;
select * from emp where age in(18,20,40);

# 查询姓名为两个字的员工信息(两个下划线)
select * from emp where name like '__';

# 查询身份证号最后一位是X的员工信息
select * from emp where idcard like '%X';
select * from emp where idcard like '_________________X';

聚合函数

  • count 统计数量
  • max
  • min
  • avg 平均值
  • sum
# 统计该企业员工数量
select count(*) from emp;
select count(idcard) from emp; -- 统计的是idcard字段不为null的记录数

# 统计该企业员工的最大年龄
select max(age) from emp;

# 统计西安地区员工的年龄之和
select sum(age) from emp where workaddress = '西安';

分组查询

where与having区别

  • 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤。
  • 判断条件不同:where不能对聚合函数进行判断,而having可以。

执行顺序: where > 聚合函数 > having 。

SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];

# 根据性别分组 , 统计男性员工 和 女性员工的数量
select count(*) from emp group by gender; -- 只要count结果,没有对应男女

# 加上性别字段,能对应上count结果 (count(*) from emp group by gender类似于一个字段)
select gender, count(*) from emp group by gender;

# 根据性别分组 , 统计男性员工 和 女性员工的平均年龄
select  gender, avg(age) from emp group by gender;

# 查询年龄小于45的员工 , 并根据工作地址分组 , 获取员工数量大于等于3的工作地址
select workaddress, count(*) from emp where age < 45 group by workaddress having count(*) > 3;
-- 取别名
select workaddress, count(*) address_count from emp where age < 45 group by workaddress having address_count > 3;

# 统计各个工作地址上班的男性及女性员工的数量
select workaddress, gender, count(*) people_count from emp group by workaddress, gender;

排序查询

排序方式

  • ASC : 升序(默认值)
  • DESC: 降序
select 字段列表 from 表名 order by 字段1 排序方式1 , 字段2 排序方式2 ;

# 根据年龄对公司的员工进行升序排序
select * from emp order by  age asc;

# 根据入职时间, 对员工进行降序排序
select * from emp order by  entrydate desc;

# 根据年龄对公司的员工进行升序排序 , 年龄相同 , 再按照入职时间进行降序排序
select * from emp order by age asc, entrydate desc;

分页查询

  • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。
  • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
select 字段列表 from 表名 limit 起始索引, 查询记录数 ;

# 查询第1页员工数据, 每页展示10条记录
select * from emp limit 0,10;
select * from emp limit 10;

# 查询第2页员工数据, 每页展示10条记录 --------> (页码-1)*页展示记录数
select * from emp limit 10,10;

执行顺序

编写顺序:
select-->from-->where-->group by-->having-->order by-->limit
执行顺序:
from-->where-->group by-->having-->select-->order by-->limit

DCL语法

管理数据库用户、控制数据库的访问权限

用户管理操作

查询用户

use mysql;
select * from mysql.user;
-- Host代表当前用户访问的主机,如果为localhost,仅代表只能够在当前本机访问,是不可以远程访问的。User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯一标识一个用户.

创建用户

CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
-- 创建用户itcast, 只能够在当前主机localhost访问, 密码123456;
create user 'itcast'@'localhost' identified by '123456';
-- 创建用户heima, 可以在任意主机访问该数据库, 密码123456;
create  user 'heima'@'%' identified by '123456';

修改用户密码

ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;
-- 修改用户heima的访问密码为1234;
alter user 'heima'@'%' identified with mysql_native_password by '1234';

删除用户

DROP USER '用户名'@'主机名' ;
-- 删除itcast@localhost用户
drop user 'itcast'@'localhost' ;

权限控制

常用权限

  • ALL, ALL PRIVILEGES(所有权限)
  • SELECT(查询数据)
  • INSERT(插入数据)
  • UPDATE(修改数据)
  • DELETE(删除数据)
  • ALTER(修改表)
  • DROP(删除数据库/表/视图)
  • CREATE(创建数据库/表)

多个权限之间,使用逗号分隔;授权时,数据库名和表名可以使用 * 进行通配,代表所有。

查询权限

SHOW GRANTS FOR '用户名'@'主机名' ;

# 查询 'heima'@'%' 用户的权限
show grants for 'heima'@'%';

授予权限

GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';

# 授予 'heima'@'%' 用户itcast数据库所有表的所有操作权限
grant all on itcast.* to 'heima'@'%';

撤销权限

REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';

# 撤销 'heima'@'%' 用户的itcast数据库的所有权限
revoke all on itcast.* from 'heima'@'%';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容