samdung 发表于 2018-10-3 11:24:18

mysql 基础学习

  mysqloracleDB2SQL-SERVER
  安装提供数据库服务的软件包
  # rpm -qa | grep mysql
  mysql-5.0.77-4.el5_4.2 工具包
  mysql-server-5.0.77-4.el5_4.2 提供服务的主包
  服务名称mysqld
  进程名称mysqld
  进程运行的所有者是mysql帐号
  使用的传输协议tcp
  默认监听端口 3306
  启动数据库服务
  #/etc/init.d/mysqld start/restart/stop/status
  主配置文件/etc/my.cnf
  访问数据库服务 (要输入正确的用户名和密码 才可以访问)
  默认情况下只允许使用数据库管理员从数据库服务器本机登录
  数据库管理员 名字 叫root 且密码默认为空
  # /etc/init.d/mysqld status
  mysqld (pid 6331) is running...
  登录数据库服务器
  # mysql -h数据库服务器的Ip地址-u登录用户名 -p密码
  # mysql -hlocalhost -uroot -p
  Enter password:
  Welcome to the MySQL monitor.Commands end with ; or \g.
  Your MySQL connection>
  Server version: 5.0.77 Source distribution
  Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
  mysql>quit; 退出登录
  #mysql
  mysql> select user(); 查看当前登录用户信息 那个用户从那登录的
  +----------------+
  | user()         |
  +----------------+
  | root@localhost |
  +----------------+
  mysql> select database(); 查看登录后 所在的数据库是那个
  +------------+
  | database() |
  +------------+
  | NULL       | 表示登录的用户没有使用任何一个库
  +------------+
  1 row in set (0.00 sec)
  mysql> show databases; 查看当前数据库服务器上已有的库 默认有3个初始库
  +--------------------+
  | Database         |
  +--------------------+
  | information_schema | 虚拟库不占用磁盘空间 数据存放在内存里 服务器的参数信息
  | mysql            | 授权库
  | test               | 公共库
  +--------------------+
  库操作
  建库 (数据库名具有唯一性 库名区分大小些 不能用纯数字
  给数据库命名 不要用特殊字符 关键子 )
  create database 数据库名;
  drop database数据库名;(如果库里有表也同时被删除了)
  use 数据库名;切换数据库
  表操作(表是存放在数据库里的 同一个库里表名不能相同)
  mysql> show tables; 查看当前所在的库里有那些表
  建表
  create table 表名(
  [(宽度) 约束条件],
  [(宽度) 约束条件],
  [(宽度) 约束条件],
  [(宽度) 约束条件]
  );
  mysql> create table gamet(         
  -> gamename char(3),
  -> sex char,
  -> level tinyint
  -> );
  Query OK, 0 rows affected (0.00 sec)
  mysql> desc gamet; 查看表结构(向表里插入记录时 要和字段的类型 约束条件匹配 才能插入记录成功)
  字段名字    字段的类型 是否为空 索引 字段默认值描述
  +----------+------------+------+-----+---------+-------+
  | Field    | Type       | Null | Key | Default | Extra |
  +----------+------------+------+-----+---------+-------+
  | gamename | char(3)    | YES|   | NULL    |       |
  | sex      | char(1)    | YES|   | NULL    |       |
  | level    | tinyint(4) | YES|   | NULL    |       |
  +----------+------------+------+-----+---------+-------+
  insert into 表名(字段名1,字段名2,字段名n)
  values
  (字段1的值,字段2的值,字段n的值),
  (字段1的值,字段2的值,字段n的值),
  (字段1的值,字段2的值,字段n的值);
  xmysql> insert into gamet(gamename,sex,level)
  -> values
  -> ("swk","b",300),
  -> ("shs","b",250),
  -> ("zbj","b",250),
  -> ("ts","b",0);
  查看表记录
  mysql> select 字段名列表 from 表名;
  * 代表表里的所有字段
  mysql> select level,gamename from gamet;
  mysql> select * from gamet;
  +----------+------+-------+
  | gamename | sex| level |
  +----------+------+-------+
  | swk      | b    |   127 |
  | shs      | b    |   127 |
  | zbj      | b    |   127 |
  | ts       | b    |   0 |
  +----------+------+-------+
  无符号
  mysql> create table t2( name char(3), level tinyintunsigned );
  字段类型
  数值类型
  整数类型 (工龄 年龄)
  浮点类型(有小数位 10.88) 工资 身高 体重
  gz_tab
  name
  gz float(7,2)             10000.00
  99999.99
  100000.00
  mysql> create table gz_t(
  -> name char(3),   
  -> gz float(7,2)
  -> );
  字符类型(255)
  char 定长字符   name char(3)   tom jimyy y
  varchar变长字符 name varchar(3) tom yy
  ageint(3)   99999 9999
  111 111 1111
  mysql> create table t4( name char(1), age int(4) zerofill );
  日期类型(生日 上班时间 工作年份) now() 获取完整时间的函数
  year年    date 日期   time 时间   datetime 日期时间
  2012      2012-09-03   09:30   2012-09-03 09:30:00
  01-6920
  70-9919
  00   0000
  name
  jobday   year
  birthdaydate
  workstart time
  workstartday datetime
  mysql> create table t5(
  -> name varchar(10),jim
  -> jobday year,       2009
  -> birthdaydate,    1988-10-9
  -> workstart time,    10:30
  -> workstartday datetime); 2009-09-10 8:00
  ql> insert into t5 values("tom",now(),now(),now(),now());
  mysql> insert into t5 values("lsy",2009,19900909,093000,20091018093000);
  mysql> insert into t5 values("lsy",2009,"19900909","093000","20091018093000");
  mysql> delete from t5; 删除表里的所有记录
  表名
  mysql> drop table t2;
  表名删除表
  枚举类型(字段的值要在给定的范围内选择)
  enum 只能在给定的范围内选择一个值
  set在给定的范围内可以选一个或多个值
  性别enum("男","女","保密")
  爱好set("look“,"film",“game”,“muisc")
  namevarchar(10)
  sex   enum("boy","gril","no")
  lovesset("look“,"film",“game”,“muisc")
  mysql> create table gamedb.t6(
  -> name varchar(10),
  -> sex enum("boy","gril","no"),
  -> loves set("book","film","music","football")
  -> );
  mysql> insert into t6 values("jim",'boy','book');
  mysql> insert into t6 values("tom",'boy',"film,music");
  约束条件
  null是否允许字段值为null(空) 默认允许为null
  not null不允许为空
  key   索引字段 主键 外键 索引(index unique)
  default 字段的默认值 默认的默认值是Null
  插入记录时不给字段赋值时使用字段的默认值给字段赋值
  default 值 (值的类型 要和字段类型匹配)
  Extra描述信息
  mysql> create table t7(
  -> name varchar(10) not null,
  -> sex enum("boy","gril") not null default "boy",   
  -> age int(2) not null default 23,
  -> loves set("a","b","c","d") not null default "a,b"
  -> );
  mysql> delete from t4 where age is NULL;
  指定的字段没有值
  在studb库里 创建 stuinfo表 字段如下
  姓名 字符类型 不允许为空 名字的最大长度是10个字符 变长
  性别 默认是 boy不允许为空 可选范围只能是在 boygril 里选
  年龄 不允许为空默认24 是tinyint类型 且不允许 存负数
  爱好不允许为空 默认爱好 football book可以有多个爱好
  生日   不允许为空
  上课时间不允许为空
  出生年份不允许为空
  专业不允许为空 默认是 network 单选(dbashelloscnetwork)
  成绩数值类型 100分 不允许为空 默认 60分
  修改表结构         表名
  mysql>>
  动作
  add   添加字段 (用add新添加的字段会按照添加的顺序追加在已有字段                   的下方)
  mysql>>
  -> add name char(10) not null,
  -> add age int(3) not null default 19;
  first 添加字段时,把新添加的字段放在所有已有字段的上方
  mysql>>
  after 字段名 添加字段时,把新字段添加在指定字段的下方
  mysql>>
  modify修改字段类型 和 约束条件
  mysql>>
  change修改字段名 和 修改字段类型、约束条件
  源   新   
  mysql>>
  mysql>>
  drop    删除字段             字段名
  mysql>>
  mysql>>
  更新表中的记录
  表名   字段名=值列表      条件表达式
  mysql> update test1 set name="tom"   whereid=2;
  mysql> update test1 set>
  给表重命名
  mysql>>
  mysql>>
  复制表                     复制源表的那些数据
  mysql> create table 新表名select * from stuinfo;
  mysql> create table stuinfobak select * from stuinfo; 复制源表所有数据
  mysql> create table stuinfo_1 select>
  只复制源表的表结构(源表 表结构中key字段的属性不会同步给新表)                                          
  mysql> create table gnome_stuinfo select * from stuinfo where 1=2 ;
  不成立的条件
  练习
  按如下表结构建表
  mysql> desc stuinfo;
  +-------+------------------------------+------+-----+---------+-------+
  | Field | Type                         | Null | Key | Default | Extra |
  +-------+------------------------------+------+-----+---------+-------+
  |>
  | name| varchar(10)                  | NO   |   | NULL    |       |
  | loves | set('book','film','network') | NO   |   | book    |       |
  | age   | tinyint(2) unsigned          | NO   |   | 23      |       |
  +-------+------------------------------+------+-----+---------+-------+
  4 rows in set (0.00 sec)
  修改stuinfo表的表结构 要求如下
  1 删除id字段
  2 添加address字段放在所有字段的下方 变长字符类型 宽度是60 不允许为空
  3 在name字段下方添加名为sex的字段 枚举类型 字段的值只能在boy或girl
  内选择某一个 不允许为空 字段的默认值是boy
  4 在所有字段的上方添加stu_id 整形不允许为空
  5 将loves字段改名为likes
  可选值的范围改为set('book','film','network','music','football') 不允许为空
  默认值改为 book 和 football
  6 向表内插入10条记录
  7 将stuinfo表改名为tea_tab
  表结构中的key(索引)
  索引 相当于书的目录
  好处 会加快select速度
  坏处 减慢insertupdate delete 的速度   
  index (标记 MUL ) 索引 字段值可以重复 且会把字段值按顺序排序
  建表时 就指定 那个字段是index字段
  mysql> create table t1(
  -> stu_id int(3) not null,
  -> name varchar(10) not null,
  -> age int(3) not null,
  -> index(name)   #指定表中的name字段为index字段
  -> );
  把已存在的表中的某个字段设置为索引字段
  mysql> create index 索引名 on 表名(字段名);
  mysql> desc t2;
  +--------+-------------+------+-----+---------+-------+
  | Field| Type      | Null | Key | Default | Extra |
  +--------+-------------+------+-----+---------+-------+
  | stu_id | int(3)      | NO   |   | NULL    |       |
  | name   | varchar(10) | NO   |   | NULL    |       |
  | age    | int(3)      | NO   |   | NULL    |       |
  +--------+-------------+------+-----+---------+-------+
  3 rows in set (0.00 sec)
  mysql> create index name on t2(name);
  Query OK, 0 rows affected (0.00 sec)
  Records: 0Duplicates: 0Warnings: 0
  mysql> desc t2;
  +--------+-------------+------+-----+---------+-------+
  | Field| Type      | Null | Key | Default | Extra |
  +--------+-------------+------+-----+---------+-------+
  | stu_id | int(3)      | NO   |   | NULL    |       |
  | name   | varchar(10) | NO   | MUL | NULL    |       |
  | age    | int(3)      | NO   |   | NULL    |       |
  +--------+-------------+------+-----+---------+-------+
  3 rows in set (0.00 sec)
  删除表中字段的索引属性
  mysql> show index from 表名;显示指定表的索引信息
  mysql> drop index 索引名 on 表名;
  unique (UNI) 索引 字段值不可以重复 且会把字段值按顺序排序
  mysql> create table t4(
  stu_id int(3) not null,
  name varchar(10),
  age int(3) not null,
  unique(name)
  );
  mysql> drop index name on t4;
  mysql> create unique index stuid on t4(stu_id);
  primary key 主键 只能把表中的一个字段设置为primary key
  字段的值也不可以重复 如果要把一个表里的多个字段
  都设置为primary key字段
  多个字段同时作primary key 是叫符合主键(要在建表之初一起指定)
  mysql> create table t5(>
  -> namevarchar(10) not null,
  -> age int(2) not null,
  -> index(name)
  -> );
  mysql> create table t5(
  ->>
  -> name char(3) not null,
  -> age int(3),
  -> primary key(id)
  -> );
  把已有表里的某个字段设置为主键盘字段
  mysql>>
  mysql>>
  mysql> desc t7;
  +-------+---------+------+-----+---------+----------------+
  | Field | Type    | Null | Key | Default | Extra          |
  +-------+---------+------+-----+---------+----------------+
  |>
  | name| char(3) | YES|   | NULL    |                |
  +-------+---------+------+-----+---------+----------------+
  2 rows in set (0.01 sec)
  mysql>>
  mysql>>
  复合主机
  ser_access
  hostip   ser_nameser_porta_status enum('allow','deny') default "deny"
  primarykey         primarykey
  mysql> create table ser_access(
  -> hostip varchar(15) not null,
  -> ser_name varchar(15) not null,
  -> ser_port varchar(5) not null,
  -> a_stuatus enum('allow','deny') not null default "deny",
  -> primary key(hostip,ser_port)
  -> );
  mysql> select * from ser_access;
  +---------+----------+----------+-----------+
  | hostip| ser_name | ser_port | a_stuatus |
  +---------+----------+----------+-----------+
  | 1.1.1.1 | vsftpd   | 21       | allow   |
  | 1.1.1.1 | named    | 53       | allow   |
  +---------+----------+----------+-----------+
  *当表中有复合主键时 只要复合主键的值 不同时重复就可以插入记录
  foreign key 外键 (要在表中设置外键字段 当前表的存储引擎要是innodb才行)
  子表外键字段的值 要参考父表外键字段的值
  存储引擎 执行sql语句一段代码 不同存储引擎存储数据的方式
  和功能都不相同
  默认mysqld数据库服务使用的存储引擎是myisam存储引擎
  查看数据库服务器当前使用的存储引擎
  mysql> show variables like "table_type";
  +---------------+--------+
  | Variable_name | Value|
  +---------------+--------+
  | table_type    | MyISAM |
  +---------------+--------+
  mysql> show create table t1;   看建表过程
  建表是指定表使用的存储引擎
  mysql> create table t9(
  ->>
  -> )engine=innodb;   存储引擎
  修改表的存储引擎
  mysql>>
  表名
  设置数据库服务器默认使用的存储引擎vim /etc/my.cnf
  vim/etc/my.cnf
  
  default-storage-engine=innodb
  :wq
  # service mysqld restart
  在表中建外键字段
  1 表使用的存储引擎要是innodb
  2 外键字段的类型要匹配
  3 作外键的字段要是primary key 或 index 属性
  yg_tab
  yg_idprimary key auto_increment员工编号
  name
  mysql> create table keydb.yg_tab(
  yg_id int(3) primary key auto_increment,
  name varchar(10)
  )engine=innodb;
  gz_tab
  >
  gz_id 员工编号 index
  gz    float(7,2)
  mysql> create table gz_tab(>
  gz_id int(3) not null,
  gz float(7,2),
  index(gz_id),
  foreign key(gz_id) references yg_tab1(yg_id) on update cascade
  on delete cascade)engine=innodb;
  说明
  foreign key(当前表的字段名) references 父表名(父表里的字段名)
  on update cascade子表与父表同步更新
  on delete cascade子表与父表同步删除
  数据的导入
  数据的导出
  查询
  用户权限
  数据备份与恢复
  binlog日志
  AB复制
  读写分离
  mysql集群
  搭建LAMP

页: [1]
查看完整版本: mysql 基础学习