MySQL入门基础-(简单的数据库操作,表操作,约束,外键约束,子查询)

目录

    • 数据库的一些基本概念
    • MySQL的安装
    • 安装后的配置
    • SQL语句
    • DDL
      • 数据库操作:
      • 表操作
      • 表的约束
    • DQL
      • 最简单的查询
      • 聚合函数
      • Mysql内置函数
        • 表的约束
        • 索引
        • 视图
        • 事务
        • 关系
        • 表的连接
        • 子查询

数据库的一些基本概念

  • 数据库 (Database ,DB)

  • 数据库管理系统(Database Managerment System, DBMS)

    Oracle MySQL, SQL Server , DB2,Access

  • 数据库应用程序( Database apply system ,DBAS)

    应用数据库的程序,基本上都是,如qq

  • 数据库管理员(DBA)

  • 数据库管理系统(DBS)

    数据库+数据库管理系统+数据库应用程序+数据库管理员+最终用户

MySQL的安装

  1. linux 下安装MySQL:
    安装mysql: yum -y install mysql-server
    查看系统的服务: cd /etc/init.d
    启动mysql服务: servicw mysqld start
    随机启动mysql服务:chkconfig mysql on
    查看随机启动的服务:chkconfig --list
    查看系统的启动方式:more /etc/inittab
    2.win 下安装mysql
    包资源: MySQL官网下载(下载的是MSI的包资源,直接进行安装),另外一种安装包archives,在命令行里进行安装。具体安装百度即可。

安装后的配置

  • 安装Navicat for mysql 进行连接服务
    在连接上选择mysql数据库,设置主机地址,默认端口3306,密码进行远程连接mysql服务

  • MySQL默认的编码是希腊的,所以,首先修改编码:
    vi /etc/my.cnf
    添加代码:
    default-character-set=utf-8
    重启服务:
    service mysqld restart
    运行程序:
    mysql -h -u -p
    -h主机IP地址
    -u用户名
    -p回车后输入密码

  • 默认远程不可以访问数据库,可以修改这个设置
    在shell下输入:
    mysql_secure_installation
    进行root密码的修改,打开远程等操作(注意,默认情况下,没有密码,直接回车就可以了
    按照提示进行修改,打开允许远程进行登录服务。
    然后,进入msql :
    mysql -uroot -p
    输入密码
    运行:
    grant all on . to root @’%’ identified by '你设置的登录密码‘
    赋予所有的可以登录的远程主机以root用户身份进行登录,并赋予所有的权限
    win下可以命令行中运行来修改。

    SQL语句

    1. DQL(数据查询语言)
      select
    2. DML(数据操作语言)
      insert,update,delete
    3. DDL(数据库定义语言)
      create, alter, drop
    4. DCL(数据库控制语言)
      grant, revoke
    5. TCL(事物控制语言)
      SAVEPOIONT, ROLLBACK, SET TRANSACTION , COMMIT

    DDL

    数据库操作:

    • 创建数据库
      create database 数据库名字
    • 删除数据库
      drop database 数据库名字
    • 切换数据库
      use 数据库名字
    • 查看当前选择的数据库
      select database()
      数据的备份与恢复:
    • 备份:
      进入C:\Program Files\MySQL\MySQL Server 8.0\bin下(配置了环境变量可以不用)
      运行:mysqldum -uroot -p my_db > d:/my_db_backup.sql
      选择将my_db这个数据库备份到d:/my_da_backuo.sql下
    • 恢复:
      mysql -uroot -p 数据库名字 < d:/my_db_backup.sql
      也可以进入某个数据库之后,执行:
      source d:/my_db_backup.sql

    表操作

    • 创建表
      create table t_admin
      (
      id int primary key,
      aname varchar(5) not null,
      address varchar(255)
      )

    • 删除表:
      drop table t_admin;
      注释:-- 注释内容

    • 显示表的信息:desc t_student;

    • 修改表:
      alter table 表名 add|change|drop|modify 列名 类型;

    • 在t_student 表中添加一个新字段
      alter TABLE t_student add sex int(1) DEFAULT 0;

      -- 在t_student 中修改一个新字段
      ALTER TABLE t_student change sname name VARCHAR(300) not null;
      
      -- 全部字段插入
      INSERT into t_student VALUES(1,'zhangsan','shanghai',1);
      
      -- 选择几个字段插入
      INSERT into t_student (id ,name) VALUES (2,'lisi');
      
      -- 某个字段是自增的
      
      -- 给t_student的id修改为自增的选项
      ALTER table t_student MODIFY id int auto_increment;
      -- 在自增的数据进行填写的时候,可以填入任意数据,会自增
      INSERT into t_student VALUES (0,'wu','beijing',0);
      
      -- 修改某一个数据
      update t_student set address='广州' where id=6;
      -- 删除
      delete from t_student where id = 4;
      

表的约束

MySQL入门基础-(简单的数据库操作,表操作,约束,外键约束,子查询)_第1张图片

主键约束:并不是只有一个字段组成,可以用多个字段组成联合主键
声明方法: id int primary key.
唯一约束: email varchar(255) unique
非空约束:name varchar(255) not null,
检查约束: age number(2) check (age>0 and age <100),
外键约束: foreign key (deptno) references dept(deptno): depto 这个字段是主表dept的deptno列的字段
约束的三种写法:

  1. 直接写在数据的类型面

  2. 写在创建表的下面

    CONSTRAINT titles_ibfk_1 FOREIGN KEY (emp_no) REFERENCES employees (emp_no)
    
  3. 写在表创建完成之后

    alter table t_department add constraint fk_id foreign key (parent_id) references t_department (id);
    

DQL

select

最简单的查询

	use employees;
	select * from dept_manager;
	SELECT dept_no,emp_no FROM dept_manager;
  • 使用算术表达式
    SELECT emp_no,salary*12 FROM salaries LIMIT(100);

  • 使用别名 (as可以省略)
    SELECT emp_no as 员工编号,salary 月薪 from salaries;

  • 去重 DISTINCT
    使用DISTINCT可以使得查询的结果那列元素去除重复行,其作用范围是后面所有字段的组合条件
    SELECT DISTINCT dept_no FROM dept_manager;
    SELECT DISTINCT dept_no ,emp_no FROM dept_manager;

  • 排序 ORDER BY
    使用order by 对自居查询结果进行排序
    升序缺省(asc),降序(desc)

  • 取一定的范围 LIMIT
    LIMIT 设置显示的数据,0表示从第一行,然后分页为10条,limit 1 则表示只取第一个元素
    SELECT * from salaries ORDER BY salary desc LIMIT 0,10;

  • 条件查询 WHERE
    SELECT * from salaries WHERE salary>30000;
    SELECT * from salaries WHERE salary>30000 and salary <38000;

聚合函数

count() max(), min(), sum(),avg()
  • count() 查询总数
    SELECT COUNT(1) from employees;
    SELECT COUNT(DISTINCT emp_no) FROM employees;
  • max()
    SELECT max(salary) FROM salaries;

Mysql内置函数

  • 字符串函数

    • 连接字符串 concat
      SELECT CONCAT(dept_no,‘对应的部门是’,dept_name) FROM departments;

    • 截取字符串 substring
      SELECT SUBSTRING(‘abcdefg’,0,3)

    • 去除空格 rtrim
      SELECT RTRIM(last_name) FROM employees WHERE emp_no = 10001;

  • 日期函数 date
    在数据类型里面,有date :日期,datetime:精确到秒,TIMESTAMP:精确的毫秒,当前时间到1970,1.1日0点的毫秒数

    • DATE_FORMAT(date,format)将日期变成字符串
      SELECT DATE_FORMAT(current_date(),’%年%月%日’);
  • 分组 GROUP BY
    问题出现的时候,就要分组

    • SELECT column,group_function(column) from table [where condition ][group by group ][order by column]
      SELECT dept_name ,salary FROM salaries GROUP BY dept_no ;

    • 存在group by 分组的select的子句,不能写group by没有的字段,除非用在聚合函数

      -- 统计每个部门的人数,最高工资,最低工资,平均工资
      SELECT dept_no count(1),max(salary),min(salary),avg(salary) from salaries GROUP BY dept_no;
      -- 统计每个部门的人数,最高工资,最低工资,平均工资,除了部门8
      SELECT dept_no count(1),max(salary),min(salary),avg(salary) from salaries where dept_no <> 10 GROUP BY dept_no;
      
  • having 等价于where这个条件语句,不过执行顺序在group by 之后

    • sql 的执行顺序: from >where > group by >having >select> order by
      -- 统计每个部门的人数,最高工资,最低工资,平均工资,平均值小于2000的不要
      SELECT dept_no count(1),max(salary),min(salary),avg(salary) from salaries GROUP BY dept_no HAVING avg(sal) >2000
      -- 在emp表中,列出每年的入职人数和最高工资
      -- 在emp表中,列出工资最小值小于2000的职位
      -- 在emp表中,统计人数小于4的部门的平均工资
      -- 统计个部门的最高工资,排除最高工资小于3000的部门
      SELECT count(1), year(hire_date) max(salary) emp GROUP BY year(hire_date)
      SELECT job, min(sal) from emp GROUP BY job HAVING min(sal) <2000;
      SELECT dep_no,avg(salary) FROM emp GROUP BY dept_no HAVING count(1) <4;
      SELECT dept_no,max(salary) FROM emp GROUP BY dept_no HAVING MAX(salary) <3000;
      

表的约束

  • 外键约束的两种形式

    CREATE TABLE t_department
    (
    id int PRIMARY KEY,
    tname VARCHAR(255) not null,
    department_count_max int CHECK (department_count_max >0 and department_count_max <50),
    parent_id int, foreign key (parent_id) references t_department (id)
    	);
    alter table t_department add constraint fk_id foreign key (parent_id) references t_department (id);
    

索引

增快查询速度

– 主键和唯一值会自动创建索引
– 手动创建索引

create index i_emp_ename on emp(ename);
drop INDEX i_emp_ename	

视图

可以隐藏部分数据,是表查询之后的结果
SELECT empo,ename,job from emp;
CREATE VIEW v_emp as SELECT empo,ename,job from emp with read only ;

SELECT * from v_emp;
INSERT into v_emp VALUES (888,'za','clerk')

事务

是一个操作序列,要一整个要么一起成功要么一起失败,保证数据的完整性
采用三个关键字: begin commit rollback

CREATE TABLE t_account
(
id int PRIMARY key,
money DOUBLE 
);

BEGIN;
UPDATE t_account set money = money-100 where id =1;
UPDATE t_account set money = money+100 where id =2;
COMMIT;
-- 操作失败,则选择rollback 回滚操作

关系

通过外键约束,进行建立表之间的关系
- 建立学生表,成绩表,课程表

CREATE TABLE t_student(
id int PRIMARY key,
name VARCHAR(23) not null,
age int 
);

CREATE TABLE t_subject(
id int PRIMARY key,
name VARCHAR(25) not null
);

CREATE TABLE t_score(
id int PRIMARY KEY,
socre int,
s_id int, FOREIGN key (s_id) REFERENCES t_student (id),
sub_id int ,FOREIGN key (sub_id) REFERENCES t_subject (id)
);
  • 一对一 的关联关系,只要想办法让外键字段同时又唯一约束,外键字段字任意的表中
  • 一对多的关系,在多的那张表中增加一个外键字段
  • 多对多 关系,找一个中间表,转化为两个一对多
-- 建立问题,分类,用户,回答之间的关系

CREATE TABLE custom(
id int PRIMARY key ,
name varchar(255)
)
CREATE question(
id int PRIMARY key ,
describle VARCHAR(2000),
qury_id int ,
type varchar(255),
CONSTRAINT fk_1 foreign key (qury_id) REFERENCES custom(id),
CONSTRAINT fk_type foreign key (type) REFERENCES classify(type)
)
create TABLE answer(
id int PRIMARY key,
answer_id int ,
question_id int,
content VARCHAR(5000) not null,
CONSTRAINT fk_2 foreign key (answer_id) REFERENCES custom(id),
CONSTRAINT fk_3 foreign key (question_id) REFERENCES question(id)
)
CREATE TABLE classify(
id int PRIMARY key ,
type VARCHAR(255)
)

表的连接

表的连接:内连接,两种写法

select emp_no,dept_name from departments,dept_emp,employees where dept_emp.dept_no = departments.dept_no limit 0,10;

select emp_no,dept_name from dept_emp inner join departments on dept_emp.dept_no =departments.dept_no LIMIT 0,10;
  • 条件连接

    SELECT emp_no,salary,grade FROM salaries,salary_rank where salaries.salary > salary_rank.min and salaries.salary <salary_rank.max LIMIT 0,100
    
  • 同表数据查询

    SELECT t1.empno ,t1.ename,t2.empo,t2.ename from emp as t1 join emp as t2 on t1.mgr = t2.empno ;
    
  • 多表的数据查询

    SELECT distinct t1.emp_no,concat(last_name,' ',first_name) full_name,title,salary, t1.dept_no,dept_name from dept_emp as t1
    inner join salaries on t1.emp_no = salaries.emp_no
    inner join employees on t1.emp_no = employees.emp_no 
    inner join titles on t1.emp_no = titles.emp_no
    inner join departments  on t1.dept_no = departments.dept_no limit 0,100 ;
    
  • 外连接(左外连接,右外连接,全连接)

    • 左外连接:两个表连接过程中,除满足连接条件的行以外,还返回左表中不满足条件的行,在from 后面接left right full
    • 查询所有部门的名字和该部门下的员工姓名,若该部门没有员工也要列出部门的名字
    • using(字段) 连接的条件,且两个表之间的连接字段名字相同
    SELECT DISTINCT departments.dept_name ,concat(last_name,' ',first_name) full_name FROM dept_emp 
    join departments on dept_emp.dept_no=departments.dept_no -- 把 on开始的换成 USING(dept_no) 等效
    JOIN employees on dept_emp.emp_no=employees.emp_no limit 0,100; 
    

子查询

将查询的结果返回,再继续查询
可以在select from where 中,一般查询要两次以上结果才能完成

  • 查询所有工资高于平均工资的雇员名字和工资

    SELECT ename , sal FROM emp where sal >(SELECT avg(sal) as avg_sal from emp )
    
  • 查询和SCOTT同一部门且比他工资低的雇员名字和工资

    SELECT t1.ename, t1.sal FROM emp as t1 join (SELECT deptno,sal from emp where ename ='scott') as t2 on t1.deptno =t2.deptno and t1.sal <t2.sal 
    
  • 查询的结果试单行单列的可以直接进行<,>的比较

  • 多行的时候,采用,all,any ,in 来比较

    • 查询工资低于任何一个clerk工资的雇员信息

      select * from emp where sal < all(SELECT sal FROM emp where job = 'clerk')
      
    • 查询部分20中职务同部门10的雇员一样的雇员信息
      select * from emp where job in (SELECT job from emp where deptno = 10)

    • 查询每个部分的详细信息平均工资和对应的等级

    SELECT
    			t3.*,
    			t4.* 
    FROM
    			( SELECT t2.*, avg( sal ) AS avg_sal FROM emp t1 RIGHT JOIN dept t2 USING ( deptno ) GROUP BY deptno ) AS t3
    			LEFT JOIN salgrade t4 ON t3.avg_sal BETWEEN t4.losal 
    			AND t4.hisal;
    
    • 查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息
    select emp.* FROM empo JOINSELECT job ,hire_date empo where ename = 'SCOTT') as t1 on empo.job = t2.job and empo.hire_date <t2.hire_date;
    SELECT avg(sal) sal,depno  FROM emp GROUP BY depno order by sal ;
    SELECT sal FROM enp where job = 'cleck' ORDER BY DESC sal ; 
    

你可能感兴趣的:(数据库)